2014-12-10 3 views
0

У меня есть 2 места, где мне нужно использовать SQLParameter для разбора SQL. Один работает, а другой нет, и я не могу понять, почему второй не работает.SQLParameter неверный синтаксис

Первое, что работает следующая:

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, и это вызывает проблему. Ive видел другие сообщения в SOF, которые говорят использовать имя литерала при определении объектов new SqlParameter (имеется в виду @), но везде вне SoF говорят иначе.

Любая причина, по которой вторая команда выдавала бы недопустимые синтаксические ошибки?

+0

Я вижу, что вы делаете 'this.mainConnection', вы только открываете одно соединение и повторно используете соединение по всему вашему коду? 'SqlConnection' не был предназначен для использования таким образом, он использует [Пул соединений] (http://msdn.microsoft.com/en-us/library/8xx3tyca (v = vs.110) .aspx), и что должно быть сделано просто открыто и утилит много коротких замыканий. Когда вы удаляете соединение, он оставляет соединение открытым в базе данных ненадолго, если он видит, что новое соединение открывается с использованием той же строки соединения, оно будет повторно использовать старое соединение. –

+0

Я вижу, что вы делаете 'this.mainConnection', вы только открываете одно соединение и повторно используете соединение по всему вашему коду? 'SqlConnection' не был предназначен для использования таким образом, он использует [Пул соединений] (http://msdn.microsoft.com/en-us/library/8xx3tyca (v = vs.110) .aspx), и что должно быть сделано просто открыто и утилит много коротких замыканий. Когда вы удаляете соединение, он оставляет соединение открытым в базе данных ненадолго, если он видит, что новое соединение открывается с использованием той же строки соединения, оно будет повторно использовать старое соединение. –

ответ

3

ваши LIKE заявления должны быть в одинарных кавычках

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

Хотя они истинны, они также должны добавить '%' к значению, которое они передают параметру для этого. Это или объединить их в запросе. – juharr

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

большинство из учебников я прочитал все говорят, что я не должен иметь a @ перед именем параметра внутри нового SqlParameter,

Код C# для SqlParameter не волнует, если вы положили @ спереди или нет, добавив его в коллекцию Parameters, он поместит @ за кулисами.

Для вашего запроса, который не работает, правильный способ сделать это, у вас на самом деле будет 3 строки, которые вы добавляете вместе в sql, два '%' и ваш параметр. Я также изменяю способ добавления параметров, чтобы явно установить тип данных, лучше сделать это со строками.

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"; 
Смежные вопросы