我用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();//释放空间
}

解决方案 »

  1.   

    m_pRecord->Open(_variant_t(strSQL),m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText)这一句,这样写试试行不行m_pRecord->Open(_variant_t(strSQL),m_pConn.GetInterfacePtr(),adOpenDynamic,adLockPrssimistic,adCmdText)
      

  2.   

    先在sql管理器里执行一下sql语句
      

  3.   

    你是说把LockType adLockOptimistic改为adLockPrssimistic吧,测试过了,不行。AdLockOptimistic:开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。AdLockPessimistic:保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。我把数据库所在的文件夹的权限也改为允许修改和允许写入,还是不行,弄个了两天了,就是找不到问题在哪。求高手指点啊。
      

  4.   

    TO ouyh12345
      在PL/SQL和SQL*Plus里面执行 Select ID,NAME from TEST where ID = 3 这件SQL代码是没问题的,而且AddNew之前的代码也可以查询到数据库中的数据。
      

  5.   

    TO  shn521之前主键没有自增设置,设置以后还是不行。设置SQL代码如下。
    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;提交完成。
      

  6.   

    create table TEST(ID int not null PRIMARY KEY,NAME varchar2(20));
    这样建表试试。
      

  7.   

    问题解决!多谢各位。在OPEN语句
    m_pRecord->Open(_variant_t(strSQL),m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);前加上下面的的语句,就不报错了。
    m_pConn-> CursorLocation   =   adUseClient; 
     
      

  8.   

    确保要操作的记录集打开之后,首先调用addnew()
    不能先做其他操作,要首先addnew()
    至于原因,我还没整出来,大家一起交流