WebService

(1)接口使用说明:

  • 调用接口的前置准备:

    1. 获取接口部署的IP地址(URL),为项目添加Web引用
    2. 使用Using指令集,为当前CS文件中添加Web引用
    using Test.WebRerence11;
    
    1. 声明成员变量WebService(类作为成员变量)
    private Service webService
    
    1. 初始化WebService对象
    webService = new Service();
    
    1. 调用WebService中提供的方法(接口)
  • 无记录返回值的接口调用(Update、InSert、Delect):

    无记录返回值,则可以直接调用WebService接口中的方法,一般情况下,参数是接口中要求的正确类型,SQL语句都可以执行成功。

  • 有记录返回值的接口调用(Select):

    WebService的默认Web协议要求我们返回序列化的数据,因此在WebService的接口调用SQL语句,从数据库中获取数据后,要对数据进行序列化处理,但C#中无序列化数据类型,因此在C#窗体中调用接口,获取接口从数据库中获取加工后的序列化数据后,要正常使用必须先进行反序列化处理.

    • 序列化概述:序列化是将对象转换为可传输或可存储的格式(如XML、JSON等)的过程。在C#中,可以使用序列化技术将对象转化为字节流或字符串,以便在网络传输或持久化存储时使用。序列化处理有如下好处

      1. 跨平台和跨语言:WebService是一种基于标准协议(如SOAP)的远程调用技术,可以在不同的平台和使用不同编程语言的系统之间进行通信。序列化的数据可以以统一的格式进行传输,使得不同平台和语言能够正确解析和处理数据。
      2. 可扩展性:通过序列化数据,可以将复杂的对象转化为简单的数据格式(如XML或JSON),使得数据的结构和内容更易于扩展和修改。当接口返回的数据需要增加或修改字段时,只需要对序列化的数据进行相应的调整,而不需要修改接口的返回类型。
      3. 安全性:序列化的数据可以进行加密和签名,提供更高的数据安全性。通过序列化,可以在数据传输过程中对数据进行加密,防止数据被篡改或窃取。
      4. 网络传输效率:序列化的数据通常是以字节流或字符串的形式在网络上传输,相比直接传输对象,可以减少数据的大小,提高网络传输的效率。
    • 序列化概述:反序列化的主要目的是将序列化的数据转化为可操作的对象,以便我们可以直接访问和使用其中的属性和方法。通过反序列化,在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 控件上显示数据
        

(2)接口1:

第一次写正式应用中的接口,且是第一次认识合适以范围查询的SQL语句,花的实际比较久,1~2h .

  • 接口名称:FuzzySearch1

  • 接口描述:查询数据库TJMES的InStorageSum表,根据一下字段进行模糊查询(五个字段均为参数),返回查询到的所有记录

  • 接口方法:

    • 参数:

      • string ProductNum: 产品品号,数据表中对应的字段为[产品品号]
      • string ProductName: 产品品名,数据库中对应的字段为[产品品名]
      • string IndateStartStr:入库日期下限,数据表中对应的字段为[入库日期]
      • string IndateStartEnd:入库日期上限,数据表中对应的字段为[入库日期]
      • string Location:储位,数据表中对应的字段为[储位]
    • 返回值:

      • 模糊查询参数对应的所有记录

(3)接口2:

第二次写接口,这个接口与第一个接口及其相似,在GPT的帮助下,不到5分钟就完成了.

  • 接口名称:FuzzySearch2

  • 接口描述:查询数据库TJMES的InStorage表,根据一下字段进行模糊查询(八个字段均为参数),返回查询到的所有记录

  • 接口方法:

    • 参数:
      • string ProductSN:产品SN,数据表中对应的字段为[产品SN]
      • string ProductNum: 产品品号,数据表中对应的字段为[产品品号]
      • string ListOrder:工单号,数据表中对应的字段为[工单号]
      • string PalletNum:栈板号,数据表中对应的字段为[栈板号]
      • string ProductName: 产品品名,数据表中对应的字段为[产品品名]
      • string IndateStartStr:入库日期下限,数据表中对应的字段为[入库日期]
      • string IndateStartEnd:入库日期上限,数据表中对应的字段为[入库日期]
      • string Location:储位,数据表中对应的字段为[储位]
    • 返回值:
      • 模糊查询参数对应的所有记录

(4)示例Demo:

  • 调用WebService的CRUD窗体的完整Demo:
//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);
            }
        }
    }
}

(5)使用WebService与直接访问对比:

  • 图片说明:PDA(Win CE 5.0)必须使用WebService,其他的桌面端应用选用WebService.

  • C#窗体中使用WebService作为中间层与数据库进行交互和C#窗体直接与数据库进行交互有各自的优缺点。下面是对比它们的主要优缺点:

C#窗体中使用WebService作为中间层与数据库进行交互的优点:

  1. 松耦合:通过使用WebService作为中间层,窗体应用程序与数据库之间可以解耦,使得系统更加灵活和可扩展。
  2. 安全性:通过WebService提供的安全机制,可以保护数据的安全性和完整性。
  3. 跨平台、跨语言:WebService使用标准的HTTP和XML协议,可以在不同平台和不同编程语言之间进行通信,实现系统之间的互操作性。
  4. 可重用性:通过WebService,可以将常用的功能和服务封装成服务接口,供多个应用程序共享和复用,提高开发效率和代码复用性。

C#窗体中使用WebService作为中间层与数据库进行交互的缺点:

  1. 性能开销:由于WebService使用HTTP协议和XML格式进行通信,相比直接与数据库交互,性能开销较大,会增加系统的响应时间和网络带宽的消耗。
  2. 开发复杂性:使用WebService需要额外编写和维护服务接口和服务端代码,增加了开发的复杂性和工作量。
  3. 依赖网络:使用WebService进行通信需要依赖网络连接,如果网络不稳定或中间层出现故障,会影响系统的可用性和稳定性。

C#窗体直接与数据库进行交互的优点:

  1. 性能高:直接与数据库交互可以减少中间层的开销,提高系统的响应速度和性能。
  2. 简单易用:不需要额外的中间层代码和维护,开发和维护成本较低。

C#窗体直接与数据库进行交互的缺点:

  1. 耦合度高:窗体应用程序直接与数据库进行交互,耦合度较高,系统的可扩展性和灵活性较差。
  2. 安全性较低:直接与数据库交互可能存在安全风险,需要额外的安全措施来保护数据的安全性。
  3. 平台和语言限制:直接与数据库交互可能受限于特定的数据库平台和编程语言,不利于跨平台和跨语言的开发。

综上所述,选择使用哪种方式取决于具体的应用场景和需求。如果需要灵活性、安全性和跨平台性,可以选择使用WebService作为中间层与数据库进行交互。如果对性能要求较高,且对可扩展性和灵活性要求较低,可以选择直接与数据库进行交互。

你可能感兴趣的:(TG企业系统开发,数据库,开发语言,c#,web3,服务器)