著者:バッタジュン 出典:ブログ館
まずはWEBサービスのコードを見てみましょう。
[ウェブメソッド]
パブリック DataTable GetInfo()
...{
OleDbConnection nwindConn = 新しい OleDbConnection(
"プロバイダー=Microsoft.Jet.OLEDB.4.0;" +
"データ ソース=D:\Northwind\northwind.mdb;")
;
new OleDbCommand("顧客から顧客ID、会社名を選択"
、nwindConn);
selectCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA.SelectCommand = selectCMD
custDS = new DataSet();
custDA.Fill(custDS, "顧客");
custDS.Tables[0] を返します。
、
これは典型的なエラーです。.net 1.1 および 1.0 では、WEB サービスの戻りパラメータまたは入力パラメータを DataTable にすることはできません。これはよく知られている知識ポイントです。その理由は、DataTable が DataSet のようなシリアル化をサポートしていないためです。 .net 1.1 では、この問題を解決する方法は DataSet を使用することです。しかし、DataSet を使用する場合、やりすぎ感を感じることがよくあります。
添付: .net 1.1 で WEB サービスの戻り値として DataTable を使用すると、次の例外が報告されます。
System.ComponentModel.ISite 型のメンバー System.ComponentModel.MarshalByValueComponent.Site はインターフェイスであるため、シリアル化できません。
.net 2.0 では、上記と同じコードが問題なく動作します。その理由は、2.0 の DataTable がシリアル化と逆シリアル化を実装しているためです。
VS2005 Beta2 のドキュメントでは、2.0 の DataTable が次のインターフェイスを実装していることがわかります。
明示的なインターフェイスの実装
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerializable.GetSchema
System.Xml.Serialization.IXmlSerializable.ReadXml
System.Xml.Serialization.IXmlSerializable.WriteXml
1.1 では、DataTable は 1 つのインターフェイスのみを実装しました:
明示的なインターフェイス実装
System.ComponentModel.IListSource.ContainsListCollection は
、DataSet の一部の関数を DataTable に移動します。2.0 には、複数のデータ セットをマージする Merge メソッドもあります。
DataTableのコードマージについては、以下のコードを参照してください。
プライベート静的 void DemonstrateMergeTable()
...{
DataTable table1 = new DataTable("Items");
DataColumn column1 = new DataColumn("id", typeof(System.Int32));
DataColumn column2 = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(column1);
table1.Columns.Add(column2);
table1.PrimaryKey = 新しい DataColumn[] ...{ 列 1 };
table1.RowChanged += 新しい System.Data.DataRowChangeEventHandler(Row_Changed)
;
for (int i = 0; i <= 3; i++)
...{
行 = table1.NewRow();
行["id"] = i;
行["項目"] = i;
table1.Rows.Add(行);
}
//変更を受け入れます。
table1.AcceptChanges();
DataTable table2 = table1.Clone();
行 = table2.NewRow();
行["id"] = 14;
行["項目"] = 774;
table2.Rows.Add(row);
行 = table2.NewRow();
行["id"] = 12;
行["項目"] = 555;
table2.Rows.Add(row);
行 = table2.NewRow();
行["id"] = 13;
行["アイテム"] = 665;
table2.Rows.Add(row);
// table2 を table1 にマージします。
テーブル1.マージ(テーブル2);
要約
すると、.net 2.0 の DataTable は、背景にいる無名の兵士から担当の将軍に変わりました。