【发布时间】: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