2009-09-09 34 views
15

Tôi cần sử dụng lại phương thức DataAccess do khách hàng chỉ định. Phương thức này trả về một vanilla datatable. Tôi muốn truyền dữ liệu này đến dữ liệu có thể đánh máy của mình. Số cột và loại của chúng sẽ khớp nhau. Thông báo ngoại lệ "Không thể truyền đối tượng thuộc loại 'System.Data.DataTable' để nhập 'MarketValueDataTable'." rất rõ ràng, nhưng làm cách nào để khắc phục?Truyền dữ liệu chung có thể định dạng được để nhập dữ liệu

Đã xem casting-a-base-type-to-a-derived-type, nhưng không thể xem cách thực hiện công việc đó.

Tôi không thể điền dữ liệu có thể định vị được bằng trình quản lý dữ liệu, chỉ có thể sử dụng phương thức DataAccess của ứng dụng khách.

Trả lời

32

Dàn diễn viên chỉ có thể hoạt động nếu bảng trả về bởi phương pháp này thực sự là một thể hiện của MarketValueDataTable. Nếu không, tất cả những gì bạn có thể làm là sao chép dữ liệu vào một thể hiện của MarketValueDataTable. Ví dụ: bạn có thể sử dụng phương thức Merge:

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

I luv SO! Cảm ơn. – callisto

+0

Rất tốt .. :) – Marshal

+0

Chi phí hợp nhất là gì ?! – deepdive

1

Bạn không thể truyền DataTable vào MarketValueDataTable, vì lý do đơn giản là nó không kế thừa từ nó.

Những gì bạn cần làm là khởi tạo MarketValueDataTable mới, sau đó sao chép dữ liệu từ DataTable vào đó.

Hãy thử một cái gì đó như:

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

(tôi đã không kiểm tra này)

0

Nếu bảng dữ liệu của bạn là bảng chung thì không thể đưa vào MarketValueDataTable.

Một điều bạn có thể thử là tạo đối tượng MarketValueDataTable mới và thêm hàng vào nó theo cách thủ công. Bằng cách bước qua các hàng của dữ liệu chung chung của bạn và sau đó bước qua các cột của mỗi hàng bạn có thể sử dụng sự phản chiếu để thiết lập các giá trị thuộc tính của một MarketValueDataTableRow mới.

Something như sau (cảnh báo - giả):

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

} 

Bạn nhận được các ý tưởng chung. Bước qua các hàng của bảng chung và sử dụng sự phản chiếu để tìm các thuộc tính phù hợp trong hàng dữ liệu được nhập cụ thể. Điều này sẽ làm việc (tôi đã sử dụng cách tiếp cận tương tự trước đó), nhưng mã phải được sửa đổi để phù hợp với yêu cầu của bạn.

7

Sử dụng chức năng tiện dụng này để chuyển đổi số DataTable thông thường thành DataTable được nhập.

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 

Cách sử dụng

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

Cách sử dụng

dataset1.MyTypedDataTable dtTyped = ConvertToTypedDataTable<dataset1.MyTypedDataTable>(MyUntypedDataTable); 
Các vấn đề liên quan