【问题标题】:SQLParameter incorrect syntaxSQLParameter 语法不正确
【发布时间】:2014-12-11 03:48:29
【问题描述】:

我有 2 个地方需要使用 SQLParameter 来解析 SQL。一个有效,一个无效,我不知道为什么第二个无效。

第一个起作用的如下:

   SqlCommand getShopDbNameCommand = new SqlCommand("SELECT TOP 1 [mappeddbName] FROM [ECM].[dbo].[EcmShop]" +
        "WHERE [LicencePassCode] = @licCode AND [iPadLocation] = @shopId", this.mainConnection);
    getShopDbNameCommand.Parameters.Add(new SqlParameter("licCode", currUser.LicCode));
    getShopDbNameCommand.Parameters.Add(new SqlParameter("shopId", currUser.ShopID));

这行得通。最重要的是,我读过的大多数教程都说我不必在new SqlParameter 内的参数名称前有一个@,我只需要在命令文本本身内部参数名称前的@

我尝试运行的第二个命令如下:

  string getAuthCommandText = "SELECT * FROM [" + shopDbName + "].[dbo].[MessageLink]" +
  "WHERE [objectname] LIKE %" + "@compareStringA"+ "% OR [objectname] LIKE %" + "@compareStringB" +"%";
  SqlCommand getAuthCommand = new SqlCommand(getAuthCommandText, this.mainConnection);
  getAuthCommand.Parameters.Add(new SqlParameter("compareStringA", "ABRAUTH"));
  getAuthCommand.Parameters.Add(new SqlParameter("compareStringB", "ABRSAUTH"));

这不起作用并引发无效的语法错误。使用断点,它看起来仍然像命令试图将文字 @compareString 字符串传递给 SQL,这就是导致问题的原因。我在 SOF 上看到其他帖子说在定义 new SqlParameter 对象时使用文字参数名称(意思是包括 @),但在 SoF 之外的任何地方都另有说法。

第二个命令会抛出无效语法错误的任何原因?

【问题讨论】:

  • 我看到你这样做了this.mainConnection,你是否只打开一个连接并在整个代码中重用连接? SqlConnection 不是为这种方式设计的,它使用Connection Pooling 并且应该做的只是打开并处理许多短期连接。当你处理一个连接时,它会让连接打开到数据库一段时间,如果它看到一个使用相同连接字符串打开的新连接,它将重新使用旧连接。
  • 我看到您这样做了this.mainConnection,您是否只打开一个连接并在整个代码中重用该连接? SqlConnection 不是为这种方式设计的,它使用 Connection Pooling 并且应该做的只是打开并处理许多短期连接。当你处理一个连接时,它会让连接打开到数据库一段时间,如果它看到一个使用相同连接字符串打开的新连接,它将重新使用旧连接。

标签: c# sql sqlparameter


【解决方案1】:

您的 LIKE 语句必须在单引号内

SELECT * FROM Customers WHERE City LIKE '%s%';

【讨论】:

  • 虽然是真的,但他们还需要将% 添加到他们传递给参数的值中才能正常工作。或者在查询中连接它们。
【解决方案2】:

我读过的大部分教程都说我不必在新的 SqlParameter 内的参数名称前加上@,

SqlParameter 的 C# 代码不关心您是否将 @ 添加到 Parameters 集合时,它会为您在幕后放置 @

对于您的查询,不正确的方法是您实际上将在 sql 中添加 3 个字符串,两个 '%' 和您的参数。我也在更改添加参数以显式设置数据类型的方式,最好使用字符串。

  string getAuthCommandText = "SELECT * FROM [" + shopDbName + "].[dbo].[MessageLink]" +
  "WHERE [objectname] LIKE ('%' + @compareStringA + '%') OR [objectname] LIKE ('%' + @compareStringB +'%')";
  SqlCommand getAuthCommand = new SqlCommand(getAuthCommandText, this.mainConnection);
  getAuthCommand.Parameters.Add("@compareStringA", SqlDbType.VarChar, 20).Value = "ABRAUTH"; //I had to guess on your datatype, I just did varchar(20), change as appropriate.
  getAuthCommand.Parameters.Add("@compareStringB", SqlDbType.VarChar, 20).Value = "ABRSAUTH";

【讨论】:

    【解决方案3】:

    试试这个:

     string getAuthCommandText = "SELECT * FROM [" + shopDbName + "].[dbo].[MessageLink] " +
     "WHERE [objectname] LIKE " + "@compareStringA"+ " OR [objectname] LIKE " + "@compareStringB" +"";
     SqlCommand getAuthCommand = new SqlCommand(getAuthCommandText, this.mainConnection);
     getAuthCommand.Parameters.Add(new SqlParameter("compareStringA", "%ABRAUTH%"));
     getAuthCommand.Parameters.Add(new SqlParameter("compareStringB", "%ABRSAUTH%"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多