vb6+ado+sybase进行查询,编译环境下OK,生成程序就报错
请注意,程序的流程本身没有任何问题,只是编译为可执行程序后,查询的SQL语句稍长一些才报错,短一点的语句是没任何问题的,所以这也不会是rs没关或者conn没关导致的“对象已打开”。
sybase环境下,查询的语句稍长一些就报错:“对象已打开”。
只有在VB6的编译环境下一切OK,无论查询多长的SQL语句都没问题
在没有改动任何语句的情况下直接编译为可执行程序,查询SQL语句稍微长一点了就会出错了
用的是VB6里的ADO 2.8库
导出EXCEL用的方法是Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range("a1"))
不太理解原因,通过打包软件,我把需要的库文件都找出来,复制到相关的文件夹下了,还是有问题
有没有人遇到过,可以解决吗?
是导出EXCEL时出问题了还是查询的时候SQL语句太长导致出问题了?为什么VB6的环境下就不会有这问题呢? 编译后语句太长?报错 sybase 语句太长
[解决办法]
和sql的长短没什么关系.导出EXCEL的代码要不长都贴出来好判断
[解决办法]
如果仅是sql太长造成的,应考虑建视图以简化那个sql的长度
[解决办法]
这样试试:
if rs_data.state<>adstateclosed then rs_data.close
Rs_Data.Open strOpen, oConn3, 1, 1
[解决办法]
也可以建函数返回一个值以简化sql条件,方法有很多种.
那个错误这里也不说,不过你的变量最好规范,如IrowCount,IcolCount 为integer或long,导出的Excel记录条数是有限制的(有Excel本身的问题,也有电脑内存大小问题),你的长sql统计出的记录条数最好跟踪一下
[解决办法]
数据库驱动对解析的 SQL 语句有长度限制,这是一直存在的,虽然没有明显的文档表示。
至于 VB-IDE 中和 exe 执行时这个长度限制不一样,这个没有对比过。
编程原则是:不在程序中调用长 SQL 语句,可以用存储过程、视图等方法实现。
[解决办法]
什么SQL语句要一千多个字符?
[解决办法]
长度只是一个参考值,可能影响大的是复杂度,因为没有明确的文档说明,只能凭经验。
比如某个数据库驱动,用数据库的监视工具可以发现 SQL 超过 4K 就被截断了,但是有时候不到 1K 就出错了。
所以只用简短 SQL 是最保险的。
[解决办法]
连接是全局的吧,最好别这么用。
每次新建一个链接,然后连接,操作,关闭,销毁。
可能造成这个现象的原因如下,你SQL执行时间过长,其它部分在调用连接的时候,尝试去打开连接,而你的连接可能还没有执行完成,也就是还未关闭,执行是否完成的时间可能还和你的连接执行命令时间相关联。
[解决办法]
早说是 Sybase 不就结了。
它的 ODBC 驱动可支持的游标类型、锁定方式等比常见数据库少,所以你认为“常见”的查询方式在它这里很可能失败。
具体细节看 Sybase 的手册。
“对象已打开”的错误好像是对同一个表加两次锁,即同时打开的两个可编辑的 RecordSet 都用到了同一个表。
[解决办法]
多少用户的Sysbase库?Sybase 是运行时版本还是什么版本。
Rs_Data.Open strOpen, oConn3, 1, 1
Rs_Data 最后没有关闭。
oConn3 哪里来的,VB6 IDE会帮你销毁一些对象,和运行时不一样。
[解决办法]
按照你的说法,代码不完整没法讨论,贴完整的查询功能代码出来看看?
[解决办法]
试试:
set Rs_Data=oConn3.execute( strOpen)
[解决办法]