2009-09-09 4 views
15

클라이언트에서 지정한 DataAccess 메서드를 다시 사용해야합니다. 이 메서드는 바닐라 데이터 테이블을 반환합니다. 이 데이터 테이블을 형식화 된 데이터 테이블로 캐스팅하려고합니다. 열의 수와 유형이 일치합니다. 예외 메시지 "형식 'System.Data.DataTable'의 개체를 Castable 'MarketValueDataTable'로 캐스팅 할 수 없습니다." 은 매우 명확하지만 어떻게 수정해야합니까?일반적인 데이터 테이블과 형식화 된 데이터 테이블 캐스팅

casting-a-base-type-to-a-derived-type을 보았지만 그 작업을 수행하는 방법을 알 수 없었습니다.

datatable을 사용하여 데이터 테이블을 채울 수 없으며 클라이언트의 DataAccess 메서드 만 사용할 수 있습니다.

답변

32

방법으로 반환 된 테이블이 실제로 MarketValueDataTable의 인스턴스 인 경우 캐스트는 일할 수 : 같은

보십시오 뭔가. 그렇지 않은 경우 데이터를 MarketValueDataTable의 인스턴스로 복사하면됩니다. 당신의 데이터 테이블은 다음이 MarketValueDataTable 캐스트 할 수없는 일반적인 테이블 인 경우

DataTable data = GetData(); 
MarketValueDataTable myData = new MarketValueDataTable(); 
myData.Merge(data); 
+0

내가 SO LUV! 감사합니다. . – callisto

+0

아주 좋아 .. :) – Marshal

+0

병합 비용은 무엇입니까?! – deepdive

1

DataTable을 MarketValueDataTable로 캐스팅 할 수 없습니다. 그 이유는 DataTable에서 상속되지 않기 때문입니다.

당신이해야 할 일은 새로운 MarketValueDataTable을 인스턴스화 한 다음 DataTable의 데이터를 거기에 복사하는 것입니다.

MarketValueDataTable myTable = new MarketValueDataTable(); 
StringWriter writer = new StringWriter(); 
theDataTable.WriteXml(writer); 
myTable.ReadXml(new StringReader(writer.ToString())); 

(I이 테스트를하지 않은 경우)

0

: 당신은 인스턴스에 대한 Merge 방법을 사용할 수 있습니다.

시도해 볼 수있는 한 가지 방법은 새 MarketValueDataTable 개체를 만들고이를 수동으로 추가하는 것입니다. 일반 데이터 테이블의 행을 단계별로 실행 한 다음 각 행의 열을 단계별로 실행하면 리플렉션을 사용하여 새 MarketValueDataTableRow의 속성 값을 설정할 수 있습니다. 다음과 같은

뭔가 (경고 - 의사) :

MarketValueDataTable mv = new MarketValueDataTable(); 
foreach(DataRow row in table.Rows) 
{ 

    MarketValueDataTableRow mvrow = mv.NewRow(); 
    foreach(DataColumn col in table.Columns) 
    { 
     PropertyInfo colProperty = mvrow.GetType().GetProperty(col.Name); 
     colProperty.SetValue(mvRow, row[col]); 
    } 
    mv.Rows.Add(mvrow); 

} 

당신은 일반적인 아이디어를 얻을. 일반 테이블의 행을 단계별로 실행하고 리플렉션을 사용하여 특정 입력 된 데이터 행에서 일치하는 속성을 찾습니다. 이것은 (나는 이전에 같은 접근법을 사용했다) 작동해야하지만 코드는 요구 사항에 맞게 수정해야합니다.

7

일반 DataTable을 입력 한 DataTable으로 변환하려면이 편리한 기능을 사용하십시오.

VB

Public Shared Function ConvertToTypedDataTable(Of T As {Data.DataTable, New})(dtBase As Data.DataTable) As T 
    Dim dtTyped As New T 
    dtTyped.Merge(dtBase) 

    Return dtTyped 
End Function 

사용

Dim dtTyped = ConvertToTypedDataTable(Of dataset1.MyTypedDataTable)(MyUntypedDataTable) 

C#

public static T ConvertToTypedDataTable<T>(System.Data.DataTable dtBase) where T : Data.DataTable, new() 
{ 
    T dtTyped = new T(); 
    dtTyped.Merge(dtBase); 

    return dtTyped; 
} 

사용

dataset1.MyTypedDataTable dtTyped = ConvertToTypedDataTable<dataset1.MyTypedDataTable>(MyUntypedDataTable);