我先大概描述下我的情况
我用vc++连接oracle数据库并操作,基于ado的,将连接部分函数写到了单独的类里,具体代码:
_ConnectionPtr CConnectDB::OnConnectDB()
{
::CoInitialize(NULL); // 初始化com库 m_pConn.CreateInstance(__uuidof(Connection)); // 创建对象实例 try
{
m_pConn->ConnectionString="Provider=OraOLEDB.Oracle;UserID=scott;Password=tiger;Data Source=shenjian";// 连接字符串(oracle9i)
m_pConn->ConnectionTimeout = 10;// 设置连接超时时间
m_pConn->Open("","scott","tiger",adConnectUnspecified);
}
catch(_com_error e)// 捕捉连接异常,未出现异常表示连接成功
{
CString err;
err.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
}
return m_pConn; // 返回连接对象
}我写的是一个有页面的通讯录,在修改函数里总是出错,先把修改函数代码贴上:
void CTelboxDlg::OnBtnAlt()
{
// 声明com指针
_RecordsetPtr m_pRst;
_CommandPtr m_pCom; // 创建对象实例
m_pRst.CreateInstance(__uuidof(Recordset));
m_pCom.CreateInstance(__uuidof(Command)); CConnectDB p;
m_pCom->ActiveConnection = p.OnConnectDB(); // 将连接赋给_CommandPtr对象
m_pCom->CommandText = "select * from list where Tag = '1'";
m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown); // 获取当前选中项的ID
int nSelected = -1;
nSelected = m_listctrl.GetNextItem(nSelected,LVNI_SELECTED); if (nSelected == -1) // 没有选择记录
{
AfxMessageBox("Please select a record!");
}
else
{
try
{
m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项
}
catch (_com_error e)
{
CString err;
err.Format("\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
} // 分别读取选中项的每一个子项
....此处省略 UpdateData(false); CString sql; // 组合sql语句
sql.Format(....);
m_pCom->CommandText = (_bstr_t)sql;
m_pRst = m_pCom->Execute(NULL,NULL,adCmdText);
} // 释放相关对象
m_pRst->Close();
m_pRst.Release();
m_pCom.Release();
}设断点,在m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项 这一句处报出Unknown error 0X800A0CB3 的错误,不知道怎么回事,网上查了有的说是权限问题,但我的查询、添加、删除函数都没问题,我使用的也是管理员账户进行连接的,我以为是返回的记录集有问题,于是作了如下修改:
....... m_pCom->CommandText = "select * from list where Tag = '1'"; //A
m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown); //B HRESULT hr = m_pRst->GetRecordCount(); .......
想跟踪看看返回记录集的个数,结果得到hr = -1,也就是说返回的记录集是不确定的(msdn上说的),但上面AB两行在我的查询、删除等函数里操作的没问题的,我始终不知道这地方改怎么解决,非常着急~~~~恳请高手指点指点,小弟万分感谢了啊~!~!
我用vc++连接oracle数据库并操作,基于ado的,将连接部分函数写到了单独的类里,具体代码:
_ConnectionPtr CConnectDB::OnConnectDB()
{
::CoInitialize(NULL); // 初始化com库 m_pConn.CreateInstance(__uuidof(Connection)); // 创建对象实例 try
{
m_pConn->ConnectionString="Provider=OraOLEDB.Oracle;UserID=scott;Password=tiger;Data Source=shenjian";// 连接字符串(oracle9i)
m_pConn->ConnectionTimeout = 10;// 设置连接超时时间
m_pConn->Open("","scott","tiger",adConnectUnspecified);
}
catch(_com_error e)// 捕捉连接异常,未出现异常表示连接成功
{
CString err;
err.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
}
return m_pConn; // 返回连接对象
}我写的是一个有页面的通讯录,在修改函数里总是出错,先把修改函数代码贴上:
void CTelboxDlg::OnBtnAlt()
{
// 声明com指针
_RecordsetPtr m_pRst;
_CommandPtr m_pCom; // 创建对象实例
m_pRst.CreateInstance(__uuidof(Recordset));
m_pCom.CreateInstance(__uuidof(Command)); CConnectDB p;
m_pCom->ActiveConnection = p.OnConnectDB(); // 将连接赋给_CommandPtr对象
m_pCom->CommandText = "select * from list where Tag = '1'";
m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown); // 获取当前选中项的ID
int nSelected = -1;
nSelected = m_listctrl.GetNextItem(nSelected,LVNI_SELECTED); if (nSelected == -1) // 没有选择记录
{
AfxMessageBox("Please select a record!");
}
else
{
try
{
m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项
}
catch (_com_error e)
{
CString err;
err.Format("\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
} // 分别读取选中项的每一个子项
....此处省略 UpdateData(false); CString sql; // 组合sql语句
sql.Format(....);
m_pCom->CommandText = (_bstr_t)sql;
m_pRst = m_pCom->Execute(NULL,NULL,adCmdText);
} // 释放相关对象
m_pRst->Close();
m_pRst.Release();
m_pCom.Release();
}设断点,在m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项 这一句处报出Unknown error 0X800A0CB3 的错误,不知道怎么回事,网上查了有的说是权限问题,但我的查询、添加、删除函数都没问题,我使用的也是管理员账户进行连接的,我以为是返回的记录集有问题,于是作了如下修改:
....... m_pCom->CommandText = "select * from list where Tag = '1'"; //A
m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown); //B HRESULT hr = m_pRst->GetRecordCount(); .......
想跟踪看看返回记录集的个数,结果得到hr = -1,也就是说返回的记录集是不确定的(msdn上说的),但上面AB两行在我的查询、删除等函数里操作的没问题的,我始终不知道这地方改怎么解决,非常着急~~~~恳请高手指点指点,小弟万分感谢了啊~!~!
解决方案 »
- winXP安装Oracle 10g 创建数据库错误 ORA-19624
- ORA-12514: TNS: 监听程序无法识别连接描述符中请求的服务
- 事务问题
- 请教oracle需要根据不同机构查询前百大记录,如何设计查询能提高效率
- 请教一个sql怎样写
- sql语句问题(高分请教)
- linux下如何卸载oracle?
- sql怪问题,大家帮忙看看吧,十分感谢!
- 在linux下安装oracle8i时遇到的一个问题,急!!!
- 64bit Sqlserver2012 链接服务器连接Oracle10g 32bit已被玩疯
- 请教:hibernate3.1+oracle8乱码问题!!!
- 救命!!SqlServer的Image类型与Oracle的Blob互相写入的问题
m_pRecordset->Move(i-minRow,_variant_t((long)adBookFirst));
我是想在指定的纪录上,修改数据。
结果返回值是错误的。原因不明。
上面句话问题很大,没有指出打开记录集的一些参数。我是用这句:
m_pRecordset->Open(_variant_t(bstrQuery),vNull,adOpenStatic,adLockOptimistic,adCmdText);
就可以了。
原来我是用
m_pRecordset->Open(_variant_t(bstrQuery),vNull,adOpenDynamic,adLockOptimistic,adCmdText);
就是错的。当然具体原因,我还没想明白。
m_pRecordset->CursorLocation = adUseClient;