ODBC 数据源,数据记录集是只读
发布日期:2021-10-02 00:05:41 浏览次数:1 分类:技术文章

本文共 1678 字,大约阅读时间需要 5 分钟。

原来一个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的,变化的新建的数据库。有人说是数据库表的问题。没有主键。最后根据这条思路解决了。

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

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

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

转载地址:https://blog.csdn.net/jacky_zh/article/details/23245655 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:sql 语句:SELECT INTO 和 INSERT INTO SELECT 表复制
下一篇:网络命令:ping、ipconfig、tracert、netstat、arp

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月18日 02时40分37秒