2013-04-10 44 views
0

嗨,大家好,我正在使用Linq並試圖將結果複製到表對象。但是,我收到了演員例外情況。Query.copyToDataTable不工作vb.net

下面是代碼:

Dim teams As DataTable = citySideDataset.Tables("Teams") 
     Dim query = From team In teams.AsEnumerable() Where team.Field(Of String)("Venue ID") = venueID And team.Field(Of Integer)("Division ID") = divisionID Select team 
     Dim boundTable As DataTable = query.CopyToDataTable() 

有什麼建議?

編輯:

對不起。 這是一個InvalidCastException。

,直到它試圖複製到DataTable

+0

發佈確切的堆棧跟蹤或轉換異常文本。我們不知道你有什麼異常。 – Jeremy 2013-04-10 01:24:31

+0

它的工作原理直到CopyToDataTable,因爲它不會在執行任何操作之前執行任何操作。這一切都推遲到那時。無論如何,檢查你的類型。 InvalidCastExceptions非常簡單。 – 2013-04-10 01:49:46

+0

更清楚的是,查看錶值Venue ID和相應的變量,還有Division ID和其他變量。其中一種類型不符合你的期望。該程序正在嘗試投射並且不成功,因此出現錯誤。 – 2013-04-10 01:55:51

回答

0

隨着在評論一些探索它的工作原理都很好,我們瞭解到,您在數據庫中的數據類型爲Division IDlong。當您試圖從字段中提取值時,您的查詢使用of Integer,並且這將引發錯誤。我們還了解到您的專欄支持空值。要解決您的查詢,你應該使用of Nullable(of Long),這將使它以下

Dim query = From team In teams.AsEnumerable() _ 
      Where team.Field(Of String)("Venue ID") = venueID _ 
      And team.Field(Of Nullable(of Long))("Division ID") = divisionID _ 
      Select team 

最後一個考慮,你應該知道的是,CopyToDataTable()將拋出自己的異常,如果沒有行通無論您使用的過濾器。因此,如果您的結果有可能爲空,則您需要在調用該方法之前檢查行。

Dim boundTable As DataTable 
If query.Any() Then 
    boundTable = query.CopyToDataTable() 
Else 
    'just use empty clone of original table, if applicable 
    boundTable = table.Clone() 
End If 
+0

我試過了,它不工作。當然,這與數字類型有關。我試圖將數字轉換爲Long,但它不起作用 – Camus 2013-04-10 04:07:24

+0

然後我回到我最早的評論之一。有些東西不是你期望的類型。仔細檢查數據庫。然後仔細檢查任何代碼生成的原始'citySideDataset',這可能確實是一個存儲過程,或者它可能是在代碼中構建的。是什麼東西把這一列變成了字符串?小數點?其他類型?這就是你需要找到的。 – 2013-04-10 04:15:59

+0

要進行故障排除,請單擊代碼。在有餐桌的地方放置一個休息點。看看它的專欄。你可以看看它的屬性。例如,您可以查看teams.Columns(「Division ID」).DataType。它說什麼? – 2013-04-10 04:27:38