我在我的c#app中使用MYSQL。
mysql表中有一些字符串值,客户端可以写入一个文本框,然后我用这个语句来显示结果:
"SELECT ID,METER FROM DB.TABLE1 WHERE METER >= '" +TEXT1.text.tostring+"'";
但是例如,如果客户端在该文本框中写入400,则结果如下:
50,400,500,600,50,500
但我们知道50不大于400 !!! 然后我使用了这段代码:
"SELECT ID,METER FROM DB.TABLE1 WHERE METER <= '" +TEXT1.text.tostring+"'";
如果客户端在该文本框中写入400,则结果如下:
300,150,100,250;
50未显示!!!
你能帮帮我怎么办?
答案 0 :(得分:2)
50是&#34;更大&#34;当你把它们当作字符串时,它会超过400,所以我怀疑你正在做什么。
首先:从不,永远,永远不要像这样构建SQL。它容易受到SQL injection attacks的攻击,导致容易出错的转换,并且会使您的代码难以阅读。
相反,使用参数化SQL。在这种情况下,您需要SQL之类的内容:
SELECT ID,METER FROM DB.TABLE1 WHERE METER >= @Parameter
然后在参数集合中设置@Parameter
参数 - 首先将其解析为整数(或任何适合您尝试表示的值的类型)。
下一步:检查架构中METER
的类型。如果它是varchar
或某些类似的文字类型,则需要修复此问题。如果要将值视为数字,则它应该是合适的数字类型。
答案 1 :(得分:0)
&LT;和&gt;运算符将在数值上运行perfeclty,因为您已将单引号添加到已传递的值,这可能会导致问题。试试这个
"SELECT ID,METER FROM DB.TABLE1 WHERE METER >= "+TEXT1.text.tostring;
答案 2 :(得分:0)
将用户输入转换为Integer,然后在查询中使用整数值。
SELECT ID,METER FROM DB.TABLE1 WHERE METER >= Convert.ToInteger(TEXT1.text.ToString()) ;
答案 3 :(得分:0)
文本比较不是数字比较。为避免这种误导行为和SQL注入风险,您必须使用参数化查询。
答案 4 :(得分:0)
您可以将字符串转换为MySQL中的数字:
var sql = @"
SELECT ID, METER
FROM DB.TABLE1
WHERE CAST(METER AS UNSIGNED) >= "
+ Convert.ToInteger(TEXT1.text.ToString());
在MySQL中将数字作为字符串处理时,需要考虑各种奇怪的事情。
我建议阅读:https://dev.mysql.com/doc/refman/5.0/en/type-conversion.html
正如Jon建议的那样,更好的解决方案是更改表模式以使用数字列数据类型并在代码中使用SQL参数,尤其是在您似乎处理用户输入时。