SQLParameter 语法不正确

本文关键字:不正确 语法 SQLParameter | 更新日期: 2023-09-27 18:33:49

我有 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 以外的任何地方都另有说明。

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

SQLParameter 语法不正确

您的 LIKE 语句必须位于单引号内

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

我读过的大多数教程都说我不必在新 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";

试试这个:

 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%"));