错误:您的 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 服务器版本相对应的手册

如何调试“您的 SQL 语法有错误”

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]

PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

错误:ER_PARSE_ERROR:您的 SQL 语法有错误;

我的 SQL 错误:错误 1064:您的 SQL 语法有错误;