首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb6+ado+sybase进行查询,编译环境上OK,生成程序就报错

2013-01-25 
vb6+ado+sybase进行查询,编译环境下OK,生成程序就报错请注意,程序的流程本身没有任何问题,只是编译为可执

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)

[解决办法]

引用:
我就打开一次,怎么可能锁2个表,VB应该怎么打开它呢,1,1或者,1,3都一样的报错

Sybase 就是这么悲剧,一次查询两个表就锁两个表。
请勿使用魔法数!
[解决办法]
除数里面 +0.001 是为了避免除零错吧?这不影响精度?
SQL Server 可以用 CASE 语句,不同的情况用不同的计算表达式,Sybase 没有类似的语句?

又:贴代码请整理一下排版,然后用编辑框上面工具条的代码格式,放在 UBB 标记里面。

[解决办法]
引用:

to worldy
谢谢,这个当然试过,没什么效果

换个问题吧,我的程序查询的结果跟SQLDBX软件结果有点不一致,这个我没法理解:
select 100*[DC_E_BSS_CELL2_RAW].[CELTCHFP_TFCONGPGSM]/([DC_E_BSS_CELL_CS_RAW].[RANDOMACC_CNROCNT]+[DC_E_BSS_CELL_CS……

实在不行,你可以将所有运算分开几部分或者悄悄的分步骤处理,加一些交互性的东西,一样达到目的。

本来你这个语句执行也要时间的,换一种思路未必不可啊,甚至你还可以拆分成视图,然后拼接视图。

热点排行