我正在从动态生成的(尽管经过大量清理的)SQL查询过渡到参数化的SQL,并且在变量名称方面遇到了一些麻烦。
我正在使用用jScript编码的Classic ASP。
下面的代码将等级值(1-5)放入数据库中。首先,它删除该对象的所有用户先前的评分,然后将新的评分写入数据库。该函数已经收到,并且我已经解析了Rating变量(一个TinyInt)。也已发送均为整数的UserID和PgID值。
我已经通过用问号替换@ UserID,@ PgID和@Rating,删除DECLARE并按正确的顺序放置Append / CreateParemeter行(每个对应一个?)来完成这项工作。它确实涉及多次调用Append / CreateParameter行(对于UserID的每个实例一次),这很草率。
这段代码不会引发任何错误,但不会向数据库写入任何内容。无论如何,我不知道为什么它可以在适当的位置使用问号(和重复的参数),但不能在声明的vars上使用。
在Classic ASP jScript中使用参数化SQL时,如何使用命名变量?
如果没有办法,是否有办法避免每次我需要(例如UserID)每次都重复相同的Append / CreateParamenter行。
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时我需要一些简单的方法。在我将其放到这里之前,它还被进一步简化(并再次测试)。我可以建立更复杂的查询。是的,我将编写存储过程,但是稍后,在一切正常之后。
如果要避免重复,可以继续使用DECLARE变量并一次设置其值:
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);"