المؤلف: Grasshopper Jun المصدر: Blog Hall
دعونا نلقي نظرة أولاً على جزء من كود خدمة الويب.
[طريقة ويب]
DataTable العامة GetInfo()
...{
OleDbConnection nwindConn = OleDbConnection الجديد(
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"مصدر البيانات=D:\Northwind\northwind.mdb;");
OleDbCommand تحديدCMD =
new OleDbCommand("حدد معرف العميل، اسم الشركة من العملاء"
، nwindConn)؛
SelectCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA.SelectCommand = SelectCMD;
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
إرجاع custDS.Tables[0];
}
في .net 1.1، يعد هذا خطأ نموذجيًا في .net 1.1 و1.0، لا يمكن أن تكون معلمات الإرجاع أو الإدخال الخاصة بخدمة WEB هي DataTable. وهذه نقطة معرفة معروفة. والسبب هو أن DataTable لا يدعم التسلسل مثل DataSet. في .net 1.1، طريقتنا لحل هذه المشكلة هي استخدام DataSet. ولكن عند استخدام DataSet، غالبًا ما يكون هناك شعور بالمبالغة.
المرفق: سيؤدي استخدام DataTable كقيمة الإرجاع لخدمة WEB في .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، والذي يدمج عدة مجموعات من البيانات.
لدمج التعليمات البرمجية لـ DataTable، يرجى الرجوع إلى الكود أدناه.
فراغ ثابت خاص 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 = new DataColumn[] ...{ column1 };
table1.RowChanged += new System.Data.DataRowChangeEventHandler(Row_Changed
DataRow
);
لـ (int i = 0; i <= 3; i++)
...{
صف = جدول 1.NewRow();
صف["id"] = i;
صف["العنصر"] = i;
table1.Rows.Add(row);
}
// قبول التغييرات.
table1.AcceptChanges();
DataTable table2 = table1.Clone();
الصف = الجدول2.NewRow();
صف["معرف"] = 14؛
الصف ["العنصر"] = 774؛
table2.Rows.Add(row)
;
صف["معرف"] = 12؛
الصف["العنصر"] = 555؛
table2.Rows.Add(row)
;
صف["معرف"] = 13؛
الصف ["العنصر"] = 665؛
table2.Rows.Add(row);
// دمج الجدول 2 في الجدول 1.
table1.Merge(table2);
}
لتلخيص ما سبق، تغير DataTable في .net 2.0 من جندي غير معروف في الخلفية إلى جنرال مسؤول.