2013-04-10 49 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