多步操作产生错误

探讨了在使用VB+ADO2.7与Oracle9i精简版时遇到的多步操作产生错误的问题,发现只有特定表名时才会触发错误,并提供了三种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

现象:

       执行到以下赋值语句的时候会报,多步操作产生错误(如图)

    

 

   

 

开发环境:

       VB+ADO2.7,数据库服务器为oracle9i,客户端为oracle9i精简版

分析:

       开始以为是程序代码的原因,也看了网上的许多分析,一般产生这种情况的无非是以下原因:

1、  要更新的值跟字段类型不一致

2、  要更新值的长度大于字段定义的长度

3、  将空值插入非空字段中

这些原因基本上是逻辑造成的,但我查看了代码,均排除以上原因,而且最大的问题是,客户端如果安装的是9i完整版,那不会报上面这个错误,如果客户端装的是9i精简版,就会出现以上问题,有一个解决办法就是客户端直接用9i完整版安装,但一个问题是,完整版要1G多,精简版不到13M,有点不甘心。

再测,发现使用cnn.Execute “update…”方式,更新记录是可以的,而且用赋值的办法更新其他表多没问题,于是将Fdrop重建,还是一样,再将Fdrop,而且把表结构变掉,发现还是会报错,修改表名变为F_Z,不报错,太奇怪了,难道跟表名有关?

 

结论:

       可能是9i精简版的一个BUG,不能对F表进行VB赋值操作

解决办法:

1、  修改表名,在数据库设计的时候不建议使用像a,b,f这样简单的表名

2、  修改更新方式,将其改为cnn.Execute “update…”方式

3、  客户端装9i完整版

_RecordsetPtr* pRecordset = new _RecordsetPtr; pRecordset->CreateInstance(__uuidof(Recordset)); (*pRecordset)->CursorLocation = adUseClient; (*pRecordset)->Open(_bstr_t("select CAST(0.0 AS FLOAT) as jjje, jkje from table1"), (*m_pConnect).GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); (*pRecordsetTbkk)->PutCollect(_variant_t("jkje"), _variant_t(double(0.0))); // 正常 (*pRecordsetTbkk)->PutCollect(_variant_t("jjje"), _variant_t(double(1.1))); // 报错 "多步操作产生错误。请检查每一步的状态值。" // 检查字段类型 long jjjeType = (*pRecordsetTbkk)->Fields->Item["jjje"]->Type; // 写入数据 if (jjjeType == adDecimal || jjjeType == adNumeric) { DECIMAL decVal; VarDecFromR8(1.1, &decVal); (*pRecordsetTbkk)->PutCollect(_variant_t("jjje"), _variant_t(decVal)); // 报错 "多步操作产生错误。请检查每一步的状态值。" } else { (*pRecordsetTbkk)->Fields->GetItem("jjje")->PutValue(_variant_t(1.1)); // 报错 "多步操作产生错误。请检查每一步的状态值。" (*pRecordsetTbkk)->Fields->Item["jjje"]->Value = vtMissing; // 报错 "多步操作产生错误。请检查每一步的状态值。" (*pRecordsetTbkk)->Fields->Item["jjje"]->Value = _variant_t(1.1); // 报错 "多步操作产生错误。请检查每一步的状态值。" (*pRecordsetTbkk)->PutCollect(_variant_t("jjje"), _variant_t(double(1.1))); 报错 // "多步操作产生错误。请检查每一步的状态值。" } 要求,根据错误提示,改正。本功能仅仅取记录集在本地做修改临时使用,不将修改结果提交至数据库。原因会不会是因为字段本身不存在数据库表中,导致只能读不能改写。有什么解决方案
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值