数据库-多步操作产生错误,请检查每一步的状态值

在数据迁移过程中遇到错误,通过对比字段类型和长度未发现问题。深入检查发现,存在birthday字段值超出常规范围,包含1900年前的不正确数据。通过设置查询过滤条件(生日>=1900年1月1日),解决了问题,并在迁移脚本中添加此条件确保迁移正常。

问题描述:在进行数据迁移过程中报的错,百度也找不到准确答案,哎,自己摸索吧

--按照id排序,导入成功4045条数据,后面就报错:多步操作产生错误,请检查每一步的状态值
[DSRzhizhi]
OrgDBName=zhizhilaoxitong
OrgTable=TC_DUD_PARTY
TarDBName=zhengshi
TarTable=T_XZ_PARTY
IsValid=1
IsTime=
OrgSign=
TarSign=
sGetSQL=select id,caseid,partytypeid,name,personid,sex,birthday,contact,address,diploma,partyrace,driverlicensetypeid,driverlicensedocid,driverlicenseissueoffice,businesslicensetype,businesslicensecode,partyunit,unitaddress,corporation,corperationsex,corperationaddress,corperationcontact,corperationidnumber,updatetime,updateaccountid,state,workunit,workunitaddr,businesslicensetypecontent from TC_DUD_PARTY order by id
sAddSQL=insert into T_XZ_PARTY (PARTY_ID,CASE_ID,party_type,party_name,party_idnum,party_sex,party_birth,party_contno,party_addr,party_edudegree,party_folk,types_driv_license,driver_licenseno,DRIVER_LICENSEISSUE,qc_category,qc_no,company_name,unit_address,legal_name,CORPERATIONSEX,corperationaddress,corperationcontact,corperationidnumber,modify_time,modify_person,ISESCAPE,party_post,unitaddr,businesslicensetypecontent,ZHIDUI,LAOXITONG) Values (:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,2,1)
TbTimeGap=5000
SWhereSQL=
SUpdateSQL=

对字段类型、长度都进行了对比,没有什么问题,难道是日期字段超出了范围么(机智^_^)

于是取4045后面的几条数据检查:

select id,
       caseid,
       partytypeid,
       name,
       personid,
       sex,
       birthday,
       contact,
       address,
       diploma,
       partyrace,
       driverlicensetypeid,
       driverlicensedocid,
       driverlicenseissueoffice,
       businesslicensetype,
       businesslicensecode,
       partyunit,
       unitaddress,
       corporation,
       corperationsex,
       corperationaddress,
       corperationcontact,
       corperationidnumber,
       updatetime,
       updateaccountid,
       state,
       workunit,
       workunitaddr,
       businesslicensetypecontent
 from (
select id,
       caseid,
       partytypeid,
       name,
       personid,
       sex,
       birthday,
       contact,
       address,
       diploma,
       partyrace,
       driverlicensetypeid,
       driverlicensedocid,
       driverlicenseissueoffice,
       businesslicensetype,
       businesslicensecode,
       partyunit,
       unitaddress,
       corporation,
       corperationsex,
       corperationaddress,
       corperationcontact,
       corperationidnumber,
       updatetime,
       updateaccountid,
       state,
       workunit,
       workunitaddr,
       businesslicensetypecontent,
       row_number() over(order by id) rn
  from TC_DUD_PARTY
  order by id) where rn between 4044 and 4048

 

果然发现问题,birthday这个字段值不对,随便查询下就查出了许多错误的数据

 

1900年到现在已经118岁了,应该足够了,小于1900年的都属于脏数据,所以查询的时候要进行过滤

where t.birthday >= to_date('1900/1/1 00:00:00', 'yyyy-MM-dd HH24:mi:ss')

select id,
       caseid,
       partytypeid,
       name,
       personid,
       sex,
       birthday,
       contact,
       address,
       diploma,
       partyrace,
       driverlicensetypeid,
       driverlicensedocid,
       driverlicenseissueoffice,
       businesslicensetype,
       businesslicensecode,
       partyunit,
       unitaddress,
       corporation,
       corperationsex,
       corperationaddress,
       corperationcontact,
       corperationidnumber,
       updatetime,
       updateaccountid,
       state,
       workunit,
       workunitaddr,
       businesslicensetypecontent
 from (
select id,
       caseid,
       partytypeid,
       name,
       personid,
       sex,
       birthday,
       contact,
       address,
       diploma,
       partyrace,
       driverlicensetypeid,
       driverlicensedocid,
       driverlicenseissueoffice,
       businesslicensetype,
       businesslicensecode,
       partyunit,
       unitaddress,
       corporation,
       corperationsex,
       corperationaddress,
       corperationcontact,
       corperationidnumber,
       updatetime,
       updateaccountid,
       state,
       workunit,
       workunitaddr,
       businesslicensetypecontent,
       row_number() over(order by id) rn
  from TC_DUD_PARTY t where t.birthday >= to_date('1900/1/1 00:00:00', 'yyyy-MM-dd HH24:mi:ss')
  order by id) where rn between 4044 and 4048

最后别忘了对迁移脚本加上过滤条件:

[DSRzhizhi]
OrgDBName=zhizhilaoxitong
OrgTable=TC_DUD_PARTY
TarDBName=zhengshi
TarTable=T_XZ_PARTY
IsValid=1
IsTime=
OrgSign=
TarSign=
sGetSQL=select id,caseid,partytypeid,name,personid,sex,birthday,contact,address,diploma,partyrace,driverlicensetypeid,driverlicensedocid,driverlicenseissueoffice,businesslicensetype,businesslicensecode,partyunit,unitaddress,corporation,corperationsex,corperationaddress,corperationcontact,corperationidnumber,updatetime,updateaccountid,state,workunit,workunitaddr,businesslicensetypecontent from TC_DUD_PARTY where birthday >= to_date('1900/1/1 00:00:00', 'yyyy-MM-dd HH24:mi:ss') order by id
sAddSQL=insert into T_XZ_PARTY (PARTY_ID,CASE_ID,party_type,party_name,party_idnum,party_sex,party_birth,party_contno,party_addr,party_edudegree,party_folk,types_driv_license,driver_licenseno,DRIVER_LICENSEISSUE,qc_category,qc_no,company_name,unit_address,legal_name,CORPERATIONSEX,corperationaddress,corperationcontact,corperationidnumber,modify_time,modify_person,ISESCAPE,party_post,unitaddr,businesslicensetypecontent,ZHIDUI,LAOXITONG) Values (:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,:s,2,1)
TbTimeGap=5000
SWhereSQL=
SUpdateSQL=

测试OK~~

 

 

_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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值