【问题标题】:Wrong SQL syntax SQL lServer C# winforms错误的 SQL 语法 SQL lServer C# winforms
【发布时间】:2013-04-02 02:31:32
【问题描述】:

嘿,我正在尝试运行此查询:

command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "','" + "(SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "')','" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");

现在command.UseSqlCommand 正在运行查询,但我不断收到此错误: “intel”附近的语法不正确

(intel 是“ProductName”(我从这里得到的:

SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "'

编辑:这是命令的值,(在'intel'附近得到'不正确的语法')

INSERT INTO DisplayOrders 
Values ('2', '(SELECT ProductId FROM Products WHERE ProductName =N'Intel Quad Core i5 3470 3.2Ghz 6MB Tray')','Intel Quad Core i5 3470 3.2Ghz 6MB Tray','1','900')"

【问题讨论】:

  • 1) 这对 SQL 注入开放 2) 将其拆分为 string,取其值,自己在数据库上运行,查看结果。
  • 不要这样做。请。使用参数化 SQL 来避免SQL injection attacks。这也可以很好地解决您当前的问题,但它肯定会提高您应用的安全性。
  • WHERE ProductName =N'" + listBox1.Text + "')` 中的 N 是什么意思?可能将单引号向左移动一个空格,以便它也包含 N。
  • N 用于 SQL Server 上的 Unicode Mr @Ash :)
  • 嘿,谢谢你的关心,但这是一个学校项目,没有人测试我的 SQLI。

标签: c# sql-server winforms


【解决方案1】:
SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "'

将返回一个表,因此在插入语句中使用它是错误的。

不使用this,而是单独执行这条命令,然后获取返回值,然后单独执行insert语句

【讨论】:

  • ...我什至不知道从你的任何答案开始。我建议您了解您要回复的主题。
【解决方案2】:

只需删除 SELECT 语句周围的单引号

command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + 
         "(SELECT ProductId FROM Products WHERE ProductName =N'" + listbox.Text +"'), " +
         "'" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");

但如果您的任何列表框项目包含单引号,此代码将失败。
我已经阅读了您关于 SQL 注入在这里不是问题的评论,但即使在学校作业中使用它也是一个好习惯。至少改成

string itemName = listBox1.Text.Replace("'", "''");
command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + 
         "(SELECT ProductId FROM Products WHERE ProductName =N'" + itemName +"'), " +
         "'" + itemName + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");

【讨论】:

    【解决方案3】:

    需要替换为这个

      command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + "(SELECT IdProduct FROM Products WHERE ProductName =N'" + listBox1.Text + "'),'" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");
    

    【讨论】:

      【解决方案4】:

      正如其他人所说,您应该使用参数化查询来克服这个问题。但是要“按原样”回答您的问题...

      您需要双引号。查看这一点的最佳方法是存储到字符串中并调试/写入跟踪。如何在此处双重关闭查询的示例:How to insert text with single quotation sql server 2005

      您的查询字符串将包含如下内容:

      INSERT INTO DisplayOrders Values ('1234','(SELECT ProductId FROM Products WHERE ProductName =N'Fred')'...
      

      但它确实应该包含这样的内容(注意'''):

      INSERT INTO DisplayOrders Values ('1234','(SELECT ProductId FROM Products WHERE ProductName =N'''Fred''')'...
      

      否则,您将关闭 INSERT Values 而不是 SELECT 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-15
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多