stored-procedures - 将存储过程更改为内联sql

标签 stored-procedures vbscript asp-classic

我有以下经典的 asp 工作,调用数据库中的存储过程。我想将其转换过来,这样它就不会调用存储过程,而是传入 sql,添加 prams 然后执行它。

我尝试了各种方法,但无法使其正常工作。 有人可以转换这个例子吗?

此外,在使用参数传递 sql 时,似乎很难获得合理的错误消息。有没有办法查看此调用的痕迹,以便我们了解导致问题的原因?

Set cmd = server.createobject("ADODB.Command")
cmd.ActiveConnection = theDatabase
cmd.CommandType = adCmdStoredProc
cmd.commandText = "AddResponse"

cmd.Parameters("@id") = id
cmd.Parameters("@pc") = pc
cmd.Parameters("@idDate") = now

cmd.Execute , , adExecuteNoRecords
set cmd = Nothing

存储过程定义

ALTER PROCEDURE [dbo].[AddResponse] @id NVARCHAR(12), @pc NVARCHAR(12), @idDate  datetime
AS
BEGIN
    SET NOCOUNT ON;
    select * from EmailResponse 
    if not exists (SELECT id, projectCode FROM EmailResponse WHERE id = @id and projectCode = @pc)
    begin 
        INSERT INTO EmailResponse (id, projectCode, dateEntered) VALUEs(@id, @pc, @idDate) 
    end
END

编辑:
以下是我给大家的解答。
哇,stackoverflow 太棒了,因为每个人都像你们一样
他们花一点时间帮助别人。

选择*是一个错误

我必须维护一些旧的 asp 代码并将其转换为使用存储过程。
存储过程是“大多数”时间的最佳选择。
由于各种原因,有时最好将 sql 放在代码中。
(快速测试和开发,无需访问数据库等)
所以我需要知道如何处理这两种方式。

cmd.Parameters.Refresh
如果没有这个调用,我的代码可以正常工作。
真的有必要吗?
阅读它应该做什么并没有太多帮助,为什么我需要使用它

理解类型对于所有类型的编程都至关重要。
这正是我所要求的,甚至更多。
Carl Prothman - 数据类型映射
谢谢你!

我还想知道如何设置记录集对象,尽管我忘了问。也谢谢你!
set rs = server.createObject("adodb.recordset")
rs =- cmd.执行

我三个都工作了。 对于任何对此感兴趣的人来说,可以使用经过测试的代码来展示所有三种方法。

' Stored proc example
' ------------------------------------------
dim theDatabase, cmd, id, pc
theDatabase    = "Driver={SQL Server}; Server=10.10.10.10,1433; Database=Test; uid=TestUser; pwd=TestPass;"

id = cleanInt(request.querystring("id"))
pc = sqlSafe(clean(request.querystring("pc")))

if pc<>"" and id<>"" then
    Set cmd = server.createobject("ADODB.Command")

    cmd.ActiveConnection = theDatabase
    cmd.CommandType      = adCmdStoredProc
    cmd.commandText      = "AddResponse"

    cmd.Parameters("@id")     = id
    cmd.Parameters("@pc")     = pc
    cmd.Parameters("@idDate") = now

    cmd.Execute , , adExecuteNoRecords
    set cmd = Nothing
end if


' Inline SQl with ? example
' ------------------------------------------
dim theDatabase, cmd, id, pc
theDatabase    = "Driver={SQL Server}; Server=10.10.10.10,1433; Database=Test; uid=TestUser; pwd=TestPass;"

id = cleanInt(request.querystring("id"))
pc = sqlSafe(clean(request.querystring("pc")))

if pc<>"" and id<>"" then
    Set cmd = server.createobject("ADODB.Command")

    cmd.ActiveConnection = theDatabase
    cmd.CommandType      = adCmdText
    cmd.CommandText      = _
        "if not exists (SELECT id, projectCode FROM EmailResponse WHERE id = ? and projectCode = ?)" &_
        "begin INSERT INTO EmailResponse (id, projectCode, dateEntered) VALUEs(?, ?, ?) end "

    cmd.Parameters.Append cmd.CreateParameter("@id",     adInteger,     adParamInput,   ,  id)
    cmd.Parameters.Append cmd.CreateParameter("@pc",     adVarchar,     adParamInput, 12,  pc)
    cmd.Parameters.Append cmd.CreateParameter("@id2",    adInteger,     adParamInput,   ,  id)
    cmd.Parameters.Append cmd.CreateParameter("@pc2",    adVarchar,     adParamInput, 12,  pc)        
    cmd.Parameters.Append cmd.CreateParameter("@idDate", adDBTimeStamp, adParamInput, -1,  now)

    cmd.Execute , , adExecuteNoRecords
    set cmd = Nothing
end if

' Inline SQl with @ example
' ------------------------------------------
dim theDatabase, cmd, sql, id, pc
theDatabase    = "Driver={SQL Server}; Server=10.10.10.10,1433; Database=Test; uid=TestUser; pwd=TestPass;"

id = cleanInt(request.querystring("id"))
pc = sqlSafe(clean(request.querystring("pc")))

if pc<>"" and id<>"" then
    Set cmd = server.createobject("ADODB.Command")

    sql = ""
    sql = sql & "SET NOCOUNT ON;" & vbCrLf
    sql = sql & "DECLARE @id NVARCHAR(12)" & vbCrLf
    sql = sql & "DECLARE @pc NVARCHAR(12)" & vbCrLf
    sql = sql & "DECLARE @idDate DATETIME" & vbCrLf
    sql = sql & "SELECT @id = ?, @pc = ?, @idDate = ?" & vbCrLf
    sql = sql & "IF NOT EXISTS (SELECT id, projectCode FROM EmailResponse WHERE id = @id and projectCode = @pc)" & vbCrLf
    sql = sql & "INSERT INTO EmailResponse (id, projectCode, dateEntered) VALUEs(@id, @pc, @idDate);"

    cmd.ActiveConnection = theDatabase
    cmd.CommandType      = adCmdText
    cmd.CommandText      = sql
    cmd.Prepared = true
    cmd.Parameters.Append cmd.CreateParameter("@id",     adInteger,     adParamInput,   ,  id)
    cmd.Parameters.Append cmd.CreateParameter("@pc",     adVarchar,     adParamInput, 12,  pc)
    cmd.Parameters.Append cmd.CreateParameter("@idDate", adDBTimeStamp, adParamInput, -1,  now)

    cmd.Execute , , adExecuteNoRecords
    set cmd = Nothing
end if

谢谢大家。

最佳答案

要从存储过程切换到内联 SQL,您需要进行更改

cmd.CommandType = adCmdStoredProc

cmd.CommandType = adCmdText

然后您需要将查询添加到命令文本属性:

cmd.CommandText = "SELECT * FROM Orders WHERE CustomerID = ?"

以上行源自 Command Object Parameters example在 MSDN 上。

关于stored-procedures - 将存储过程更改为内联sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119046/

相关文章:

database - 从数据库的所有表中删除所有记录

mysql - 在存储过程中创建临时表

mysql - 使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题

sql server 2008,不能在子查询中使用order by

vbscript - 使用 vbscript 的命令提示符中的多个命令

VBScript Excel 格式化 .xlsx 文件

从 VBS 调用的 Javascript 代码在运行时抛出未指定的错误

security - 反 XSS 和经典 ASP

asp.net-mvc - 如何设置 MVC 路由来处理旧的 ASP 经典页面重定向

mysql - 在虚拟化 Windows 2003 x64 服务器上使用 ASP 连接到 MySQL 数据库