Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere Web 服务

 

教程:将数据类型与 Microsoft .NET 一起使用

以下教程演示了使用 Visual C# 时如何从 Microsoft .NET 中使用所支持的 SQL Anywhere Web 服务数据类型。

♦  创建 SOAP 和 DISH 服务
  1. 在命令提示符处,运行以下命令以启动个人 Web 服务器。将 samples-dir 替换为示例数据库的实际位置。-xs http(port=80) 选项会告知数据库服务器接受来自端口 80 的请求。如果在端口 80 上已有 Web 服务器在运行,则将另一个端口号(如 8080)用于本教程。

    dbeng11 -xs http(port=80) samples-dir\demo.db
  2. 启动 Interactive SQL。以 DBA 身份连接到 SQL Anywhere 示例数据库。执行以下语句:

    1. 定义一个列出 Employees 表的 SOAP 服务。

      CREATE SERVICE "SASoapTest/EmployeeList"
      TYPE 'SOAP'
      AUTHORIZATION OFF
      SECURE OFF
      USER DBA
      DATATYPE OUT
      AS SELECT * FROM Employees;

      在此示例中,指定了 DATATYPE OUT 以生成 XML 结果集响应中的数据类型信息。来自 Web 服务器的响应片段如下所示。请注意,该类型信息与数据库列的数据类型相匹配。

      <xsd:element name='EmployeeID' minOccurs='0' type='xsd:int' />
      <xsd:element name='ManagerID' minOccurs='0' type='xsd:int' />
      <xsd:element name='Surname' minOccurs='0' type='xsd:string' />
      <xsd:element name='GivenName' minOccurs='0' type='xsd:string' />
      <xsd:element name='DepartmentID' minOccurs='0' type='xsd:int' />
      <xsd:element name='Street' minOccurs='0' type='xsd:string' />
      <xsd:element name='City' minOccurs='0' type='xsd:string' />
      <xsd:element name='State' minOccurs='0' type='xsd:string' />
      <xsd:element name='Country' minOccurs='0' type='xsd:string' />
      <xsd:element name='PostalCode' minOccurs='0' type='xsd:string' />
      <xsd:element name='Phone' minOccurs='0' type='xsd:string' />
      <xsd:element name='Status' minOccurs='0' type='xsd:string' />
      <xsd:element name='SocialSecurityNumber' minOccurs='0' type='xsd:string' />
      <xsd:element name='Salary' minOccurs='0' type='xsd:decimal' />
      <xsd:element name='StartDate' minOccurs='0' type='xsd:date' />
      <xsd:element name='TerminationDate' minOccurs='0' type='xsd:date' />
      <xsd:element name='BirthDate' minOccurs='0' type='xsd:date' />
      <xsd:element name='BenefitHealthInsurance' minOccurs='0' type='xsd:boolean' />
      <xsd:element name='BenefitLifeInsurance' minOccurs='0' type='xsd:boolean' />
      <xsd:element name='BenefitDayCare' minOccurs='0' type='xsd:boolean' />
      <xsd:element name='Sex' minOccurs='0' type='xsd:string' />
    2. 创建一个 DISH 服务以充当 SOAP 服务的代理并生成 WSDL 文档。

      CREATE SERVICE "SASoapTest_DNET"
      TYPE 'DISH'
      GROUP "SASoapTest"
      FORMAT 'DNET'
      AUTHORIZATION OFF
      SECURE OFF
      USER DBA;

      SOAP 和 DISH 服务必须为 DNET 格式。在本示例中,创建 SOAP 服务时省略了 FORMAT 子句。这样,SOAP 服务将从 DISH 服务继承 DNET 格式。

  3. 启动 Microsoft Visual Studio。请注意,本示例使用 .NET Framework 2.0 中的函数。

    1. 使用 Visual C# 新建一个 [Windows Application] 项目。

      将出现一个空的窗体。

    2. 从 [Project] 菜单中,选择 [Add Web Reference]。

    3. 在 [Add Web Reference] 页面的 [URL] 字段中,输入以下 URL: http://localhost:80/demo/SASoapTest_DNET.

    4. 单击 [Go]。

      此时显示可供用于 SASoapTest_DNET 的方法的列表。您将看到 EmployeeList 方法。

    5. 单击 [Add Reference] 完成操作。

      [Solution Explorer] 窗口即会显示新的 Web 引用。

    6. 在 Visual Studio [Toolbox] 中,向窗体添加一个列表框和一个按钮,如下图所示。

      SOAP 演示窗体。
    7. 将按钮文本重命名为 Employee List

    8. 双击 [Employee List],然后为按钮的 click 事件添加以下代码。

      int sqlCode;
      
      listBox1.Items.Clear();
      
      localhost.SASoapTest_DNET proxy = new localhost.SASoapTest_DNET();
      
      DataSet results = proxy.EmployeeList(out sqlCode);
      DataTableReader dr = results.CreateDataReader();
      while (dr.Read())
      {
        for (int i = 0; i < dr.FieldCount; i++)
        {
          string columnName = "(" + dr.GetDataTypeName(i) 
                            + ")" 
                            + dr.GetName(i);
          if (dr.IsDBNull(i))
          {
            listBox1.Items.Add(columnName + "=(null)");
          }
          else {
            System.TypeCode typeCode = 
                System.Type.GetTypeCode(dr.GetFieldType(i));
            switch (typeCode)
            {
              case System.TypeCode.Int32:
                Int32 intValue = dr.GetInt32(i);
                listBox1.Items.Add(columnName + "=" 
                    + intValue);
                break;
              case System.TypeCode.Decimal:
                Decimal decValue = dr.GetDecimal(i);
                listBox1.Items.Add(columnName + "=" 
                    + decValue.ToString("c"));
                break;
              case System.TypeCode.String:
                string stringValue = dr.GetString(i);
                listBox1.Items.Add(columnName + "=" 
                    + stringValue);
                break;
              case System.TypeCode.DateTime:
                DateTime dateValue = dr.GetDateTime(i);
                listBox1.Items.Add(columnName + "=" 
                    + dateValue);
                break;
              case System.TypeCode.Boolean:
                Boolean boolValue = dr.GetBoolean(i);
                listBox1.Items.Add(columnName + "=" 
                    + boolValue);
                break;
              case System.TypeCode.DBNull:
                listBox1.Items.Add(columnName 
                    + "=(null)");
                break;
              default:
                listBox1.Items.Add(columnName 
                    + "=(unsupported)");
                break;
            }
          }
        }
        listBox1.Items.Add("");
      }
      dr.Close();

      此示例旨在说明应用程序开发人员可以对可用的数据类型信息进行精细控制。

    9. 构建并运行程序。

来自 Web 服务器的 XML 响应包括已设置格式的结果集。已设置格式的结果集的第一行如下所示。

<row>
 <EmployeeID>102</EmployeeID>
 <ManagerID>501</ManagerID>
 <Surname>Whitney</Surname>
 <GivenName>Fran</GivenName>
 <DepartmentID>100</DepartmentID>
 <Street>9 East Washington Street</Street>
 <City>Cornwall</City>
 <State>NY</State>
 <Country>USA</Country>
 <PostalCode>02192</PostalCode>
 <Phone>6175553985</Phone>
 <Status>A</Status>
 <SocialSecurityNumber>017349033</SocialSecurityNumber>
 <Salary>45700.000</Salary>
 <StartDate>1984-08-28-05:00</StartDate>
 <TerminationDate xsi:nil="true" />
 <BirthDate>1958-06-05-05:00</BirthDate>
 <BenefitHealthInsurance>1</BenefitHealthInsurance>
 <BenefitLifeInsurance>1</BenefitLifeInsurance>
 <BenefitDayCare>0</BenefitDayCare>
 <Sex>F</Sex>
</row>

有关 XML 结果集响应的几点注意事项。

列表框将以 (type)column name=value 对的形式显示 EmployeeList 结果集。处理结果集第一行的结果如下所示。

(Int32)EmployeeID=102
(Int32)ManagerID=501
(String)Surname=Whitney
(String)GivenName=Fran
(Int32)DepartmentID=100
(String)Street=9 East Washington Street
(String)City=Cornwall
(String)State=New York
(String)Country=USA
(String)PostalCode=02192
(String)Phone=6175553985
(String)Status=A
(String)SocialSecurityNumber=017349033
(String)Salary=$45,700.00
(DateTime)StartDate=28/08/1984 0:00:00 AM
(DateTime)TerminationDate=(null)
(DateTime)BirthDate=05/06/1958 0:00:00 AM
(Boolean)BenefitHealthInsurance=True
(Boolean)BenefitLifeInsurance=True
(Boolean)BenefitDayCare=False
(String)Sex=F

有关结果的几点注意事项。