【问题标题】:Calling SQL stored procedure with input parameter使用输入参数调用 SQL 存储过程
【发布时间】:2018-06-05 08:17:26
【问题描述】:

我需要编写一个小的 VBScript 来调用带有输入变量的 SQL 过程。我对 VBscript 没有太多经验,而且我遇到了一个我找不到解决方案的错误。我收到的错误是:

OnNewRecord(第 14 行):[ODBC Firebird 驱动程序][Firebird]过程 TEST 的动态 SQL 错误输入参数不匹配

我写的VBScript是:

Const Connection = "DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=C:\Users\wouter\FOR-TESTING.fdb;"
Const adParamInput = 1
Const adInteger = 3
Set myConn = CreateObject("ADODB.Connection")
myConn.Open Connection

Set spCommand = CreateObject("ADODB.Command")
spCommand.Commandtext = "TEST" 
spCommand.CommandType = 4

Set parameter = spCommand.CreateParameter(, adInteger, adParamInput, 4, 5)

Set spCommand.ActiveConnection = myConn
spCommand.Execute 
myConn.Close

这个 VBscript 正在调用以下过程:

CREATE OR ALTER PROCEDURE TEST (ID INTEGER)
AS BEGIN
UPDATE MATERIAL_LABEL SET PRINTED = 'T', HANDLED_DATE = CURRENT_TIMESTAMP 
WHERE ID = :ID;
END

ID INTEGER 应该是一个变量输入,但为了测试我使用数值 5 的代码。我认为这与需要不同类型输入的过程有关,但我找不到。

【问题讨论】:

标签: sql vbscript parameters procedure


【解决方案1】:

正如 Ansgar Wiechers 所说,您必须通过附加参数将参数传递给存储过程:

spCommand.Parameters.Append parameter

【讨论】:

    【解决方案2】:

    我通过使用不同的方法插入我的数值解决了这个问题:

    Const Connection = "DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=C:\Users\wouter\FOR-TESTING.fdb;"
    Set myConn = CreateObject("ADODB.Connection")
    
    myConn.Open Connection
    
    SQL = "execute procedure TEST 5"
    Set dbconn = CreateObject("ADODB.Connection")
    dbconn.Open connection
    dbconn.Execute(SQL)
    myConn.Close
    

    -- 更新--

    由于 Ansgar Wiechers 和 Mihai Adrian 给了我错误的原因,并且 Geert bellekens 警告我存在 SQL 注入的风险,我尝试将“附加行”添加到我的 VBScript 中,这也很完美!

    这是我完成的VBScript:

    Const Connection = "DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=C:\Users\wouter\FOR-TESTING.fdb;"
    Const adParamInput = 1
    Const adInteger = 3
    Set myConn = CreateObject("ADODB.Connection")
    myConn.Open Connection
    
    Set spCommand = CreateObject("ADODB.Command")
    spCommand.Commandtext = "TEST" 
    spCommand.CommandType = 4
    
    Set parameter = spCommand.CreateParameter(, adInteger, adParamInput, 4, 5)
    spCommand.Parameters.Append parameter
    
    Set spCommand.ActiveConnection = myConn
    spCommand.Execute 
    myConn.Close
    

    谢谢!

    【讨论】:

    • 我更喜欢您以前的方法 -> 没有 SQL 注入风险。尝试使参数工作正常似乎是一个更好的主意。
    • 根据建议调整答案。
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2012-11-24
    • 2019-08-13
    相关资源
    最近更新 更多