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

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ プログラミング » HTTP Web サービス » HTTP Web サービスの例 » チュートリアル:Visual C# を使用した SOAP/DISH Web サービスへのアクセス

 

レッスン 2:Web サーバと通信するための Visual C# アプリケーションの作成

このレッスンでは、Web サーバと通信するための Visual C# アプリケーションを作成します。

前提条件

このレッスンは、レッスン 1 で説明したように Web サーバが設定されていることを前提としています。レッスン 1:SOAP 要求を受信し SOAP 応答を送信する Web サーバの設定を参照してください。

このレッスンを終了するには、最新バージョンの Visual Studio が必要です。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:Visual C# を使用した SOAP/DISH Web サービスへのアクセス

内容と備考

このレッスンには、localhost への複数の参照が含まれています。Web クライアントを Web サーバと同じコンピュータで実行していない場合は、localhost の代わりにレッスン 1 の Web サーバのホスト名または IP アドレスを使用します。

この例では、.NET Framework 2.0 の機能を使用しています。

 ♦ タスク
  1. Visual Studio を起動します。

  2. 新しい Visual C# Windows フォームのアプリケーションプロジェクトを作成します。

    空のフォームが表示されます。

  3. オブジェクトに Web 参照を追加します。

    1. [プロジェクト] » [サービス参照の追加] をクリックします。

    2. [サービス参照の追加] ウィンドウで、[詳細] をクリックします。

    3. [サービス参照設定] ウィンドウで、[Web 参照の追加] をクリックします。

    4. [Web 参照の追加] ウィンドウで、[URL] フィールドに http://localhost:8082/demo/SASoapTest_DNET と入力します。

    5. [移動] (または緑の矢印) をクリックします。

      Visual Studio に、SASoapTest_DNET サービスから使用できる EmployeeList メソッドが表示されます。

    6. [参照の追加] をクリックします。

      Visual Studio は、localhost[ソリューション エクスプローラー] ウィンドウ枠のプロジェクト Web リファレンスに追加します。

  4. Web クライアントアプリケーションに適したオブジェクトを空のフォームに移植します。

    フォームが次の図のようになるように、[ツールボックス] ウィンドウ枠から ListBox オブジェクトと Button オブジェクトをフォームにドラッグし、テキスト属性を更新します。

    デモ用の SOAP フォーム。
  5. Web 参照にアクセスするプロシージャを作成し、使用可能なメソッドを使用します。

    Employee List ボタンをダブルクリックし、ボタンクリックイベントに次のコードを追加します。



    int sqlCode;
    
    listBox1.Items.Clear();
    
    localhost.SASoapTest_DNET proxy = new localhost.SASoapTest_DNET();
    DataSet results = proxy.EmployeeList(out sqlCode);
    DataTableReader dr = results.CreateDataReader();
    
    listBox1.BeginUpdate();
    while (dr.Read())
    {
        for (int i = 0; i < dr.FieldCount; i++)
        {
            string dataTypeName = dr.GetDataTypeName(i);
            string dataName = dr.GetName(i);
            System.Type ftype = dr.GetFieldType(i);
            System.TypeCode typeCode = System.Type.GetTypeCode(ftype);
    
            string columnName = "(" + dataTypeName + ")" + dataName + "=";
    
            if (dr.IsDBNull(i))
            {
                listBox1.Items.Add(columnName + "(null)");
            }
            else
            {
                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;
                    default:
                        listBox1.Items.Add(columnName + "(unsupported)");
                        break;
                }
            }
        }
        listBox1.Items.Add("");
    }
    listBox1.EndUpdate();
    dr.Close();
  6. アプリケーションを実行します。

    [デバッグ] » [デバッグの開始] をクリックします。

  7. Web データベースサーバと通信します。

    Employee List をクリックします。

    ListBox オブジェクトに、EmployeeList 結果セットが「(型)名=値」のペアで表示されます。次の出力は、ListBox オブジェクトでのエントリの表示方法を示します。



    (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=NY
    (String)Country=USA
    (String)PostalCode=02192
    (String)Phone=6175553985
    (String)Status=A
    (String)SocialSecurityNumber=017349033
    (Decimal)Salary=$45,700.00
    (DateTime)StartDate=8/28/1984 12:00:00 AM
    (DateTime)TerminationDate=(null)
    (DateTime)BirthDate=6/5/1958 12:00:00 AM
    (Boolean)BenefitHealthInsurance=True
    (Boolean)BenefitLifeInsurance=True
    (Boolean)BenefitDayCare=False
    (String)Sex=F

    Salary の値は、クライアントの通貨フォーマットに変換されます。

    日付が格納され時刻がない値には、時刻に 00:00:00 つまり午前 0 時が割り当てられます (クライアントのロケール設定によって異なる形式で表示される)。

    NULL が格納された値は、DataTableReader.IsDBNull メソッドを使用してテストされます。

結果

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</StartDate>
 <BirthDate>1958-06-05</BirthDate>
 <BenefitHealthInsurance>1</BenefitHealthInsurance>
 <BenefitLifeInsurance>1</BenefitLifeInsurance>
 <BenefitDayCare>0</BenefitDayCare>
 <Sex>F</Sex>
 </row>

前のレッスンで DATATYPE ON 句が指定されたため、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' />

日付だけが格納されたカラムは、XML 応答で yyyy-mm-dd のようにフォーマットされます。

時刻だけが格納されたカラムは、XML 応答で hh:mm:ss.nnn-HH:MM または hh:mm:ss.nnn+HH:MM のようにフォーマットされます。ゾーンオフセット (-HH:MM または +HH:MM) は文字列のサフィックスとして付きます。

日付と時刻の両方が格納されたカラムは、XML 応答で yyyy-mm-ddThh:mm:ss.nnn-HH:MM または yyyy-mm-ddThh:mm:ss.nnn+HH:MM のようにフォーマットされます。日付と時刻は、文字 T で区切られます。ゾーンオフセット (-HH:MM または +HH:MM) は文字列のサフィックスとして付きます。

日付、時刻、タイムゾーンオフセットが格納されたカラムは、XML 応答で yyyy-mm-ddThh:mm:ss.nnn-HH:MM または yyyy-mm-ddThh:mm:ss.nnn+HH:MM のようにフォーマットされます。日付と時刻は、文字 T で区切られます。ゾーンオフセット (-HH:MM または +HH:MM) は文字列のサフィックスとして付きます。

太平洋タイムゾーンで実行されているサーバのいくつかの例について、以下に説明します。

<ADate>2013-01-27</ADate>
<ATime>12:34:56.000-08:00</ATime>
<ADateTime>2013-01-27T12:34:56.000-08:00</ADateTime>
<ADateTimeWithZone>2013-01-27T12:34:56.000+06:00</ADateTimeWithZone>

これらの日付と時刻が .NET アプリケーションで表示される形式は、クライアントのタイムゾーンとロケール設定によって異なります。次は、米国ロケールの東部タイムゾーンにあるクライアントの例です (今日の日付が 2013 年 1 月 28 日と仮定する)。

(DateTime)ADate=1/27/2013 12:00:00 AM 
(DateTime)ATime=1/28/2013 3:34:56 PM
(DateTime)ADateTime=1/27/2013 3:34:56 PM
(DateTime)ADateTimeWithZone=1/27/2013 1:34:56 AM

TypeCode 列挙には別の日付と時刻はなく、TypeCode.DateTime のみがあります。このため、すべての結果に日付と時刻の両方が含まれます。

これらの日付と時刻の XML 応答でのデータタイプ情報については、以下に説明します。

<xsd:element name='ADate' minOccurs='0' type='xsd:date' />
<xsd:element name='ATime' minOccurs='0' type='xsd:time' />
<xsd:element name='ADateTime' minOccurs='0' type='xsd:dateTime' />
<xsd:element name='ADateTimeWithZone' minOccurs='0' type='xsd:dateTime' />