2012-10-26 32 views
1

簡而言之: 如何在VS只在運行時知道的字段上加入兩個數據表並將其始終知道? 有沒有像在運行時已知的字段上加入兩個數據表

Dim result = From t1 In dt, t2 In dt2 _ 
        Where t1.Field <DateTime> ("timestamp") = t2.Field <DateTime> ("samplestamp") 
        Select t1, t2 

這些表的名字,因爲這兩個表是動態創建只會在運行時已知的解決方案。

長版本:
在角落A,我有一個Historian服務器,我可以獲取一些數據。這個數據代表給定過程在給定時間內創建的所有樣本(ses)
在角落B我有一個SQL服務器,我也可以獲取一些數據。該數據代表在給定時間內運行的所有批次。

該項目需要將這2個表格顯示在圖表控件中。

現在的樂趣部分。只有在運行時,我才能知道哪些列將可用。我不知道我會收到多少列,因爲我不知道是1批次還是100批次。我所知道的是,我可以將所有這些「數據」(我只能在運行時看到)接收到2個數據表中(因爲它是一箇舊項目)
我「知道」例如對於數據表1 (角落A)始終存在於第一列名爲timestamp的表中。 (這也是我知道這裏的唯一列)
,我也知道,在datatable2(角B)第一列被命名爲sampletime

所以來這裏的倒計時:我怎麼能這兩個數據表連接上給一個華麗的數據表名稱,然後我用它作爲我的圖表控件的數據源。因此問題解決了。

我試圖做到這一點,並在SQL服務器中創建一個單一的SQL表,這裏的問題是,我與一個不喜歡事務的服務器一起工作,所以沒有成功。

回答

3

,而不必閱讀Longversion和希望,而不必忽略了什麼:

你可以通過這些表來取兩個DataTables作爲參數的方法。

然後,你可以使用此代碼返回一個可重複使用的IEnumerable(Of Tuple(Of DataRow, DataRow))

Public Function getSomething(dt1 As DataTable, dt2 As DataTable) As IEnumerable(Of Tuple(Of DataRow, DataRow)) 
    Return From r1 In dt1 
      Join r2 In dt2 
      On r1.Field(Of DateTime)("timestamp") Equals r2.Field(Of DateTime)("samplestamp") 
      Select Tuple.Create(r1, r2) 
End Function 

匿名類型並不意味着在那裏它們被創建的方法以外的地方使用。因此我使用了這個元組方法。你可以用這種方法判斷返回值:

Dim rowInfos = getSomething(tbl1, tbl2) 
For Each rowInfo In rowInfos 
    Dim row1 = rowInfo.Item1 
    Dim row2 = rowInfo.Item2 
    Dim timestamp = row1.Field(Of DateTime)("timestamp") 
    Dim samplestamp = row2.Field(Of DateTime)("samplestamp") 
Next 
+0

感謝蒂姆的快速反應 我在嘗試2個數據表的合併結束了,有趣的是,我得到我想要的,以顯示正確的值。也許不是目前最乾淨的方法(批次越多,加載的時間越多(+ - 3秒/批次),但視覺方面存在:D無論如何Robin – Schuere

相關問題