我们正在从用于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会返回预期的数据。
谢谢!