【问题标题】:Only Specify Certain Parameters in Command Objects in ADO with VBScript?VBScript 仅在 ADO 中的命令对象中指定某些参数?
【发布时间】:2015-10-07 20:20:15
【问题描述】:

如果我在 SQL Server 中有一个带有多个命名输入参数的存储过程,所有参数的默认值如下:

CREATE PROCEDURE [dbo].[proc_name] 
(   
    @IN_mode CHAR(1) = NULL, /* 'I','U'*/
    @IN_external_identity_id INT = -1,
    @IN_provider_name VARCHAR(45) = NULL,
    @IN_login_id VARCHAR(255) = NULL,
    @IN_email VARCHAR(255) = NULL,
    @IN_ip VARCHAR(45) = NULL,
    @IN_first_name VARCHAR(255) = NULL,
    @IN_last_name VARCHAR(255) = NULL,
    @IN_json_response_raw VARCHAR(8000) = NULL,
    @IN_user_id VARCHAR(255) = NULL,
    @IN_name VARCHAR(255) = NULL
)
AS 
    BEGIN
...

...在vbScript 中我这样调用程序:

Set oSproc = CreateObject("ADODB.Command") 
With oSproc
    .ActiveConnection = oConn
    .CommandText = "bfsp_insert_NEW_EXTERNAL_IDENTITY"
    .CommandType = adCmdStoredProc 
    With .Parameters
        .Append oSproc.CreateParameter("@IN_mode", adChar, adParamInput, 1, "I")
        .Append oSproc.CreateParameter("@IN_external_identity_id", adInteger, adParamInput, 0, -1) '-1 because field isn't needed on new insert
        .Append oSproc.CreateParameter("@IN_provider_name", adVarChar, adParamInput, 45, "FACEBOOK")
        .Append oSproc.CreateParameter("@IN_login_id", adVarChar, adParamInput, 255, getInput("fbNewUserName"))
        .Append oSproc.CreateParameter("@IN_email", adVarChar, adParamInput, 255, oFbUser.email)
        .Append oSproc.CreateParameter("@IN_ip", adVarChar, adParamInput, 46, getUserIp())
        .Append oSproc.CreateParameter("@IN_first_name", adVarChar, adParamInput, 255, oFbUser.first_name)
        .Append oSproc.CreateParameter("@IN_last_name", adVarChar, adParamInput, 255, oFbUser.last_name)
        .Append oSproc.CreateParameter("@IN_json_response_raw", adVarChar, adParamInput, 8000, oFbUser.rawJson)
        .Append oSproc.CreateParameter("@IN_user_id", adVarChar, adParamInput, 255, oFbUser.id)
        .Append oSproc.CreateParameter("@IN_name", adVarChar, adParamInput, 255, oFbUser.name)
    End With 
    .Execute 
End With 
iNewExternalIdentityId = oSproc.parameters("@OUTPUT_originalId").Value 'grabbing the new EXTERNAL_IDENTITY.ID 
Set oSproc = Nothing

我注意到 vbscript create parameter 语句中的参数名称没有按名称链接到 sproc 中的变量。它似乎是根据序数位置匹配的,例如参数 1 匹配参数 1,依此类推。如果我遗漏了一个,比如说,在某个地方的中间,所有剩余的参数将被分配给存储过程中错误的输入变量。

如何在 vbscript 代码中创建参数,以便只发送我需要的选择参数,并且仍然让它们与过程中的参数正确匹配?

【问题讨论】:

  • 尝试.NamedParameters = True,按照msdn.microsoft.com/library/ms675840(免责声明:未经测试)。
  • 否则,另一种选择是添加没有值(或 null)的参数,而不是省略参数。
  • @jeroen-mostert - 有效...我将根据您的建议创建一个正式的答案

标签: sql-server vbscript ado


【解决方案1】:

我正在发布一个正式的答案,其中包含 @jeroen-mostert 的建议。

通过名称传递参数所需的只是将namedParameters 属性添加到命令对象并将其设置为True,如下所示。下面sn -p中的第3行被添加了,否则和原来一样:

Set oSproc = CreateObject("ADODB.Command") 
With oSproc
    .NamedParameters = True
    .ActiveConnection = oConn
    .CommandText = "bfsp_insert_NEW_EXTERNAL_IDENTITY"
    .CommandType = adCmdStoredProc 
    With .Parameters
        .Append oSproc.CreateParameter("@IN_mode", adChar, adParamInput, 1, "I")
        .Append oSproc.CreateParameter("@IN_external_identity_id", adInteger, adParamInput, 0, -1) '-1 because field isn't needed on new insert
        .Append oSproc.CreateParameter("@IN_provider_name", adVarChar, adParamInput, 45, "FACEBOOK")
        .Append oSproc.CreateParameter("@IN_login_id", adVarChar, adParamInput, 255, getInput("fbNewUserName"))
        .Append oSproc.CreateParameter("@IN_email", adVarChar, adParamInput, 255, oFbUser.email)
        .Append oSproc.CreateParameter("@IN_ip", adVarChar, adParamInput, 46, getUserIp())
        .Append oSproc.CreateParameter("@IN_first_name", adVarChar, adParamInput, 255, oFbUser.first_name)
        .Append oSproc.CreateParameter("@IN_last_name", adVarChar, adParamInput, 255, oFbUser.last_name)
        .Append oSproc.CreateParameter("@IN_json_response_raw", adVarChar, adParamInput, 8000, oFbUser.rawJson)
        .Append oSproc.CreateParameter("@IN_user_id", adVarChar, adParamInput, 255, oFbUser.id)
        .Append oSproc.CreateParameter("@IN_name", adVarChar, adParamInput, 255, oFbUser.name)
    End With 
    .Execute 
End With 
iNewExternalIdentityId = oSproc.parameters("@OUTPUT_originalId").Value 'grabbing the new EXTERNAL_IDENTITY.ID 
Set oSproc = Nothing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多