我有两个地方需要使用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以外的其他地方都说不然。
为什么第二个命令会抛出无效的语法错误?
答案 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}}