我正在尝试在数据集上执行以下select语句...
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(我不能在数据库中更改它),我的变量权重是double。这会导致以下错误......
“无法执行'&gt;'对System.String和System.Int32的操作。“
如果我将重量转换为字符串,那么我会遇到10被认为小于5的情况。有关如何处理这种情况的任何建议吗?
谢谢!
答案 0 :(得分: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。祝你好运!
答案 1 :(得分:0)
根据documentation Select Expression支持CONVERT函数。
这是未经验证但可能有效:
dsMain.Tables(0).Select(weight & " BETWEEN CONVERT(MINIMUM_WEIGHT, 'System.Int32') AND CONVERT(MAXIMUM_WEIGHT, 'System.Int32)'", "USER_NAME ASC")
答案 2 :(得分:0)
Dim query = dt.Rows.AsEnumerable.Where(Function(dr)
weight > CDbl(dr("MINIMUM_WEIGHT").ToString) And
weight < CDbl(dr("MAXIMUM_WEIGHT").ToString))
其中dr是DataRow,因此列名必须匹配。