0

我正在尝试对数据集执行以下选择语句...

Dim weight As Double

weight = 15

dsMain.Tables(0).Select(weight & " >= MINIMUM_WEIGHT and " & weight & " < MAXIMUM_WEIGHT", "USER_NAME ASC")

MINIMUM_WEIGHT 和 MAXIMUM_WEIGHT 都是 varchars(我无法在数据库中更改它),我的变量权重是双倍的。这会导致以下错误...

“无法对 System.String 和 System.Int32 执行 '>' 操作。”

如果我将重量转换为字符串,我会遇到 10 被认为小于 5 的情况。关于如何处理这种情况的任何建议?

谢谢!

4

3 回答 3

0
 Dim query = dt.Rows.AsEnumerable.Where(Function(dr) 
             weight > CDbl(dr("MINIMUM_WEIGHT").ToString) And 
             weight < CDbl(dr("MAXIMUM_WEIGHT").ToString))

其中 dr 是 DataRow,因此列名必须匹配。

于 2013-09-24T05:07:54.593 回答
0

根据文档Select Expression 支持 CONVERT 功能。

这是未经尝试的,但可能有效:

dsMain.Tables(0).Select(weight & " BETWEEN CONVERT(MINIMUM_WEIGHT, 'System.Int32') AND CONVERT(MAXIMUM_WEIGHT, 'System.Int32)'", "USER_NAME ASC")
于 2013-09-24T00:42:40.120 回答
0

将 x_WEIGHT 转换为适当的数字类型。字符串必须转换为数字;如发现的那样,将数字转换为字符串然后进行比较将导致字典/字典排序。

虽然我从未在 DataSet 查询中这样做过(但不得不在各种 SQL 查询中这样做),但它似乎Convert(..)是受支持的。在这种情况下,以下方法可能会奏效:

query = weight & " >= Convert(MINIMUM_WEIGHT, 'System.Int32')" & _
        " and " & weight & " < Convert(MAXIMUM_WEIGHT, 'System.Int32')"

但是,还可以查看如何使用 LINQ 编写查询(来自同一链接)。如果可以切换,我建议不要使用查询字符串(尤其是没有占位符的)。

这是另一个未经测试的查询(这次使用 C# LINQ 语法),它可能有效,也可能无效:

var v = from x in dt.AsEnumerable()
        where weight => Convert.ToInt32(x["MINIMUM_WEIGHT"])
            && weight < Convert.ToInt32(x["MAXIMUM_WEIGHT"])
        order by x["USER_NAME"]
        select x;

YMMV。祝你好运!

于 2013-09-24T00:15:24.860 回答