我只是想知道是否有人可以指出我在这里正确的方向,我想我已经看了太长时间,所以看不出错误。
以下代码:
SqlCommand updateStyle = new SqlCommand("UPDATE [Lorenz].[dbo].[Layout] SET [bgColour] = '" + bgColour + "' , [textColour] = '" + txtColour + "WHERE <[LoweredUserName] ='" + currentUser + "' ", connection);
updateStyle.ExecuteNonQuery();
给出错误:
'admin'附近的语法不正确。 字符串''后面的未闭合引号。
答案 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 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 ...”中的引号“'”