我們先看一段WEB Service的代碼
[WebMethod]
public DataTable GetInfo()
{
OleDbConnection nwindConn = new OleDbConnection(
Provider=Microsoft
Jet
OLEDB
;
+
Data Source=D:\\Northwind\\northwind
mdb;
);
OleDbCommand selectCMD =
new OleDbCommand(
SELECT CustomerID
CompanyName FROM Customers
nwindConn);
selectCMD
CommandTimeout =
;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA
SelectCommand = selectCMD;
DataSet custDS = new DataSet();
custDA
Fill(custDS
Customers
);
return custDS
Tables[
];
}
中
這是典型的一個錯誤
中
WEB Service 的返回或者輸入參數不能是 DataTable
這是一個眾人皆知的知識點
原因就是 DataTable 不象DataSet那樣支持序列化
中
我們解決這個問題的方法就是使用DataSet
但是使用DataSet 的時候
經常會有一種殺雞用牛刀的感覺
附
中使用DataTable作為WEB Service 返回值會報以下異常
類型 System
ComponentModel
ISite 的成員 System
ComponentModel
MarshalByValueComponent
Site 是接口
因此無法將其序列化
中
以上同樣的代碼
則沒有任何問題了
原因是
中 DataTable實現了序列化
反序列
在VS
Beta
的文檔中
我們可以看到
中 DataTable實現了以下接口
Explicit Interface Implementations
System
ComponentModel
IListSource
get_ContainsListCollection
System
ComponentModel
IListSource
GetList
System
Xml
Serialization
IXmlSerializable
GetSchema
System
Xml
Serialization
IXmlSerializable
ReadXml
System
Xml
Serialization
IXmlSerializable
WriteXml
而在
中
DataTable 只實現了一個接口
Explicit Interface Implementations
System
ComponentModel
IListSource
ContainsListCollection
把DataSet中的一些功能移到 DataTable中
中還有 Merge 方法
即合並數個數據集
DataTable的代碼合並參看下面代碼
private static void DemonstrateMergeTable()
{
DataTable table
= new DataTable(
Items
);
DataColumn column
= new DataColumn(
id
typeof(System
Int
));
DataColumn column
= new DataColumn(
item
typeof(System
Int
));
table
Columns
Add(column
);
table
Columns
Add(column
);
table
PrimaryKey = new DataColumn[]
{ column
};
table
RowChanged += new System
Data
DataRowChangeEventHandler(Row_Changed);
DataRow row;
for (int i =
; i <=
; i++)
{
row = table
NewRow();
row[
id
] = i;
row[
item
] = i;
table
Rows
Add(row);
}
// Accept changes
table
AcceptChanges();
DataTable table
= table
Clone();
row = table
NewRow();
row[
id
] =
;
row[
item
] =
;
table
Rows
Add(row);
row = table
NewRow();
row[
id
] =
;
row[
item
] =
;
table
Rows
Add(row);
row = table
NewRow();
row[
id
] =
;
row[
item
] =
;
table
Rows
Add(row);
// Merge table
into the table
table
Merge(table
);
}
綜合上述
中 DataTable 從後台的默默無問的小兵變成獨當一面的大將了
From:http://tw.wingwit.com/Article/program/net/201311/13425.html