C# where语句在c中不能正常工作

C# where语句在c中不能正常工作,c#,mysql,sql,C#,Mysql,Sql,我在我的c应用程序中使用MYSQL mysql表中有一些字符串值,客户端可以在其中写入一个文本框,然后我使用以下语句显示结果: "SELECT ID,METER FROM DB.TABLE1 WHERE METER >= '" +TEXT1.text.tostring+"'"; 但例如,如果客户端在该文本框中写入400,则结果如下: 50,400,500,600,50,500 300,150,100,250; 但我们知道50不大于400!!! 然后我用了这个代码: "SE

我在我的c应用程序中使用MYSQL

mysql表中有一些字符串值,客户端可以在其中写入一个文本框,然后我使用以下语句显示结果:

"SELECT ID,METER FROM DB.TABLE1 WHERE METER >= '" +TEXT1.text.tostring+"'";  
但例如,如果客户端在该文本框中写入400,则结果如下:

50,400,500,600,50,500  
300,150,100,250;  
但我们知道50不大于400!!! 然后我用了这个代码:

"SELECT ID,METER FROM DB.TABLE1 WHERE METER <= '" +TEXT1.text.tostring+"'";  
50没有显示


你能帮我吗?我该怎么办

运算符将对数值执行操作,因为您已将单引号添加到所传递的值中,这可能是导致问题的原因。试试这个

"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注入风险,您必须使用参数化查询。

50在将它们作为字符串处理时大于400,因此我怀疑您正在这样做

第一:永远,永远,永远不要像这样构建SQL。它很容易发生错误,导致容易出错的转换,并且使代码更难阅读

相反,请使用参数化SQL。在这种情况下,您将需要类似以下内容的SQL:

SELECT ID,METER FROM DB.TABLE1 WHERE METER >= @Parameter
然后在参数集合中设置@Parameter参数-将其解析为整数或适合您首先尝试表示的值的任何类型


下一步:检查模式中的仪表类型。如果是varchar或类似的文本类型,您需要修复它。如果要将值视为数字,则应使用合适的数字类型。

您可以在MySQL中将字符串转换为数字:

变量sql=@ 选择ID,仪表 来自DB.1表 其中CASTMETER为未签名>= +转换.ToIntegerTEXT1.text.ToString

在MySQL中处理数字作为字符串时,有各种各样的怪癖要考虑。

我建议阅读:


正如Jon所建议的,更好的解决方案是改变表模式,使用数字列数据类型,并在代码中使用SQL参数,特别是在处理用户输入时。

您不应该连接SQL查询,使用参数我相信,仪表数据类型是varchara您喜欢SQL注入攻击吗?请不要建议这样的代码。。。即使SQL注入不是我们手头上的问题,我们也应该抓住每一个机会来消除它。不,不是那样的,实际上参数化的方法应该是完美的方法。我只是建议了最简单的解决方案。感谢您的解决方案:这样做会使OP容易受到SQL注入攻击。您基本上鼓励OP在SQL中留下一个巨大的漏洞——为什么不建议使用参数化SQL呢?如果OP发现这个解决方案对他们来说是有效的,他们可能会继续使用这个坏的、坏的代码——而不是修复一个主要的问题。@ Jon Switt我会考虑下一次提出参数化查询解决方案。谢谢你的回答。但是我不熟悉这种类型的构建。你能给我一个这种sql的链接吗。thanks@Massoud当前位置因此我建议您了解一下:例如,阅读感谢您的帮助@乔恩·斯凯蒂试过这个,但没用。我认为这是因为值是字符串。