错误:您的 SQL 语法有错误 - 但 SQL 语句有效
Posted
技术标签:
【中文标题】错误:您的 SQL 语法有错误 - 但 SQL 语句有效【英文标题】:Error: You have an error in your SQL syntax - but SQL statement works 【发布时间】:2014-06-08 01:32:11 【问题描述】:我正在尝试在 for 循环中迭代更新我的 c# 应用程序中的 mysql 表。我收到此错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '935 WHERE ID=1' at line 1
但是,当我在 phpMyAdmin 中运行我的 SQL 语句时,它运行良好,它会更新我表中的特定位置。
代码:
for (int i = 1; i <= 10; i++)
string queryMean = " SELECT (RT1+RT2+RT3+RT4+RT5+RT6+RT7+RT8+RT9+RT10+RT11+RT12+RT13+RT14+RT15+RT16+RT17+RT18+RT19+RT20+RT21+RT22+RT23+RT24+RT25+RT26+RT27+RT28+RT29+RT30+RT31+RT32+RT33+RT34+RT35+RT36+RT37+RT38+RT39+RT40+RT41+RT42+RT43+RT44+RT45+RT46+RT47+RT48+RT49+RT50+RT51+RT52+RT53+RT54+RT55+RT56+RT57+RT58+RT59+RT60+RT61+RT62+RT63+RT64+RT65+RT66+RT67+RT68+RT69+RT70+RT71+RT72+RT73+RT74+RT75+RT76+RT77)/77 AS priem FROM reflextime WHERE reflextime.ID=" + i;
MySqlCommand cmd = new MySqlCommand(queryMean, conect);
readerMean = cmd.ExecuteReader();
readerMean.Read();
string result = readerMean["priem"].ToString();
double priem = Convert.ToDouble(result);
double priemer = Math.Round(priem, 3);
readerMean.Close();
string query2 = "UPDATE feture SET priemer="+priemer+" WHERE ID="+i;
MySqlCommand cmdx = new MySqlCommand(query2, conect);
cmdx.ExecuteScalar(); // here is the exception thrown
谢谢。
【问题讨论】:
priemer
列类型是字符吗?请使用参数化查询。这种字符串连接对 SQL 注入攻击开放。
要做的第一件事:开始使用参数化 SQL,而不是直接在 SQL 中包含值。除此之外,您的代码目前是文化敏感的。
这两个查询中的哪一个实际上失败了?估计更新了?您能否将查询失败时收到的查询打印出来?
你到底是如何最终得到 77 列,显然都包含兼容/可比较的值,而不是开始认为必须有更好的方法来对此建模?
失败的查询是什么?您可以将其中一个与问题隔离开来。正如它所说,使用参数化 Sql。
【参考方案1】:
请注意,如果它在您的机器上运行(斯洛伐克文化设置),double priemer
中的值将被转换为字符串,例如“586,935”。这不是您想要的,因为,
在 SQL 中的含义与.
不同。
解决问题的最简单方法是使用
string query2 = "UPDATE feture SET priemer="+priemer.ToString(CultureInfo.InvariantCulture)+" WHERE ID="+i;
顺便说一句,如果您在将查询 2 发布到此处之前打印了它,您可能已经发现了这个问题。
请注意,这绝不是在 C# 中调用查询的最佳做法,有关如何创建参数化查询的好线索可以在 here 找到。
【讨论】:
如果您不打算提供使用 SQL 参数的解决方案,您至少应该提到以这种方式构建 SQL 查询是一个非常糟糕的主意。 好的,我会提到它,但它已经在 cmets 中提到 - 我不想复制别人已经说过的话。 很多人都懒得看cmets,而是直接看答案。以上是关于错误:您的 SQL 语法有错误 - 但 SQL 语句有效的主要内容,如果未能解决你的问题,请参考以下文章
SQL 语法错误:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册
SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]
PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误