请问关于ADO修改数据库字段值相同时出现一系列错误的解决方法
请教关于ADO修改数据库字段值相同时出现一系列异常的解决办法
在数据库中有一个表,结构是这样的:
TABLE `tt` (
`ff` int(11) DEFAULT NULL
)
其中已经有一条记录,ff的值为1
我用ADO修改数据库字段值,大概的操作流程如下:
1 m_pConnection->Open(bstr,"","",0)
2 CString strSql = _T("select ff from tt");
m_pRecordset->Open((LPCTSTR)strSql, (IDispatch*)m_pConnection, adOpenStatic ,adLockOptimistic, adCmdText))
3 long val = 1;
CString fieldName = _T("ff");
m_pRecordset->PutCollect((LPCTSTR)FieldName , val);
4 m_pRecordset->Update(); //这一步会抛出出异常_com_error,看到信息“无法为更新定位行。一些值可能已在最后一次读取 后已更改。”
5 m_pRecordset->Close(); //再一次抛出出异常_com_error,看到信息“在此环境中不允许操作。”
6 重复第2步; //再一次抛出出异常_com_error,看到信息“对象打开时,不允许操作。”
如果在第3步long val = 2; 就不会出现任何异常,
简单的一句话就是:当修改数据库字段值时,新的值与原来值相等,调用m_pRecordset->Update()时会出现异常,然后就不能关闭结果集,也不能再用这个pRecordset进行查询,直到程序退出,请问有什么办法来解决这样的问题呢?
------解决方案--------------------
给表弄个主键试试。
------解决方案--------------------
应该要先把数据库连接该关的时候关掉,该开的时候打开
要么你的数据库的字段的属性,要修改下下
------解决方案--------------------
回复于:2012-09-12 10:57:43引用:
给表弄个主键试试。
加了一个自增主键,表结构变成这样:
TABLE `tt` (
`ff` tinyint(11) DEFAULT NULL,
`ff2` bigint(15) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ff2`)
)
然后第2步的sql语句改成: CString strSql = _T("select ff2,ff from tt");
试了之后,结果还是一样,想想确实也是,因我修改的时候不会修改主键 ,等于说主键还是原来的值,再加上ff设置也是原来的值,也就是说这一条记录的两个字段值跟原来的那两字段值是一样的,所以跟没加主键的效果一样,还是会出异常。
在数据库中有一个表,结构是这样的:
TABLE `tt` (
`ff` int(11) DEFAULT NULL
)
其中已经有一条记录,ff的值为1
我用ADO修改数据库字段值,大概的操作流程如下:
1 m_pConnection->Open(bstr,"","",0)
2 CString strSql = _T("select ff from tt");
m_pRecordset->Open((LPCTSTR)strSql, (IDispatch*)m_pConnection, adOpenStatic ,adLockOptimistic, adCmdText))
3 long val = 1;
CString fieldName = _T("ff");
m_pRecordset->PutCollect((LPCTSTR)FieldName , val);
4 m_pRecordset->Update(); //这一步会抛出出异常_com_error,看到信息“无法为更新定位行。一些值可能已在最后一次读取 后已更改。”
5 m_pRecordset->Close(); //再一次抛出出异常_com_error,看到信息“在此环境中不允许操作。”
6 重复第2步; //再一次抛出出异常_com_error,看到信息“对象打开时,不允许操作。”
如果在第3步long val = 2; 就不会出现任何异常,
简单的一句话就是:当修改数据库字段值时,新的值与原来值相等,调用m_pRecordset->Update()时会出现异常,然后就不能关闭结果集,也不能再用这个pRecordset进行查询,直到程序退出,请问有什么办法来解决这样的问题呢?
------解决方案--------------------
给表弄个主键试试。
------解决方案--------------------
应该要先把数据库连接该关的时候关掉,该开的时候打开
要么你的数据库的字段的属性,要修改下下
------解决方案--------------------
回复于:2012-09-12 10:57:43引用:
给表弄个主键试试。
加了一个自增主键,表结构变成这样:
TABLE `tt` (
`ff` tinyint(11) DEFAULT NULL,
`ff2` bigint(15) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ff2`)
)
然后第2步的sql语句改成: CString strSql = _T("select ff2,ff from tt");
试了之后,结果还是一样,想想确实也是,因我修改的时候不会修改主键 ,等于说主键还是原来的值,再加上ff设置也是原来的值,也就是说这一条记录的两个字段值跟原来的那两字段值是一样的,所以跟没加主键的效果一样,还是会出异常。