ADO访问oracle存储过程返回结果集在调用_CommandPtr的Execute函数时报异常 本帖最后由 yvettesharp 于 2011-08-28 11:52:34 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我继续提供一些信息,今天我特地测试一下看我的程序对数据库访问是否有问题导入ado#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")增加一个执行函数void CADONormalTestDlg::OnBnClickedBtnConnect(){// TODO: 在此添加控件通知处理程序代码 _ConnectionPtr pConnection; _CommandPtr pCommand; _RecordsetPtr pRecord; pConnection.CreateInstance(_uuidof(Connection)); pRecord.CreateInstance(_uuidof(Recordset)); pCommand.CreateInstance("ADODB.Command"); _bstr_t strConnect = "Provider=OraOLEDB.Oracle.1;Data Source=data;User ID=store;Password=store;"; pConnection->Open(strConnect, "","", adConnectUnspecified); //测试1,通过 /*CString strSql = "select * from products"; BSTR bstrSql = strSql.AllocSysString(); pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);*/ //测试2,通过 pCommand->CommandText = "select * from products"; pCommand->ActiveConnection = pConnection; pCommand->CommandType = adCmdText; pRecord = pCommand->Execute(NULL, NULL, adCmdText); //测试3,通过 pCommand->CommandText = "pk_test.proc_test"; pCommand->ActiveConnection = pConnection; pCommand->CommandType = adCmdStoredProc; pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc); //测试4,失败,Execute函数报出异常 /*pCommand->CommandText = "zsj_output.outputproc"; pCommand->ActiveConnection = pConnection; pCommand->CommandType = adCmdStoredProc; _ParameterPtr m_pParameter=NULL; m_pParameter.CreateInstance("ADODB.Parameter"); m_pParameter=pCommand->CreateParameter(_bstr_t("myno"),adInteger,adParamInput,sizeof(int),_variant_t(short(7900))); pCommand->Parameters->Append(m_pParameter); pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);*/ while (!pRecord->adoEOF) { _variant_t str = pRecord->GetCollect("Price"); if(str.vt != NULL && str.vt != VT_EMPTY) { CString temp = (LPSTR)(_bstr_t)str; } pRecord->MoveNext(); }}在这段代码里面我做了如下几个测试测试1:用记录集pRecord测试是否能查询到数据库products这张表的数据CString strSql = "select * from products";BSTR bstrSql = strSql.AllocSysString();pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);程序正确执行并得到数据集测试2:用命令pCommand调用Execute函数来执行还是查询功能pCommand->CommandText = "select * from products";pCommand->ActiveConnection = pConnection;pCommand->CommandType = adCmdText;pRecord = pCommand->Execute(NULL, NULL, adCmdText);程序正确执行,execute函数并没有报异常测试3:还是用pCommand调用Execute函数来数据库中我新建的一个普通存储过程看测试是否能通过存储过程代码如下create or replace package pk_testis procedure proc_test;end pk_test;create or replace package body pk_testis procedure proc_test is begin update products set price = price + 1; update products set price = price - 1; end proc_test;end pk_test;然后调用pCommand->CommandText = "pk_test.proc_test";pCommand->ActiveConnection = pConnection;pCommand->CommandType = adCmdStoredProc;pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);程序也能正确执行,execute函数并没有报异常测试4就如上面所说执行不了,是我哪里写的不对吗?纳闷了,还请高手指教一下,测试4的存储过程代码见一楼,谢谢了 弹出的异常对话框写着ADONormalTest.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f204 处的 _com_error。代码异常指着comip文件中以下代码void _Release() throw() { if (m_pInterface != NULL) { m_pInterface->Release(); } }这里面的 m_pInterface->Release();这句话,我看着m_pInterface这个变量也确实不为NULL oracle版本问题 oracle问题 新装了oralce后登陆em无法登陆 Oracle 9i和sql的区别 请求一个统计的SQL. 怎样远程导出oracle的表结构 触发器的问题 Oracle安装求教? 在ORACLE中如何按数据仓库进行数据库设计 请教--oracle存储过程能否输出结果集? 在启动ORACLE的Enterprise Manager Console的Managerment Server是怎么回事 两表组合查询 求助一条查询语句!万分感谢!!
导入ado
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")增加一个执行函数
void CADONormalTestDlg::OnBnClickedBtnConnect()
{
// TODO: 在此添加控件通知处理程序代码
_ConnectionPtr pConnection;
_CommandPtr pCommand;
_RecordsetPtr pRecord; pConnection.CreateInstance(_uuidof(Connection));
pRecord.CreateInstance(_uuidof(Recordset));
pCommand.CreateInstance("ADODB.Command"); _bstr_t strConnect = "Provider=OraOLEDB.Oracle.1;Data Source=data;User ID=store;Password=store;";
pConnection->Open(strConnect, "","", adConnectUnspecified); //测试1,通过
/*CString strSql = "select * from products";
BSTR bstrSql = strSql.AllocSysString();
pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);*/ //测试2,通过
pCommand->CommandText = "select * from products";
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdText;
pRecord = pCommand->Execute(NULL, NULL, adCmdText); //测试3,通过
pCommand->CommandText = "pk_test.proc_test";
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdStoredProc;
pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc); //测试4,失败,Execute函数报出异常
/*pCommand->CommandText = "zsj_output.outputproc";
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdStoredProc; _ParameterPtr m_pParameter=NULL;
m_pParameter.CreateInstance("ADODB.Parameter");
m_pParameter=pCommand->CreateParameter(_bstr_t("myno"),adInteger,adParamInput,sizeof(int),_variant_t(short(7900)));
pCommand->Parameters->Append(m_pParameter); pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);*/ while (!pRecord->adoEOF)
{
_variant_t str = pRecord->GetCollect("Price"); if(str.vt != NULL && str.vt != VT_EMPTY)
{
CString temp = (LPSTR)(_bstr_t)str;
} pRecord->MoveNext();
}
}在这段代码里面我做了如下几个测试
测试1:用记录集pRecord测试是否能查询到数据库products这张表的数据
CString strSql = "select * from products";
BSTR bstrSql = strSql.AllocSysString();
pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);
程序正确执行并得到数据集测试2:用命令pCommand调用Execute函数来执行还是查询功能
pCommand->CommandText = "select * from products";
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdText;
pRecord = pCommand->Execute(NULL, NULL, adCmdText);
程序正确执行,execute函数并没有报异常测试3:还是用pCommand调用Execute函数来数据库中我新建的一个普通存储过程看测试是否能通过
存储过程代码如下
create or replace package pk_test
is
procedure proc_test;
end pk_test;create or replace package body pk_test
is
procedure proc_test
is
begin
update products set price = price + 1;
update products set price = price - 1;
end proc_test;
end pk_test;然后调用
pCommand->CommandText = "pk_test.proc_test";
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdStoredProc;
pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);
程序也能正确执行,execute函数并没有报异常测试4就如上面所说执行不了,是我哪里写的不对吗?纳闷了,还请高手指教一下,测试4的存储过程代码见一楼,谢谢了
ADONormalTest.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f204 处的 _com_error。代码异常指着comip文件中以下代码
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release();
}
}
这里面的 m_pInterface->Release();这句话,我看着m_pInterface这个变量也确实不为NULL