我用VC++编程,用ADO连接Oracle数据库,表是新建的,有主键,建表的SQL语句是:
create table TEST(ID number(10),NAME varchar2(20))
表中事先手动加入3行数据。使用下面代码可以查询出数据,但是不能用AddNew添加新记录,到了AddNew的时候,就报错“当前记录集不支持更新,这可能是提供程序的限制,也可能是选定锁定类型的限制”,请问是哪个地方出了问题?PS:源代码如下:void CBLOBTestDlg::OnBnClickedGetData()
{
CString name;
int no;
CString strSQL;
m_pRecord.CreateInstance(__uuidof(Recordset));
strSQL.Format(_T("Select ID,NAME from TEST where ID = 3"));//如果语句换成“Select * from TEST where ID = 3”到了AddNew的时候还是出问题
try
{
m_pRecord->Open(_variant_t(strSQL),m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
} catch (_com_error e)
{
AfxMessageBox(e.Description());
}
name=(CString)m_pRecord->GetCollect(_variant_t("NAME")).bstrVal;//此处可以查询出正确数据
no=m_pRecord->GetCollect(_variant_t("ID")).intVal; //此处可以查询出正确数据
try
{
m_pRecord->AddNew(); //为记录集添加新的一行,更新时就会把这条新纪录放到数据库中
}
catch (_com_error e)
{
AfxMessageBox(e.Description());//报错“当前记录集不支持更新,这可能是提供程序的限制,也可能是选定锁定类型的限制
”
AfxMessageBox(_T("不能插入一条新的记录"));
return;
}
try
{
m_pRecord->PutCollect("ID", _variant_t(maxid+1));
m_pRecord->PutCollect("NAME", _variant_t(name));
}
catch (_com_error e)
{
AfxMessageBox(_T("插入数据异常"));
return;
} m_pRecord->Update();
m_pRecord->Close();//关闭记录集
m_pRecord.Release();//释放空间
}
在PL/SQL和SQL*Plus里面执行 Select ID,NAME from TEST where ID = 3 这件SQL代码是没问题的,而且AddNew之前的代码也可以查询到数据库中的数据。
SQL> create sequence emp_sequence
2 INCREMENT BY 1 -- 每次加几个
3 START WITH 1-- 从1开始计数
4 NOMAXVALUE-- 不设置最大值
5 NOCYCLE-- 一直累加,不循环
6 NOCACHE; -- 不建缓冲区序列已创建。
SQL> create or replace trigger dectuser_tb_tri
2 before insert on TEST
3 for each row
4 begin
5 select emp_sequence.nextval into :new.ID from dual;
6 end;
7 /触发器已创建SQL> commit;提交完成。
这样建表试试。
m_pRecord->Open(_variant_t(strSQL),m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);前加上下面的的语句,就不报错了。
m_pConn-> CursorLocation = adUseClient;
不能先做其他操作,要首先addnew()
至于原因,我还没整出来,大家一起交流