用于Oracle的Microsoft ODBC驱动程序与用于COM ADO的Oracle 12.1 ODBC驱动程序

时间:2018-03-06 20:19:58

标签: c++ oracle com odbc ado

我们正在从用于Oracle的Microsoft ODBC驱动程序(在Server 2012 R2上)切换到在旧式COM C ++程序集上使用的Oracle 12c(12.1)ODBC驱动程序。

我们正在使用msado15.dll进行这些调用。我们用于返回参数的存储过程,即。

// Instantiation
_ConnectionPtr  m_spConnection;
_CommandPtr     spCmd(__uuidof(Command));
_ParameterPtr   spParam(__uuidof(Parameter));
_variant_t      vHold;

spCmd->CommandText = "MyPackage.MyProcedure";
spCmd->CommandType = adCmdStoredProc;

spParam = spCmd->CreateParameter("my_input_param", adDouble, adParamInput, 0, 0);
spCmd->Parameters->Append(spParam);
spParam = NULL;
spParam = spCmd->CreateParameter("my_output_param", adDouble, adParamOutput, 0, 0);
spCmd->Parameters->Append(spParam);
spParam = NULL;

// Call the Proc
spCmd->PutRefActiveConnection(m_spConnection);
try
{
    spCmd->Execute(NULL, NULL, adCmdStoredProc);
}
catch (const _com_error &err)
{
    // We do not get an error here.
    hrRetval = err.Error();
    printf(err.Description());
}
catch (...)
{
    // Nor do we get an error here.
    printf("Error!");
}

vHold = spCmd->Parameters->GetItem("my_output_param")->GetValue();

if (vHold.dblVal <= 0)
{
    printf("I should not get here, but I do!");
}

不再向我们返回预期值。我们回到0,我们不应该。

这在使用Microsoft ODBC Oracle驱动程序的Server 2008上运行良好,但是迁移到Server 2012 R2需要我们转移到Oracle的ODBC驱动程序。这似乎是我们最大的障碍 - 希望有人在此处解决这个问题:)

也进行了一些ODBC跟踪:

MyApp      14c8-a5c ENTER SQLExecDirectW 
    HSTMT               0x09662B08
    WCHAR *             0x1A5C13F0 [      -3] "{ call MyPackage.MyProcedure(?, ?) }\ 0"
    SDWORD                    -3

MyApp      14c8-a5c EXIT  SQLExecDirectW  with return code 0 (SQL_SUCCESS)
    HSTMT               0x09662B08
    WCHAR *             0x1A5C13F0 [      -3] "{ call MyPackage.MyProcedure(?, ?) }\ 0"
    SDWORD                    -3

MyApp      14c8-a5c ENTER SQLGetDiagFieldW 
    SQLSMALLINT                  3 
    SQLHANDLE           0x09662B08
    SQLSMALLINT                  0 
    SQLSMALLINT              -1249 
    SQLPOINTER         0x001897B0
    SQLSMALLINT                  4 
    SQLSMALLINT *       0x00000000

MyApp      14c8-a5c EXIT  SQLGetDiagFieldW  with return code 100 (SQL_NO_DATA_FOUND)
    SQLSMALLINT                  3 
    SQLHANDLE           0x09662B08
    SQLSMALLINT                  0 
    SQLSMALLINT              -1249 
    SQLPOINTER         0x001897B0
    SQLSMALLINT                  4 
    SQLSMALLINT *       0x00000000

在TOAD中运行proc会返回预期的数据。

谢谢!

0 个答案:

没有答案