ODBC 数据源,数据记录集是只读

VC/C++ 专栏收录该内容
17 篇文章 0 订阅

原来一个VC6.0的项目,好久没调了。放开了一用,结果原先运行正确的代码,现在报错了。报错信息:

“”数据记录集是只读的“

原代码使用的是

CODBCRecordset class

参考代码出处:http://www.codeproject.com/Articles/473/CODBCRecordset-class。

报错代码为:

m_rs.OpenEx(_T(dboper.SQL_Statement ));
while( !m_rs.IsEOF( ))
{
temp="";
for( i=0;i<m_rs.GetODBCFieldCount();i++)
{
if (m_rs.Field(i).IsNull())
FieldStr="NULL";
else
{
FieldStr=m_rs.Field(i).AsString();
FieldStr.TrimLeft();
FieldStr.TrimRight();
if(FieldStr.IsEmpty ())
FieldStr=" ";


if (dboper.Col_Index.GetAt(i)=='1')
FieldStr="'"+FieldStr+"'";
}
if (0==i)
temp=FieldStr;
else
temp=temp+","+FieldStr;
}//for
/*makeStr*/ temp=dboper.Pre_Char+temp+"~|";
if (!m_pList.IsEmpty())
{
p1=m_pList.GetHeadPosition();
if(p1)
tt=(CClient*)m_pList.GetHead();
while(p1)
{
if(ClientFilter(tt,dboper.Target_System_ID ))
{
/*send*/ tt->Send(temp,temp.GetLength());
}
m_pList.GetNext(p1);
if (p1)
tt=(CClient*)m_pList.GetAt (p1);
}// while(p1)

//updateflag
ActionAfterSelect=dboper.Action_After_Select;
ActionPos=ActionAfterSelect.Find('=');
if (ActionPos!=-1)
{
ActionField=ActionAfterSelect.Left(ActionPos);
strsw=m_rs(ActionField);
strsw.GetBuffer(10);
strcpy(swit,strsw);
switch(swit[0])
{
case '1':
ActionValue="0";
break;
case '2':
ActionValue="9"; 
break;
default:
ActionValue="0";
break;


}
m_rs.Edit ();
m_rs(ActionField)=ActionValue; //ping
m_rs.Update ();
}//if (ActionPos!=-1)
}//if (!m_pList.IsEmpty())

m_rs.MoveNext();
}//while for record 
m_rs.Close();


报错位置: m_rs.Edit ();。问题锁定为:”CODBCRecordset 记录集是只读“ 很多文章说说是打开方式的问题,看了下没有打开readonly的方式。很不解

最后想想,代码以前是Ok的,变化的新建的数据库。有人说是数据库表的问题。没有主键。最后根据这条思路解决了。

解决:表中必须有主键,否则不能插入,我把数据表添加上主键,问题就解决了。

想想也好理解:该表如果没有主键,则该记录集不能有效的定位更新操作所对应的记录内容。但显然这是不够完善的表现。不过这个类毕竟

不能和后面更高级完善的数据库操作类相比。毕竟年代在那。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值