''附近的语法不正确。字符串''后面的未闭合引号

时间:2010-04-21 19:11:49

标签: c# asp.net

我只是想知道是否有人可以指出我在这里正确的方向,我想我已经看了太长时间,所以看不出错误。

以下代码:

SqlCommand updateStyle = new SqlCommand("UPDATE [Lorenz].[dbo].[Layout] SET [bgColour] = '" + bgColour + "' , [textColour] = '" + txtColour + "WHERE <[LoweredUserName] ='" + currentUser + "' ", connection);
updateStyle.ExecuteNonQuery();

给出错误:

'admin'附近的语法不正确。 字符串''后面的未闭合引号。

6 个答案:

答案 0 :(得分:11)

您应该使用SQL参数。它不仅有助于保护您的应用程序免受SQL注入攻击,还会使SQL语法错误更容易被发现。

SqlCommand updateStyle = new SqlCommand("UPDATE [Lorenz].[dbo].[Layout] SET [bgColour] = @bgColour, [textColour] = @textColour WHERE <[LoweredUserName] = @currentUser", connection);
updateStyle.Parameters.Add(new SqlParameter("@bgColour", bgColour));
updateStyle.Parameters.Add(new SqlParameter("@textColour", textColour));
updateStyle.Parameters.Add(new SqlParameter("@currentUser", currentUser));
updateStyle.ExecuteNonQuery();

答案 1 :(得分:7)

[textColour] = '" + txtColour + "WH

缺少单引号:

[textColour] = '" + txtColour + "'WH

编辑:虽然我只是指出错误发生的原因,但我下面的海报对于使用参数化查询来解决这些问题是正确的。或者可能是一个ORM,例如LINQ

答案 2 :(得分:6)

我认为你应该看看

SQL Parameters in C#

SqlParameter Class

试图避免SQL injection

  

SQL注入是代码注入   利用安全性的技术   漏洞发生在   应用程序的数据库层。该   用户存在漏洞   输入被错误地过滤   用于字符串文字转义字符   嵌入在SQL语句或用户中   输入不是强类型的   从而意外地执行。它是   一个更一般的类的实例   可能发生的漏洞   无论何时编程或编写脚本   语言嵌入另一个语言。   SQL注入攻击也是已知的   作为SQL插入攻击

总而言之,基于动态创建的查询字符串,您在应用程序中留下了巨大的空白。您所引用的错误将被处理,但也可以避免任何错误,让我们说 DROP TABLE USERS

答案 3 :(得分:1)

  

WHERE&lt; [LoweredUserName]

以上语法特别是&lt;似乎不正确。尝试在SQL服务器上运行SQL事件探查器(如果适用),以查看SQL发送到服务器的内容。

还使用参数来防止SQL注入攻击。

答案 4 :(得分:0)

这是SQL的语法错误,显然不是来自C#。

您需要获取在运行时插入的值 - 然后您将在SQL语句中看到语法错误。

编辑或者你可以做@zincorp所说的:)

作为一般惯例,在这种情况下使用String.Format更具可读性。更重要的是,你也想确保逃脱你的文字。

答案 5 :(得分:0)

确实参数化SQL更安全 - 我也使用它:

string mySqlStmt = "UPDATE tbSystem SET systemCode_str = @systemCode_str, systemName_str = @systemName_str";

            using (var conn = new SqlConnection(myConnStr))
            using (var command = new SqlCommand(mySqlStmt, conn)
            {

                CommandType = CommandType.Text

            })
            {
                //add your parameters here - to avoid SQL injection
                command.Parameters.Add(new SqlParameter("@systemCode_str", "ABZ"));
                command.Parameters.Add(new SqlParameter("@systemName_str", "Chagbert's Shopping Complex"));

                //now execute SQL
                conn.Open();
                command.ExecuteNonQuery();
                conn.Close();
            }

您将注意到使用参数化SQL我不必担心我的值中的引号,如上面“Chagbert的Shoppin ...”中的引号“'”