Where语句在c#中不能正确工作
本文关键字:工作 不能 语句 Where | 更新日期: 2023-09-27 17:53:45
我正在使用MYSQL在我的c#应用程序。
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没有显示!!
你能帮帮我吗??
50比400 "大"当你把它们当作字符串,所以我怀疑这就是你在做的。
第一:永远、永远、永远不要像这样构建SQL。它容易受到SQL注入攻击,导致容易出错的转换,并使您的代码更难阅读。
应该使用参数化的SQL。在这种情况下,您需要的SQL类似于:
SELECT ID,METER FROM DB.TABLE1 WHERE METER >= @Parameter
,然后在参数集合中设置@Parameter
参数-首先将其解析为整数(或任何适合您试图表示的值的类型)。
下一步:检查模式中METER
的类型。如果它是varchar
或一些类似的文本类型,你需要解决这个问题。如果您想将值视为数字,则应该使用合适的数字类型。
<并且>操作符将在数值上完美地工作,因为您已经向传递的值添加了单引号,这可能会导致问题。试试这个并且>
"SELECT ID,METER FROM DB.TABLE1 WHERE METER >= "+TEXT1.text.tostring;
将用户输入转换为整型,然后在查询中使用整型值
SELECT ID,METER FROM DB.TABLE1 WHERE METER >= Convert.ToInteger(TEXT1.text.ToString()) ;
文本比较不是数值比较。为了避免这种误导行为和sql注入风险,您必须使用参数化查询。
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所建议的,更好的解决方案是ALTER表模式以使用数字列数据类型,并在代码中使用SQL参数,特别是当您似乎正在处理用户输入时。