Microsoft MVP성태의 닷넷 이야기
.NET Framework: 95. WCF에서의 DataTable 사용 [링크 복사], [링크+제목 복사],
조회: 26204
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 



WCF에서의 DataTable 사용


우선, 다음의 토픽을 읽어보십시오.

[WCF]데이터 보내기1
; http://blog.naver.com/unbimanse?Redirect=Log&logNo=30008913599

예전에 소개해 드렸던, "BUG: 웹 서비스에서 DataTable 사용하기"에서는 ASMX 웹 서비스에서 어떻게 DataTable을 사용하는지에 대해서 설명했는데, 이런 방식도 WCF에서는 통하지 않는다는 내용을 담고 있습니다.

자... 이제 세월이 또 지났군요. ^^
어느새 VS.NET 2008이 나왔고, 서비스 프록시 클래스를 생성할 때, 참조된 어셈블리에 있는 데이터 타입을 활용하도록 svcutil.exe가 개선이 되었습니다. (엄밀히, 이 기능은 VS.NET 2008에서 개선되었다기보다는 "svcutil.exe" 프로그램이 개선되었다고 봐야죠. Microsoft SDK 6.0A 버전에는 개선된 기능을 담고 있는 svcutil.exe가 포함되어 있습니다.)

그럼... DataTable에 대한 지원이, 좀 나아졌을까요?

확인을 위해서 기왕 테스트 하는 김에 TypedDataset / Untyped Dataset과 함께 DataTable을 함께 다뤄봤습니다.

일단, "Untyped"인 경우에는 부가적인 작업이 필요 없지만, TypedDataset을 테스트하기 위해서 다음과 같이 "DataSet1.xsd"를 만들었습니다.

vsnet2008_wcf_support_datatable_1.png

그리고 다음과 같은 간단한 DataTable 구성 함수를 만들고,

private DataTable GetTestDataTable()
{
  DataTable table = new DataTable();
  table.Columns.Add("CustomerID", typeof(string));
  table.Columns.Add("Age", typeof(int));

  DataRow row = table.NewRow();
  row["CustomerID"] = "myName";
  row["Age"] = 16;

  table.Rows.Add(row);

  return table;
}

private TestLib.DataSet1.TableRootDataTable GetTestCustomDataTable()
{
  TestLib.DataSet1.TableRootDataTable table = new TestLib.DataSet1.TableRootDataTable();

  TestLib.DataSet1.TableRootRow row = table.NewTableRootRow();
  row.CustomerID = "Customer001";
  table.Rows.Add(row);

  return table;
}

위의 함수를 이용해서 다음과 같이 간단한 Operation을 구성했습니다. (ServiceContract 인터페이스는 생략)

[OperationBehavior]
public DataSet GetDataSet()
{
  DataSet ds = new DataSet("TestTable");
  ds.Tables.Add(GetTestDataTable());
  return ds;
}

[OperationBehavior]
public DataTable GetDataTable()
{
  return GetTestDataTable();
}

[OperationBehavior]
public DataSet1 GetCustomDataSet()
{
  DataSet1 ds = new DataSet1();
  ds.TableRoot.Merge(GetTestCustomDataTable());
  return ds;
}

[OperationBehavior]
public TestLib.DataSet1.TableRootDataTable GetCustomDataTable()
{
  return GetTestCustomDataTable();
}

이제 서비스를 시작하고, 클라이언트 측에서 "서비스 참조"를 해봅니다. 우선, 궁금한 것은 Operation에 대한 함수 Signature가 어떻게 되었는지인데요. 오호... 훌륭하게 다음과 같이 생성되어 있습니다.

=== Reference.cs ===
public System.Data.DataTable GetDataTable() {
    return base.Channel.GetDataTable();
}

public System.Data.DataSet GetDataSet() {
    return base.Channel.GetDataSet();
}

public TestLib.DataSet1 GetCustomDataSet() {
    return base.Channel.GetCustomDataSet();
}

public TestLib.DataSet1.TableRootDataTable GetCustomDataTable() {
    return base.Channel.GetCustomDataTable();
}

짐작하시겠지만, 이렇게 코드가 생성된 데에는 "Reuse types in referenced assemblies"의 힘이 큽니다. ^^




정말 값들이 제대로 들어가 있는지 클라이언트에서도 확인을 해볼까요?

간단하게, 테이블 데이터 출력 함수를 아래와 같이 만들고,

private void OutputDataTable(DataTable dt)
{
  Debug.WriteLine("=== Table Name : " + dt.TableName + " ==== "); 
  foreach (DataRow row in dt.Rows)
  {
    Debug.WriteLine(row.Field("CustomerID"));
  }
}

private void OutputDataSet(DataSet ds)
{
  foreach (DataTable dt in ds.Tables)
  {
    OutputDataTable(dt);
  }
}

서비스 함수 호출을 다음과 같이 했습니다.

DataSet ds = svc.GetDataSet();
OutputDataSet(ds);

DataTable dt = svc.GetDataTable();
OutputDataTable(dt);

DataSet1 cds = svc.GetCustomDataSet();
OutputDataSet(cds);

TestLib.DataSet1.TableRootDataTable cdt = svc.GetCustomDataTable();
OutputDataTable(cdt);

결과는... 어찌되었을까요? ^^ 두말할 것도 없이 잘 나왔겠지요.

Debug Output 실행 결과:

=== Table Name : TestTable ==== 
myName
=== Table Name : TestTable ==== 
myName
=== Table Name : TableRoot ==== 
Customer001
=== Table Name : TableRoot ==== 
Customer001





[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 4/10/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11024정성태8/12/201621616오류 유형: 350. "nProtect GameMon" 실행 중에는 Visual Studio 디버깅이 안됩니다! [1]
11023정성태8/10/201623054개발 환경 구성: 293. Azure 구독 후 PaaS 서비스 만들어 보기
11022정성태8/10/201623721개발 환경 구성: 292. Azure Cloud Service 배포시 사용자 정의 작업을 추가하는 방법
11021정성태8/10/201620855오류 유형: 349. System.Runtime.Remoting.RemotingException - Type '..., ..., Version=..., Culture=neutral, PublicKeyToken=null' is not registered for activation [2]
11020정성태8/10/201623556VC++: 98. 원본과 대상 버퍼가 같은 경우 memcpy, wmemcpy 주의점
11019정성태8/10/201640178기타: 60. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 (2쇄 정오표)
11018정성태8/9/201624678.NET Framework: 600. 단일 메서드 내에서의 할당으로 알아보는 자바와 닷넷의 GC 차이점 [1]
11017정성태8/9/201626778웹: 33. HTTP 쿠키에 한글 값을 설정하는 방법
11016정성태8/7/201623921개발 환경 구성: 291. Windows Server Containers 소개
11015정성태8/7/201622200오류 유형: 348. Windows Server 2016 TP5에서 Windows Containers의 docker run 실행 시 encountered an error during Start failed in Win32
11014정성태8/6/201623004오류 유형: 347. Hyper-V Virtual Machine Management service Account does not have permission to open attachment
11013정성태8/6/201633721개발 환경 구성: 290. Windows 10에서 경험해 보는 Windows Containers와 docker [4]
11012정성태8/6/201623781오류 유형: 346. Windows 10에서 Windows Containers의 docker run 실행 시 encountered an error during CreateContainer failed in Win32 발생
11011정성태8/6/201625402기타: 59. outlook.live.com 메일 서비스의 아웃룩 POP3 설정하는 방법
11010정성태8/6/201622802기타: 58. Outlook에 설정한 SMTP/POP3(예:천리안 메일) 계정 암호를 잊어버린 경우
11009정성태8/3/201627981개발 환경 구성: 289. 2016-08-02부터 시작된 윈도우 10 1주년 업데이트에서 Bash Shell 사용 [8]
11008정성태8/1/201621783오류 유형: 345. 2의 30승 이상의 원소를 갖는 경우 버그가 발생하는 이진 검색(Binary Search) 코드
11007정성태8/1/201623533오류 유형: 344. RDP ActiveX 컨트롤로 특정 PC에 연결할 수 없을 때, 오류 상황을 해결하기 위한 팁파일 다운로드1
11006정성태7/22/201626523개발 환경 구성: 288. SSL 인증서를 Azure Cloud Service에 적용하는 방법
11005정성태7/22/201625185개발 환경 구성: 287. Let's Encrypt 인증서 업데이트 주기: 90일
11004정성태7/22/201619991오류 유형: 343. Invalid service definition or service configuration. Please see the Error List for more details.
11003정성태7/20/201627251VS.NET IDE: 110. Visual Studio 2015에서 .NET Core 응용 프로그램 개발 [1]
11002정성태7/20/201620717개발 환경 구성: 286. Microsoft Azure 서비스의 구독은 반드시 IE로!
11001정성태7/19/201631738.NET Framework: 599. .NET Core/SDK 설치 및 기본 사용법 [6]
11000정성태7/16/201620426오류 유형: 342. Microsoft Visual Studio 2010 Tools for Office Runtime (x86 and x64) 설치 시 오류
10999정성태7/16/201622012오류 유형: 341. .NET Framework 4.5.2가 설치 안 되는 경우
... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...