Использование переменных в параметризованном SQL Classic ASP - PullRequest
3 голосов
/ 16 июня 2011

Я перехожу от динамически генерируемых (хотя и сильно санированных) SQL-запросов к параметризованному SQL, и у меня возникают некоторые проблемы с именами переменных.

Я использую Classic ASP, закодированный в jScript.

Приведенный ниже код принимает значение рейтинга (1-5) и помещает его в базу данных.Сначала он удаляет все предыдущие оценки пользователя для этого объекта, а затем записывает новый рейтинг в базу данных.Функция уже получила, и я проанализировал переменную Rating (TinyInt).Значения UserID и PgID, оба целочисленные, также были отправлены.

Я уже получил эту работу, заменив @UserID, @PgID и @Rating на вопросительные знаки, удалив DECLARE и поместив Append /Строки CreateParemeter в правильном порядке (по одному для каждого?).Однако это требует многократного вызова строки Append / CreateParameter (по одному разу для каждого экземпляра UserID), что просто небрежно.

Этот кусок кода не выдает никаких ошибок, но ничего не пишетв базу данных.В любом случае, я не знаю, почему он будет работать с установленными вопросительными знаками (и дублирующими параметрами), но не будет работать с объявленными переменными.

Как я могу использовать именованные переменные при использовании параметризованного SQLв классическом ASP jScript?

Если нет способа сделать это, есть ли способ избежать необходимости повторять одну и ту же строку Append / CreateParamenter каждый раз, когда мне нужно, например,UserID?

var sqlReview = "DECLARE @UserID AS Int, @PgID AS Int, @Rating AS TinyInt;"
sqlReview += "DELETE FROM PGrating WHERE (UserID = @UserID) AND (PgID = @PgID);"
sqlReview += "INSERT INTO PGrating (InsertDate, PgID, UserID, Rating) VALUES (GETDATE(), @PgID, @UserID, @Rating);"

var thisConnection = Server.CreateObject("ADODB.Connection");
thisConnection.connectionString = connectString;
thisConnection.Open();

var thisCommand = Server.CreateObject("ADODB.Command");
thisCommand.ActiveConnection = thisConnection;
thisCommand.CommandText = sqlReview;
thisCommand.CommandType = adCmdText;
thisCommand.Parameters.Append(thisCommand.CreateParameter("@UserID", adSmallInt, adParamInput, 2, UserID));
thisCommand.Parameters.Append(thisCommand.CreateParameter("@PgID", adInteger, adParamInput, 4, PgID));
thisCommand.Parameters.Append(thisCommand.CreateParameter("@Rating", adTinyInt, adParamInput, 1, Rating));
var rs = thisCommand.Execute();
thisCommand = null;
thisConnection = null;

Я знаю, что могут быть более простые способы помещения оценок в базу данных, но этот пример был создан главным образом потому, что он был прост, и мне нужно было что-то простое, пока я изучал, как использовать параметризованныйSQL.Это было также упрощено далее (и проверено снова) прежде, чем я поднял это здесь.Я могу создавать более сложные запросы, как только получу этот рабочий.И да, я напишу хранимые процедуры, но это будет позже, после того, как все заработает.

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Если вы хотите избежать повторения, вы можете продолжить DECLARE ваши переменные и установить их значение один раз:

var sqlReview = "DECLARE @UserID AS Int = ?, @PgID AS Int = ?, @Rating AS TinyInt = ?;"
sqlReview += "DELETE FROM PGrating WHERE (UserID = @UserID) AND (PgID = @PgID);"
sqlReview += "INSERT INTO PGrating (InsertDate, PgID, UserID, Rating) VALUES (GETDATE(), @PgID, @UserID, @Rating);"

Выше предполагается, что SQL Server 2008 или выше. В более низких версиях вам потребуется отдельная строка для назначения:

var sqlReview = "DECLARE @UserID AS Int, @PgID AS Int, @Rating AS TinyInt;"
sqlReview += "SELECT @UserID = ?, @PgID = ?, @Rating = ?;"
sqlReview += "DELETE FROM PGrating WHERE (UserID = @UserID) AND (PgID = @PgID);"
sqlReview += "INSERT INTO PGrating (InsertDate, PgID, UserID, Rating) VALUES (GETDATE(), @PgID, @UserID, @Rating);"
2 голосов
/ 17 июня 2011

При использовании adCmdText вы должны объявить свои параметры с помощью ? заполнителей.При добавлении параметров ADO определяет последовательность параметров на основе порядка их добавления.

Однако, после преобразования этого в хранимую процедуру вы можете использовать именованные параметры, как пытаетесь сделать, и последовательность будетне важно.Но вам придется переместить ваш запрос в сохраненный процесс, чтобы получить желаемые результаты.

См. Эту статью MSDN для получения дополнительной информации.

0 голосов
/ 16 июня 2011

Вы используете поставщика ADO, а не поставщика SQL Server.

Синтаксис параметризованных запросов ADO для параметров, а не имен ?.

...