5,943
社区成员
发帖
与我相关
我的任务
分享 FDBatchMoveSQLReader1.ReadSQL := readstr;
FDBatchMoveSQLWriter1.WriteSQL := writestr;
readstr=select 业务量,姓名 from [考核$] where replace(姓名,chr(9),'') not in ('')
writestr=update 计算表 set 业务量=:业务量 where 姓名=:姓名
<10:04:16> [FireDAC][Phys][ODBC][Microsoft][ODBC Excel Driver] 标准表达式中数据类型不匹配。
问题:
1、把两句读写语句直接写成字符串,正常执行。如果从数据表读出来拼成字符串,就提示如上错误。
2、where replace(姓名,chr(9),'') not in ('')是为了统一,在sql下执行没问题。
3、如果是写语句为insert,手写字符串和读数据表拼成字符串都没有问题。
4、mode对应insert和update没问题,其他的都一样。
5、去掉where replace(姓名,chr(9),'') not in ('')就能正确执行,拼接字符串为 where 姓名=''也提示相同错误
问题出在哪里?请指教!
结贴解密。
终于破解了数据类型不匹配和主键未定义的BUG:
1、数据类型不匹配--access驱动要使用2010,不能使用2007
2、主键未定义--read语句和write语句的字段不匹配时,必须把read的变量全部as成write的字段,而并不是两个一句相对应就行。
不必纠结,微软的ADO是很老的技术,而且十几年不更新了(见:https://learn.microsoft.com/en-us/sql/ado/guide/ado-history )
ODBC更老,是BDE同一时代的东西,所以里面有什么奇怪的BUG都不奇怪~
试出来了,和excel的驱动有关,2007不行2010就可以,我去
where replace(姓名,chr(9),'') not in ('')转成and replace(姓名,chr(9),'') not in ('')放到写语句中就没问题了,算了,不再纠结了,以后就都在写语句吧。
到目前为止,还是没掌握读写语句的规则,谁能给提供一个介绍FDBatchMove的教程看看。
但是你用cast转换类型,不管什么类型,都提示语法错误,操作符丢失。
测试where replace(姓名,chr(9),'') not in ('')为where 姓名 not in ('')则通过,难道是 replace的返回值不是nvarchar?需要转成什么类型?
个人觉得还是拼字串的问题,但显示出来的拼字串,和手写的结果是一样的。
难道内部结构是不一样的?
比如说,手写时where姓名=是''张三'',而拼出来的是 变量,难道这两者有什么差异?如何解决?