最近第一次用Oracle做开发,以前用Ado方式做过MsSql,Access,Mysql,db2.都没有遇到这次这样变态的问题.
我是采用的Oracle的Oledb驱动.请大家看一下代码
try
{
TESTHR(m_pConnection.CreateInstance(__uuidof(Connection)));
m_pConnection->Open(Provider=OraOLEDB.Oracle;Data Source=a_localhost;User ID=SYSTEM;Password=manager","","",adModeUnknown);
char strSql[512];
sprintf(strSql, "select * from A");
_RecordsetPtr pRst("ADODB.Recordset");
pRst->Open(strSql, _variant_t((IDispatch *)m_pConnection,true),
adOpenStatic, adLockReadOnly, adCmdText);
if (!(pRst->EndOfFile)){
pRst->MoveFirst();
....
}
}
catch (_com_error &e) {
PrintErrorLog("CExpertSelSvr异常,异常信息:%s", e.ErrorMessage());
m_pConnection.Release();
return false;
}
catch (...) {
ErrorLog("CExpertSelSvr未知异常");
return false;
}当A表中没有数据时,可以执行下去.只要A表中有数据,在pRst->Open这里就会出现异常,而且不是ADO异常,是catch (...)捕获.请指点一下,我犯了什么低级错误???
我是采用的Oracle的Oledb驱动.请大家看一下代码
try
{
TESTHR(m_pConnection.CreateInstance(__uuidof(Connection)));
m_pConnection->Open(Provider=OraOLEDB.Oracle;Data Source=a_localhost;User ID=SYSTEM;Password=manager","","",adModeUnknown);
char strSql[512];
sprintf(strSql, "select * from A");
_RecordsetPtr pRst("ADODB.Recordset");
pRst->Open(strSql, _variant_t((IDispatch *)m_pConnection,true),
adOpenStatic, adLockReadOnly, adCmdText);
if (!(pRst->EndOfFile)){
pRst->MoveFirst();
....
}
}
catch (_com_error &e) {
PrintErrorLog("CExpertSelSvr异常,异常信息:%s", e.ErrorMessage());
m_pConnection.Release();
return false;
}
catch (...) {
ErrorLog("CExpertSelSvr未知异常");
return false;
}当A表中没有数据时,可以执行下去.只要A表中有数据,在pRst->Open这里就会出现异常,而且不是ADO异常,是catch (...)捕获.请指点一下,我犯了什么低级错误???
adOpenKeyset,
adLockOptimistic,
adCmdText));
strSql,
_variant_t((IDispatch *)m_pConnection,true),
adOpenForwardOnly,
adLockReadOnly,
adCmdText);pRst->MoveFirst();//去掉,仅向前的游标不支持向前移动游标//不知道行不行,以前一直都这样用,没有出现什么问题
可读写,当前数据记录可自由移动,可看到新增记录ADLOCKREADONLY(=1)
缺省锁定类型,记录集是只读的,不能修改记录是否这个原因呢?
这两个一起用,那到底是只读呢,还是可读写?
楼主好像没用adOpenForwardOnly啊~
哦,我的意思是我以前用oracle这么组合游标类型和锁定类型,建议楼主业这么试试看看,可能意思没有表达清楚
Provider=OraOLEDB.Oracle.1;Data Source=服务名(别名);Server=IP地址
我一直用的这个。没问题
试了一下,果然是表的问题,建表的哥们儿是做java的,把所有表示日期时间的字段都做成了timestamp型.查了10g的资料才知道(居然9i的开发文档里不提,10g才有),timestamp是从9i才开始有的字段类型,如果想让ADO支持,需要把CursorLocation = adUseServer才可以.其实用Date型不就很好,问了建表的哥们儿,居然说以为Date型没法存时间,真想狠K他一顿,害我试了一个晚上!
支持!
sprintf(strSql, "select * from A");
_RecordsetPtr pRst("ADODB.Recordset");
pRst->Open(strSql, _variant_t((IDispatch *)m_pConnection,true),
adOpenStatic, adLockReadOnly, adCmdText);
?
用下面这段试下。
CString strSql= "select * from A";
_RecordsetPtr pRst("ADODB.Recordset");
pRst->Open(_variant_t(strSql), _variant_t((IDispatch *)m_pConnection,true),
adOpenStatic, adLockReadOnly, adCmdText);
strSql[512]?开这么大后面不都是null字符了。