【问题标题】:Old VB6 App using ADODB throwing error when calling Oracle Stored Procedure调用 Oracle 存储过程时使用 ADODB 的旧 VB6 应用程序抛出错误
【发布时间】:2011-07-20 00:21:59
【问题描述】:

这必须以某种方式与提供程序相关,因为它在我的开发盒上工作正常,但在另一个开发盒上不起作用。

这是我在非工作开发盒上遇到的错误:

ORA-00604:递归 SQL 级别 1 发生错误

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

ORA-06512:第 26 行

ORA-06550:第 1 行,第 7 列:

PLS-00306:调用“LISTAVAILSUBMISSIONS”时参数的数量或类型错误

ORA-06550:第 1 行,第 7 列:

PL/SQL:语句被忽略

这里是 Oracle 过程:

    Procedure ListAvailSubmissions (avail_submission in out rc_avail_submission)
is
Begin
     open avail_submission for
          select submission_id from nais_submissions
          where condition = 'ONLINE'
          and status in ('ACTIVE','LOGGED')
          order by submission_id desc;
Exception
    When no_data_found then
         v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
         utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id: No Data Found');
         utl_file.fclose(v_output);

    When others then
         v_error_code := sqlcode;
         v_error_message := substr (sqlerrm, 1, 300);
         v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
         utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id:'|| v_error_code ||':'|| v_error_message);
         utl_file.fclose(v_output);

End ListAvailSubmissions;

如您所见,唯一的参数是返回参数,即结果记录集

来自 VB 的调用非常简单。

Public Function GetTestRequests() As ADODB.Recordset
          Dim rsADO As New ADODB.Recordset
          Dim cmdCommand As New ADODB.Command

          Set cmdCommand.ActiveConnection = cnnADO //Ive already verified the connection is good
          cmdCommand.CommandText = "ListAvailSubmissions"
          Set rsADO = cmdCommand.Execute(, , adCmdStoredProc)
          Set GetTestRequests = rsADO

End Function

令人沮丧的部分是它在一台机器上工作,而不是在另一台机器上工作。我使用 msdaora.1 作为提供程序,并且我已经使用 MS CompChecker 工具验证了两台机器具有相同的 MDAC 版本。我确实发现的一件事是,如果我将工作机器切换到使用 OraOLEDB 而不是 msdaora.1,它将抛出相同的错误。基于此,我开始认为不工作的机器表现出正确的行为,我需要修复代码。

我做了很多研究,我认为这与 in out 参数有关,并试图将 ADODB.Recordset 设置为等于该参数。我尝试将参数更改为仅输出,但没有帮助,仍然出现相同的错误。

感谢您的帮助,这个错误让我发疯了。

【问题讨论】:

  • “我开始认为非工作机器表现出正确的行为......我认为它与 in out 参数有关并试图设置 ADODB。记录集等于参数”——我认为你的想法是正确的。

标签: sql oracle stored-procedures vb6 adodb


【解决方案1】:

我认为您表中的字符串之一超出了 OLEDB 字符串限制。对于不同的驱动程序,此限制的定义不同——因此您会看到一个驱动程序出错而另一个驱动程序正常工作。我相信,这个限制也可以在逐台机器的基础上进行配置,因此你有一台机器工作而另一台机器不工作。

检查您的结果集中是否有任何字符串超过 256 个字符或一些非常长的字符。然后从您的结果集中省略该记录以查看它是否有效。

【讨论】:

  • 最后,我只是在非工作机器上升级了驱动程序并继续前进。我没有更多时间花在这个问题上了。
猜你喜欢
  • 2014-12-15
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
相关资源
最近更新 更多