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