Автор: Grasshopper Jun Источник: Blog Hall
Давайте сначала посмотрим на фрагмент кода WEB-сервиса.
[Веб-метод]
общедоступная таблица данных GetInfo()
...{
OleDbConnection nwindConn = новый OleDbConnection(
"Поставщик=Microsoft.Jet.OLEDB.4.0;" +
"Источник данных=D:\Northwind\northwind.mdb;");
OleDbCommand selectCMD =
new OleDbCommand("ВЫБРАТЬ CustomerID, CompanyName FROM Customers"
, нвиндконн);
selectCMD.CommandTimeout = 30
OleDbDataAdapter custDA = новый OleDbDataAdapter ();
custDA.SelectCommand = selectCMD
DataSet custDS = новый DataSet();
custDA.Fill(custDS, "Клиенты");
вернуть custDS.Tables[0];
}
В .net 1.1 это типичная ошибка. В .net 1.1 и 1.0 возвращаемые или входные параметры веб-службы не могут быть DataTable. Это хорошо известный момент. Причина в том, что DataTable не поддерживает сериализацию, как DataSet. В .net 1.1 наш способ решить эту проблему — использовать DataSet. Но при использовании DataSet часто возникает ощущение перебора.
Вложение: Использование DataTable в качестве возвращаемого значения веб-службы в .net 1.1 сообщит о следующем исключении:
член System.ComponentModel.MarshalByValueComponent.Site типа System.ComponentModel.ISite является интерфейсом, поэтому его нельзя сериализовать.
В .net 2.0 тот же код, что выше, работает без проблем. Причина в том, что DataTable в версии 2.0 реализует сериализацию и десериализацию.
В документации VS2005 Beta2 мы видим, что DataTable в 2.0 реализует следующие интерфейсы:
Явные реализации интерфейса.
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 реализовал только один интерфейс:
явные реализации интерфейса.
System.ComponentModel.IListSource.ContainsListCollection
перемещает некоторые функции из DataSet в DataTable. В версии 2.0 также имеется метод Merge, который объединяет несколько наборов данных.
Для объединения кода DataTable см. код ниже.
частная статическая пустота DemonstrateMergeTable()
...{
DataTable table1 = новый DataTable("Элементы");
DataColumn columns1 = новый DataColumn("id", typeof(System.Int32));
DataColumn columns2 = новый DataColumn("элемент", typeof(System.Int32));
таблица1.Столбцы.Добавить(столбец1);
table1.Columns.Add(column2);
table1.PrimaryKey = новый DataColumn[] ... {column1 };
table1.RowChanged += новая строка System.Data.DataRowChangeEventHandler(Row_Changed)
;
для (int я = 0; я <= 3; я++)
...{
строка = таблица1.Новаястрока();
строка["id"] = я;
строка["элемент"] = я;
таблица1.Rows.Add(строка);
}
//Принимаем изменения.
Таблица1.ПринятьИзменения();
Таблица Данных2 = таблица1.Клон();
строка = таблица2.Новая строка();
строка["id"] = 14;
строка["элемент"] = 774;
table2.Rows.Add(строка);
строка = table2.NewRow();
строка["id"] = 12;
строка["элемент"] = 555;
table2.Rows.Add(строка);
строка = table2.NewRow();
строка["id"] = 13;
строка["элемент"] = 665;
table2.Rows.Add(row);
// Объединяем таблицу2 с таблицей1.
таблица1.Объединить(таблица2);
}
Подводя итог вышесказанному, DataTable в .net 2.0 изменился с неизвестного солдата на заднем плане на главного генерала.