当前位置: 首页 > 面试题库 >

在经典ASP参数化SQL中使用变量

邓建柏
2023-03-14
问题内容

我正在从动态生成的(尽管经过大量清理的)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变量并一次设置其值:

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


 类似资料:
  • 问题内容: 在绝对紧急的情况下,我试图浏览我的网站并添加参数化查询。我是新手,才刚刚了解它们。 我的问题是,我对连接类型知之甚少,我看到的所有示例都在使用另一种连接方法,这使我感到困惑。我不想改变连接数据库的方式,因为它在很多页面上,我只是想更新我的查询以使其更安全。 这就是我一直连接到数据库的方式: 这是带有参数的SQL位: 显然它不起作用,但是我需要知道我是否可以使用已有的连接真正实现此目标,

  • 我们正在迁移到Azure和有一个应用程序,仍然在经典的ASP。我们已经将它需要与之通信的数据库迁移到Azure中的SQL数据库。 我们在一个运行Server2008 R2的VM中运行这个

  • 问题内容: 我一直在寻找如何从经典的asp调用存储过程并将参数传递给它的方法,这是我的存储过程,可以正常工作 和到目前为止的我的vbscript代码- 问题答案: 您正在寻找Parameters属性。 哦,劳迪,我又在写VBScript。

  • 问题内容: 我正在尝试从w3scools修改脚本,以结合使用asp和ajax来查询数据库并返回结果。 这是代码: 我想将select字段替换为2个输入字段。 有人可以告诉我如何修改javascript,以便输入值和querystring一起传递,以及需要在表单上更改哪些内容以调用函数。 谢谢 问题答案: 这完全取决于您希望页面如何操作。您能更具体一点吗? 当您说“输入值”时,您的意思是一个文本框?

  • 我正在尝试为我们网站上运行在单独服务器上的经典asp部分实现单点登录。我已经使用simpleSAMLphp在另一台服务器上实现了php SSO。我正在尝试使用shibboleth来实现asp/IIS的经典功能。我已经到达了我们身份提供者的登录页面,但一旦我进行身份验证,我就会卡在/SAML2/POST上,并且有一个网页说找不到我服务器的ip地址。我曾尝试实施在论坛中找到的修复,但仍然没有取得任何进

  • 问题内容: 如何访问客户端发布到经典ASP服务器的内容?我知道有Request.Forms变量,但是客户端的请求不是使用Form发出的。客户端请求的主体只是使用标准POST语句生成的字符串。谢谢 问题答案: 如果客户端发送的请求的内容类型不是表单数据,则需要读取请求字节。在这种情况下,请求不是可通过名称- 值对访问的表单数据,因此您不能使用Request.Form集合。我建议研究BinaryRea