작성자 : Grasshopper Jun 출처 : 블로그홀
먼저 WEB 서비스 코드를 살펴보겠습니다.
[웹방법]
공개 DataTable GetInfo()
...{
OleDbConnection nwindConn = 새로운 OleDbConnection(
"공급자=Microsoft.Jet.OLEDB.4.0;"
"데이터 소스=D:\Northwind\northwind.mdb;")
;
new OleDbCommand("SELECT CustomerID, CompanyName FROM 고객"
, nwindConn);
selectCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA.SelectCommand =
데이터세트 custDS = new DataSet();
custDA.Fill(custDS, "고객");
custDS.Tables[0]을 반환합니다.
}
.net 1.1에서는 이는 일반적인 오류입니다. .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에서는 위와 동일한 코드가 문제 없이 작동합니다. 그 이유는 DataTable 2.0에서는 직렬화 및 역직렬화를 구현하기 때문입니다.
VS2005 Beta2 문서에서 2.0의 DataTable이 다음 인터페이스를 구현하는 것을 볼 수 있습니다.
명시적 인터페이스 구현
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerialized.GetSchema
System.Xml.Serialization.IXmlSerialized.ReadXml
System.Xml.Serialization.IXmlSerialized.WriteXml
1.1에서 DataTable은
명시적 인터페이스 구현이라는
하나의 인터페이스만 구현했습니다.
System.ComponentModel.IListSource.ContainsListCollection은
DataSet의 일부 기능을 DataTable로 이동합니다. 2.0에는 여러 데이터 세트를 병합하는 Merge 메서드도 있습니다.
DataTable의 코드 병합은 아래 코드를 참고하세요.
개인 정적 무효 DemonstrateMergeTable()
...{
DataTable table1 = new DataTable("Items");
DataColumn 컬럼1 = new DataColumn("id", typeof(System.Int32));
DataColumn 컬럼2 = new DataColumn("item", typeof(System.Int32));
테이블1.열.추가(열1);
table1.Columns.Add(column2);
table1.PrimaryKey = new DataColumn[] ...{ 열1 };
table1.RowChanged += new 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.Merge(테이블2);
}
위 내용을 정리하면 .net 2.0의 DataTable은 배경의 무명병사에서 책임자의 장군으로 바뀌었습니다.