C#调用WebService实现区域卫生平台数据接口上传
2018-01-15刘德军
刘德军
摘 要: Webservice,又名Web服务,它是一种Web应用程序,是自包含、自描述、模块化的应用,可以在网络中被描述、发布、查找以及通过Web来调用,它是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得WebService能与其他兼容的组件进行互操作。
Webservice具有平台无关性,编程语言无关性等特性。它可以被.net,java,delphi,powerbuilder,vc,c++,jbuilder等开发工具或语言所调用。本文通过C#调用WebService成功实现区域卫生平台数据接口上传。
关键词: WebService;区域卫生平台;接口;上传
前提条件
1、接口文档:本例中使用的是根据《江苏省健康信息平台共享数据集(医疗+公共卫生部分)2018版V2.02》修订的接口文档。
2、网络连通:要求医疗单位保证数据上传程序所在机器与数据中心机房网络的畅通。
需求
要求接口完成如下需求:1、每日产生的数据上传到区域卫生平台;2、自动定时执行;3、记录传送入参和返回结果到日志文件中。
接口文件内容说明
1、服务名称:VKT_UploadService
2、接口地址:http://192.168.21.4:87/VKT_UploadService.asmx?wsdl
3、入参及出参(略)
过程分析
1、完成数据集的对照,即完成药品、诊疗以及其他数据与本院数据的对照工作;
2、引用WebService服务;
3、创建每个业务所需的SQL语句,并构建入参;
4、执行上传操作。
详细步骤
1、建立C#应用程序
2、添加WebService服务:在“项目”菜单中选择“添加服务引用(S)…”,弹出“添加服务引用”对话框,在“地址”中填入接口地址,点击“前往”,系统会在服务栏加载对应的项目,并在备注中显示“在地址“http://192.168.21.4:87/VKT_UploadService.asmx?wsdl”处找到1个服务”,命名空间设置为:ServiceReference1,点“确定”完成设置。如图1示:
图1
图2
3、数据对照(略)。
4、界面控件定义
建立界面如图2,控件参数见下表。
表1
5、详细代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 区域卫生平台接口.ServiceReference1;
using System.IO;
//变量定量
public string LogStr = "";//日志变量
public Int32 DTransSuccess = 0;//上傳成功
public Int32 DTransFail = 0;//上传失败
string Lstr1="";//格式一头
string Lstr2="";//格式一尾
string Lstr3="";//格式二外头
string Lstr4="";//格式二外中
string Lstr5="";//格式二内头
string Lstr6="";//格式二内尾
string Lstr7="";//格式二内部一
string Lstr8="";//格式二内部二
区域卫生平台接口.ServiceReference1.VKT_UpBusinessDataFromHosSoapClient myService = null;
//格式一: [适用于无主从关系的记录] StrInit(string Vid, string Vstr)
//格式二: [适用于主从关系的记录] StrInitSub(string Vid, string Vstr0),略
//定义门急诊挂号信息函数UP_registerrecord(),共25个入参,略
//执行上传,并将相关内容保存到日志文件中
private void button1_Click(object sender, EventArgs e)
{
string jsonStr;
jsonStr = this.textBox1.Text;
LogStr=DateTime.Now.ToString() + ",上传区域卫生平台数据内容如下:"+this.textBox1.Text+"。\r\n";
string Tmpstr;
Tmpstr = myService.VKT_UploadService(jsonStr);//执行上传
LogStr = LogStr + DateTime.Now.ToString() + ",返回结果如下:" + Tmpstr + "。\r\n";
Tmpstr =Tmpstr.Replace("\\r\\n", "\r\n").Replace("\\", "").Replace("\"", "");
if (Tmpstr.Contains("success: 1"))
{
DTransSuccess++;//判断成功则计数加1
}
else
{
DTransFail ++; //判断失败则计数加1
}
this.richTextBox1.Text= Tmpstr;
WriteLog(LogStr, (this.dtTpStart.Value.Date == this.dtTpEnd.Value.Date) ? this.dtTpStart.Value.ToShortDateString() + "_" + DateTime.Today.ToShortDateString().ToString() + ".log" : this.dtTpStart.Value.ToShortDateString() + "_" + this.dtTpEnd.Value.ToShortDateString() + "_" + DateTime.Today.ToShortDateString().ToString() + ".log");//写日志
LogStr = "";
}
//写日志文件
private void WriteLog(string Wstr,string strFilePath)
{
string Current;
Current = Directory.GetCurrentDirectory();//获取当前根目录
strFilePath = Current + "\\QYWSPT" +strFilePath;
System.IO.FileStream fs = new System.IO.FileStream(strFilePath, System.IO.FileMode.Append);
System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default);
sw.WriteLine( Wstr);
sw.Close();
fs.Close();
}
//生成门急诊挂号信息并执行上传
private void button2_Click(object sender, EventArgs e)
{
DTransSuccess = 0;
DTransFail = 0;
OleDbConnection connORCL = new OleDbConnection(Properties.Settings.Default.connectionORCLString);//调Settings.settings 中的connectionORCLString对应的连接字符串
string mySelectQuery = Properties.Settings.Default.Str0201;//调Settings.settings 中的Str0201對应的SQL语句
mySelectQuery = String.Format(@mySelectQuery, this.dtTpStart.Value.ToShortDateString(), this.dtTpEnd.Value.ToShortDateString());
OleDbConnection myConnection = new OleDbConnection(Properties.Settings.Default.connectionORCLString);
OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection);
myConnection.Open();
OleDbCommand oledbcom = new OleDbCommand(mySelectQuery, myConnection);
DataSet ds1 = new DataSet();
OleDbDataAdapter adp = new OleDbDataAdapter(oledbcom);
adp.Fill(ds1, "srctable");
if (ds1.Tables["srctable"].Rows.Count > 0) //如果查询记录数>0
{
this.toolStripProgressBar1.Value = 0;
StrInit("0201", "registerrecord");
int x = 1;
toolStripStatusLabel1.Text = "共" + ds1.Tables[0].Rows.Count.ToString().Trim() + "条记录。";
this.toolStripProgressBar1.Minimum = 0;
this.toolStripProgressBar1.Maximum = ds1.Tables[0].Rows.Count;
this.toolStripProgressBar1.Step = 1;
foreach (DataRow dw in ds1.Tables[0].Rows) //遍历每一行数据
{
int Cnum = ds1.Tables[0].Columns.Count;//取查询总列数
string[] Vstr = new string[Cnum];
//取当前行中的每一列数据存到Vstr数组中
for (Int32 i = 0; i <= Cnum - 1; i++)
{
Vstr[i] = dw.ItemArray[i].ToString();
}
}
//构建字符串,并调用UP_registerrecord函数
this.textBox1.Text = Lstr1 + "\r\n{\r\n";
this.textBox1.Text = this.textBox1.Text + UP_registerrecord(Vstr[0], Vstr[1], Vstr[2], Vstr[3], Vstr[4], Vstr[5], Vstr[6], Vstr[7], Vstr[8], Vstr[9], Vstr[10], Vstr[11], Vstr[12], Vstr[13], Vstr[14], Vstr[15], Vstr[16], Vstr[17], Vstr[18], Vstr[19], Vstr[20], Vstr[21], Vstr[22], Vstr[23], Vstr[24]);
this.textBox1.Text = this.textBox1.Text + "\r\n}\r\n" + Lstr2;
button1.PerformClick(); //调用上传按钮事件执行上传
this.toolStripProgressBar1.Value++;
toolStripStatusLabel1.Text = "共" + ds1.Tables[0].Rows.Count.ToString().Trim() + "条记录。正在上传第" + x.ToString().Trim() + "个患者记录,成功:" + DTransSuccess.ToString().Trim() + "个,失败:" + DTransFail.ToString().Trim() + "个。";
x++;
this.Refresh();
}
}
else
{
toolStripStatusLabel1.Text = "沒有记录。";
}
myConnection.Close();//关闭数据库连接
myConnection.Dispose();
DTransSuccess = 0;
DTransFail = 0;
}
2、生成可执行文件
在C#编译生成可执行文件,该文件位于当前工程目录bin\Debug下,若要定时执行,可在“任务计划”中添加任务计划,定时执行即可(注意执行完成后要将程序退出)。
总结
本文中采用WebService实现区域卫生平台数据接口上传功能,在实际开发过程中要注意以下几点:1、需要増加try…catch…异常捕获,以免程序异常报错;2、对于有主从结构的数据,可以按照先遍历主表,再根据主表的主键值,遍历从表的数据,最终生成主从结构的上传字符串,本例中不再赘述;3、为方便用户进行后期修改,本例中将SQL和连接字符串放在Settings.setting中作为可修改内容,具体文件为对应Debug目录中的“区域卫生平台接口.exe.config ”文件中;4、本系统在Windows XP SP3 + Microsoft Visual Studio 2010+ORACLE 10g环境下调试通过。
参考文献
[1]宋智军 邱仲潘,Visual C#2010从入门到精通,电子工业出版社,2011.1.
[2]蔡月茹 柳西玲,Web Service基础教程,清华大学出版社,2005..6.