【问题标题】:VBscript call stored procedure from MySQL with output parameters [duplicate]VBscript使用输出参数从MySQL调用存储过程[重复]
【发布时间】:2022-02-19 22:36:38
【问题描述】:

[编辑 20220219]

使用下面的 VBSCRIPT CODE 解决

   SQL = " CALL NewCheckData(@pOld); "
   cn.execute(SQL)   
   
   SQL = " SELECT @pOld; "
   Set RS = cn.execute(SQL)
   
   pOld = cInt(RS("@pOld"))

[编辑 20220219]

[编辑]

我在 MySQL 数据库上有一个存储过程。

它只取参数的 COUNT ROWS 并返回该参数的值。

我想调用这个存储过程来为我的 VBscript 代码中的变量赋值。

这是 MySql 例程(存储过程)尝试和工作。

CREATE DEFINER=`user`@`%` PROCEDURE `NewCheckData`(OUT pOld INT (11))
BEGIN

SELECT
    COUNT(*) tOld INTO pOld
FROM
    `DoTable` 
WHERE
    DATE( myDATE ) = CURRENT_DATE;

END

VBSCRIPT 代码如下

   On Error Resume Next
   
   Const adCmdStoredProc = 4
   Const adInteger = 3
   Const adVarWChar = 202
   Const adParamInput = &H0001
   Const adParamOutput = &H0002
   Const adParamReturnValue = &H0004

   Set cn = CreateObject("ADODB.Connection")
   cn.Open "DRIVER={MySQL ODBC 5.1 Driver};SERVER=XXX;PORT=3306;DATABASE=XXX;USER=XXX;PASSWORD=XXX;OPTION=3;"  
   cn.CommandTimeout = 10000
   
   Set cmd = CreateObject("ADODB.Command")
   
   With cmd
      Set .ActiveConnection = cn
          .CommandText = "NewCheckData"
          .CommandType = adCmdStoredProc
          .Parameters.Append .CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue )
          .Parameters.Append .CreateParameter("@pOld", adInteger, adParamOutput, 11)
          .Execute
          parmval = .Parameters(0).Value
   End With
   
   cn.Close()
   Set cn = Nothing

   If Err.Number <> 0 Then
     WScript.Echo "Error in : " & Err.Description
     Err.Clear
   End If
   On Error GoTo 0
Error or messagebox

错误或消息框

任何建议,请。

[老问题]

我正在使用 VBSCRIPT 并使用存储过程 MySQL。

我必须得到存储过程输出参数的值。

这是 MySql 例程存储过程)尝试和工作

CREATE DEFINER=`user`@`%` PROCEDURE `CheckData`(OUT pOld INT (11))
BEGIN

SELECT
    COUNT(*) tOld INTO pOld
FROM
    `DoTable` 
WHERE
    DATE( myDATE ) = CURRENT_DATE;

END

VBSCRIPT 代码如下

   Set cn = CreateObject("ADODB.Connection")
   cn.Open "DRIVER={MySQL ODBC 5.1 Driver};SERVER=XXX;PORT=3306;DATABASE=XXX;USER=XXX;PASSWORD=XXX;OPTION=3;"  
   cn.CommandTimeout = 1000 

   Set objCommandSec = CreateObject("ADODB.Command")
   objCommandSec.ActiveConnection = cn
   objCommandSec.CommandType = 4
   objCommandSec.CommandText = "CheckData"

   objCommandSec.Parameters.Refresh

   objCommandSec.Parameters.append objCommandSec.createParameter("@pOld", adInteger, adParamReturnValue) <<< error line
   objCommandSec.execute , , adExecuteNoRecords
   pOld = objCommandSec.Parameters("@pOld").value

   MsgBox(pOld) 
   
   cn.Close()
   Set cn = Nothing

错误或消息框第 15 行

Error 'Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another'

任何建议,请。

【问题讨论】:

  • 你设置了错误的ParameterType,它应该是adParamOutput而不是adParamReturnValue。见ParameterDirectionEnum
  • @user692942 谢谢我已将VBSCRIPT codeadParamReturnValue 编辑为adParamOutput。同样的错误
  • @Akina True。我已经在 MySql 中编辑了 SP。
  • @EdwardSheriffCurtis 认为您还需要在 adParamOutput 参数上指定 Size。另外,您是否定义了“ADO 常量”、adIntegeradParamOutput 等?例如,您应该有 Const adInteger = 3,因为 VBScript 不会自动知道 ADO 命名常量。
  • @Akina True。我已经在 MySql 中编辑了 SP。谢谢

标签: mysql stored-procedures vbscript


【解决方案1】:

编辑:我没有考虑并提到以下代码示例正在访问 MS-SQL DB。因此行为可能会有所不同。

我不再使用 .VBS,但我相信您使用的是“Windows 脚本宿主”环境,我认为它不会有太大的不同。过去,我使用 WSH 和 .JS 多次完成了与您在上面多次演示的相同的事情。当我明确添加参数定义时,我也总是遇到问题。从那以后我了解到对我来说 .refresh() 是完全足够的。因此,我现在离开 .createParameter 并简单地为命名参数提供所需的值:

var jsADO = {}; 
jsADO.objConn = new ActiveXObject("ADODB.Connection");
jsADO.objConn.Open("Provider=SQLOLEDB.1;...");
jsADO.cmd_insertShare = new ActiveXObject("ADODB.Command");
var cmd = jsADO.cmd_insertShare;
cmd.ActiveConnection = jsADO.objConn;
cmd.CommandType = adCmdStoredProc; // 4
cmd.CommandText = "usp_insertShare";
cmd.Prepared = true;
cmd.NamedParameters = true;
cmd.Parameters.Refresh()

...

var sqlRec;
var cmd = jsADO.cmd_insertShare;
cmd.Parameters("@p_Server")      = "myServer";
cmd.Parameters("@p_Name")        = "myShare";
cmd.Parameters("@p_Description") = "myShare Desc";
cmd.Parameters("@p_LocalPath")   = "sharePath";
sqlRec = cmd.Execute(null, null, 0);

语法确实不同,但我希望主旨清楚。

总而言之,我想你已经明白了,只需尝试将 .createParameter 函数排除在外,只设置命名参数值即可。

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多