调用接口的前置准备:
- 获取接口部署的IP地址(URL),为项目添加Web引用
- 使用Using指令集,为当前CS文件中添加Web引用
using Test.WebRerence11;
- 声明成员变量WebService(类作为成员变量)
private Service webService
- 初始化WebService对象
webService = new Service();
- 调用WebService中提供的方法(接口)
无记录返回值的接口调用(Update、InSert、Delect):
无记录返回值,则可以直接调用WebService接口中的方法,一般情况下,参数是接口中要求的正确类型,SQL语句都可以执行成功。
有记录返回值的接口调用(Select):
WebService的默认Web协议要求我们返回序列化的数据,因此在WebService的接口调用SQL语句,从数据库中获取数据后,要对数据进行序列化处理,但C#中无序列化数据类型,因此在C#窗体中调用接口,获取接口从数据库中获取加工后的序列化数据后,要正常使用必须先进行反序列化处理.
序列化概述:序列化是将对象转换为可传输或可存储的格式(如XML、JSON等)的过程。在C#中,可以使用序列化技术将对象转化为字节流或字符串,以便在网络传输或持久化存储时使用。序列化处理有如下好处:
- 跨平台和跨语言:WebService是一种基于标准协议(如SOAP)的远程调用技术,可以在不同的平台和使用不同编程语言的系统之间进行通信。序列化的数据可以以统一的格式进行传输,使得不同平台和语言能够正确解析和处理数据。
- 可扩展性:通过序列化数据,可以将复杂的对象转化为简单的数据格式(如XML或JSON),使得数据的结构和内容更易于扩展和修改。当接口返回的数据需要增加或修改字段时,只需要对序列化的数据进行相应的调整,而不需要修改接口的返回类型。
- 安全性:序列化的数据可以进行加密和签名,提供更高的数据安全性。通过序列化,可以在数据传输过程中对数据进行加密,防止数据被篡改或窃取。
- 网络传输效率:序列化的数据通常是以字节流或字符串的形式在网络上传输,相比直接传输对象,可以减少数据的大小,提高网络传输的效率。
序列化概述:反序列化的主要目的是将序列化的数据转化为可操作的对象,以便我们可以直接访问和使用其中的属性和方法。通过反序列化,在C#窗体中调用接口获取数据后,我们可以将WebService返回的数据转化为C#中的数据类型,并直接使用这些对象进行后续的数据处理和操作。
反序列化通用代码:
//手工写的一个名为“DeserializeDataTable”的一个参数的反序列化方法 private DataTable DeserializeDataTable(string xml) { XmlSerializer serializer = new XmlSerializer(typeof(DataTable)); // 创建 XmlSerializer 对象,用于反序列化 XML 数据为 DataTable using (StringReader reader = new StringReader(xml)) // 使用 StringReader 将 xml 字符串转换为流 { return (DataTable)serializer.Deserialize(reader); // 反序列化流中的 XML 数据为 DataTable } }
//调用手写反序列化方法,将正常的C#数据(DataTable)绑定到dataGrid中 DataTable dataTable = DeserializeDataTable(result); // 调用自定义的DeserializeDataTable方法,反序列化返回的 XML 数据为 DataTable dataGrid1.DataSource = dataTable; // 将 DataTable 绑定到 dataGrid1 控件上显示数据
第一次写正式应用中的接口,且是第一次认识合适以范围查询的SQL语句,花的实际比较久,1~2h .
接口名称:FuzzySearch1
接口描述:查询数据库TJMES的InStorageSum表,根据一下字段进行模糊查询(五个字段均为参数),返回查询到的所有记录
接口方法:
参数:
返回值:
第二次写接口,这个接口与第一个接口及其相似,在GPT的帮助下,不到5分钟就完成了.
接口名称:FuzzySearch2
接口描述:查询数据库TJMES的InStorage表,根据一下字段进行模糊查询(八个字段均为参数),返回查询到的所有记录
接口方法:
//Home.CS
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Test.WebReference11; // 引入 Web Service 的命名空间
namespace Test
{
public partial class Test : Form
{
private Service webService; // Web Service 对象
public Test()
{
InitializeComponent();
// 初始化 Web Service 对象
webService = new Service();
// 设置窗体的KeyPreview属性为true
this.KeyPreview = true;
}
private void button1_Click(object sender, EventArgs e)
{
Select from1 = new Select(); // 创建 Select 窗体对象
from1.ShowDialog(); // 显示 Select 窗体
}
private void button3_Click(object sender, EventArgs e)
{
string code = textBox1.Text; // 获取文本框中的代码
webService.DeleteData(code); // 调用 Web Service 的方法删除数据
MessageBox.Show("删除成功!!"); // 显示删除成功的消息框
}
private void button4_Click(object sender, EventArgs e)
{
this.Close(); // 关闭当前窗体
}
private void button2_Click(object sender, EventArgs e)
{
string code = textBox1.Text; // 获取文本框中的代码
string num = textBox2.Text; // 获取文本框中的数量
try
{
webService.AddData(code, num); // 调用 Web Service 的方法添加数据
MessageBox.Show("入库成功!"); // 显示入库成功的消息框
}
catch (Exception ex)
{
MessageBox.Show("入库失败:" + ex.Message); // 显示入库失败的消息框
}
}
private void Test_KeyDown(object sender, KeyEventArgs e)
{
// 键盘按下事件的处理
// 判断按下的键是否为数字键"f11"
if (e.KeyCode == Keys.F11)
{
// 触发button1的Click事件
button1_Click(sender, e);
}
}
}
}
//Select.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Test.WebReference11;
using System.Xml.Serialization;
using System.IO;
namespace Test
{
public partial class Select : Form
{
private Service webService; // Web Service 对象
public Select()
{
InitializeComponent();
webService = new Service();
LoadData();
}
private void LoadData()
{
try
{
string result = webService.GetAllData(); // 调用 Web Service 的 GetAllData 方法获取数据
DataTable dataTable = DeserializeDataTable(result); // 调用自定义的DeserializeDataTable方法,反序列化返回的 XML 数据为 DataTable
dataGrid1.DataSource = dataTable; // 将 DataTable 绑定到 dataGrid1 控件上显示数据
}
catch (Exception ex)
{
MessageBox.Show("获取数据失败:" + ex.Message);
}
}
private DataTable DeserializeDataTable(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(DataTable)); // 创建 XmlSerializer 对象,用于反序列化 XML 数据为 DataTable
using (StringReader reader = new StringReader(xml)) // 使用 StringReader 将 xml 字符串转换为流
{
return (DataTable)serializer.Deserialize(reader); // 反序列化流中的 XML 数据为 DataTable
}
}
private void Select_Load(object sender, EventArgs e)
{
textBox1.Focus();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
string code = textBox1.Text; // 获取输入的code值
string result = webService.SelectOne(code); // 调用WebService的SelectOne方法查询特定Code的数据
DataTable dataTable = DeserializeDataTable(result); // 反序列化返回的XML数据为DataTable
dataGrid1.DataSource = dataTable; // 更新dataGrid1显示查询到的数据
}
catch (Exception ex)
{
MessageBox.Show("查询数据失败:" + ex.Message);
}
}
}
}
图片说明:PDA(Win CE 5.0)必须使用WebService,其他的桌面端应用选用WebService.
C#窗体中使用WebService作为中间层与数据库进行交互和C#窗体直接与数据库进行交互有各自的优缺点。下面是对比它们的主要优缺点:
C#窗体中使用WebService作为中间层与数据库进行交互的优点:
- 松耦合:通过使用WebService作为中间层,窗体应用程序与数据库之间可以解耦,使得系统更加灵活和可扩展。
- 安全性:通过WebService提供的安全机制,可以保护数据的安全性和完整性。
- 跨平台、跨语言:WebService使用标准的HTTP和XML协议,可以在不同平台和不同编程语言之间进行通信,实现系统之间的互操作性。
- 可重用性:通过WebService,可以将常用的功能和服务封装成服务接口,供多个应用程序共享和复用,提高开发效率和代码复用性。
C#窗体中使用WebService作为中间层与数据库进行交互的缺点:
- 性能开销:由于WebService使用HTTP协议和XML格式进行通信,相比直接与数据库交互,性能开销较大,会增加系统的响应时间和网络带宽的消耗。
- 开发复杂性:使用WebService需要额外编写和维护服务接口和服务端代码,增加了开发的复杂性和工作量。
- 依赖网络:使用WebService进行通信需要依赖网络连接,如果网络不稳定或中间层出现故障,会影响系统的可用性和稳定性。
C#窗体直接与数据库进行交互的优点:
- 性能高:直接与数据库交互可以减少中间层的开销,提高系统的响应速度和性能。
- 简单易用:不需要额外的中间层代码和维护,开发和维护成本较低。
C#窗体直接与数据库进行交互的缺点:
- 耦合度高:窗体应用程序直接与数据库进行交互,耦合度较高,系统的可扩展性和灵活性较差。
- 安全性较低:直接与数据库交互可能存在安全风险,需要额外的安全措施来保护数据的安全性。
- 平台和语言限制:直接与数据库交互可能受限于特定的数据库平台和编程语言,不利于跨平台和跨语言的开发。
综上所述,选择使用哪种方式取决于具体的应用场景和需求。如果需要灵活性、安全性和跨平台性,可以选择使用WebService作为中间层与数据库进行交互。如果对性能要求较高,且对可扩展性和灵活性要求较低,可以选择直接与数据库进行交互。