SQLParameter语法不正确

时间:2014-12-10 19:35:03

标签: c# sql sqlparameters

我有两个地方需要使用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

这不起作用并抛出无效的语法错误。使用断点仍然看起来命令正试图将文字new SqlParameter字符串传递给SQL,这就是导致问题的原因。我已经看到SOF上的其他帖子说明在定义@对象时使用文字参数名称(意思是包含{{1}}),但SoF以外的其他地方都说不然。

为什么第二个命令会抛出无效的语法错误?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

  

我读过的大多数教程都说我不必在新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"; 和您的参数。我也在改变添加参数的方式来显式设置数据类型,最好用字符串来做。

{{1}}