ado执行sql查询出现“发送数据流时出现算术溢出”错误
开发一个数据采集监控系统,比较变态的是有将近2000项数据。根据数据类型分多个表存储。数据库访问层采用ado。最近发现当一条sql一次性查询1700多个字段数据后就出现“发送数据流时出现算术溢出”错误。虽然实际情况不太可能需要一次性查这么多数据,但是测试反馈的问题还是需要解决。研发就是这么苦逼,需要满足客户的需求,还需要满足测试和上层调用者的需求。
直接把那个sql语句放到sql server中执行没有问题。因此定位是ado的问题。
之前使用的是_RecordsetPtr的open方法来执行sql语句,改成_ConnectionPtr的execute方法就没有问题。_RecordsetPtr的open和_ConnectionPtr的execute方法差别在于_RecordsetPtr可以配置游标的类型。之前使用的游标类型是adOpenStatic,锁类型是adLockBatchOptimistic。将游标类型改成adOpenForwardOnly,锁类型改成adLockReadOnly就能执行成功。或者分别改成adOpenUnspecified和adLockUnspecified,这种设置会自动找到可用的配置。但是这种模式游标只能向前读取,而上层应用是需要指定游标移动位置。他们不想自己把数据一次性读出来再做处理,就想通过数据库模块实现这功能。
一开始认为是sql语句太长了,通过精简sql语句的方式,发现还是不行。只要查询字段数量达到一定程度就会出错。后来无意中发现sql查询的时候有通过as设置查询结果的字段名,把这个去掉用原来数据表的字段名就没问题了。不知道ado做了哪些操作导致了这个问题,网上也没有相关的资料。只能暂时先用这种方法解决。