调用Oracle存储过程时使用ADODB抛出错误的旧VB6 App

时间:2011-03-21 21:03:42

标签: sql oracle stored-procedures vb6 adodb

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

以下是我在非工作开发框中遇到的错误:

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;

如您所见,唯一的参数是return参数,它是结果记录集

来自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,它将抛出相同的错误。基于此,我开始认为非工作机器表现出正确的行为,我需要修复代码。

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

感谢任何帮助,这个错误让我疯狂。

1 个答案:

答案 0 :(得分:1)

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

检查结果集中的任何字符串是否长于256个字符或某些字符串。然后从结果集中省略该记录,看它是否有效。