2009-09-09 34 views
15

İstemcinin yazdığı DataAccess yöntemini yeniden kullanmam gerekir. Bu yöntem bir vanilya verisi döndürür. Bu veri tabanını Typed veri tabanına yayınlamak istiyorum. Sütun miktarı ve türleri eşleşecektir. Özel durum iletisi "MarketValueDataTable" yazmak için "System.Data.DataTable" türünde nesne dönüştürülemiyor. " çok açık, ama nasıl düzeltebilirim?Yazılı veri tabanına genel veri dökümünü yayınlama

casting-a-base-type-to-a-derived-type'a bir göz attım, ancak bu işin nasıl yapıldığını göremedim.

Verileri bir veri okuyucusuyla dolduramıyorum, yalnızca istemcinin DataAccess yöntemini kullanabilir.

cevap

32

yöntemi tarafından döndürülen tablo aslında MarketValueDataTable örneğidir ise dökme sadece işe yarayabilir: gibi

deneyin şey. Değilse, tek yapmanız gereken verileri MarketValueDataTable örneğine kopyalamanızdır. senin Datatable sonra bir MarketValueDataTable için döküm edilemez bir jenerik tablo ise

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

Ben SO Luv! Teşekkürler. – callisto

+0

Çok iyi .. :) – Marshal

+0

Birleştirme maliyetleri nelerdir? – deepdive

1

DataTable'ı ondan devralmamanın basit bir nedeni olan bir MarketValueDataTable dosyasına atayamazsınız.

Yapmanız gereken yeni bir MarketValueDataTable örneği oluşturmak ve daha sonra verileri DataTable öğesinden kopyalamaktır.

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

(Bu test değil)

0

: Sen mesela Merge yöntemi kullanabilirsiniz.

Deneyebileceğiniz bir şey, yeni bir MarketValueDataTable nesnesi oluşturmak ve ona elle satır eklemektir. Genel veri tablonuzun satırlarına adım atıp ardından her satırın sütunlarına atlayarak yeni bir MarketValueDataTableRow öğesinin özellik değerlerini ayarlamak için yansıma kullanabilirsiniz. Aşağıdaki gibi

şey (uyarı - yalancı kod):

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); 

} 

Ana fikri olsun. Jenerik tablonun satırları boyunca ilerleyin ve belirli yazılan veri satırındaki eşleşen özellikleri bulmak için yansımayı kullanın. Bu çalışmalıdır (aynı yaklaşımı daha önce kullandım), ancak kod gereksinimlerinize uyacak şekilde değiştirilmelidir.

7

Düzenli bir DataTable numarasını, DataTable yazarak dönüştürmek için bu kullanışlı işlevi kullanın.

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 

Kullanımı

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; 
} 

Kullanımı

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