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

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

以下代码:

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

给出错误:

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

 [textColour] = '" + txtColour + "WH 

缺少单引号:

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

编辑:虽然我只是简单地指出了错误发生的原因,但我下面的海报对于使用参数化查询来解决这些问题是正确的。 或者像LINQ这样的ORM

你应该真的使用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(); 

我想你应该好好看看

C#中的SQL参数

SqlParameter类

试图避免SQL注入

SQL注入是一种代码注入技术,它利用应用程序数据库层中发生的安全漏洞。 当用户输入被错误地过滤为嵌入在SQL语句中的字符串文字转义字符或用户输入没有强类型并因此意外执行时,存在漏洞。 它是一种更普遍的漏洞类的实例,只要一种编程或脚本语言嵌入另一种编程或脚本语言中,就会发生这种漏洞。 SQL注入攻击也称为SQL插入攻击

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

WHERE <[LoweredUserName]

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

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

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

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

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

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

事实上参数化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 …”中的引号“’”