我有以下经典的 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/