请注意,程序的流程本身没有任何问题,只是编译为可执行程序后,查询的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语句太长
只有在VB6的编译环境下一切OK,无论查询多长的SQL语句都没问题
在没有改动任何语句的情况下直接编译为可执行程序,查询SQL语句稍微长一点了就会出错了
用的是VB6里的ADO 2.8库
导出EXCEL用的方法是Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range("a1"))不太理解原因,通过打包软件,我把需要的库文件都找出来,复制到相关的文件夹下了,还是有问题
有没有人遇到过,可以解决吗?
是导出EXCEL时出问题了还是查询的时候SQL语句太长导致出问题了?为什么VB6的环境下就不会有这问题呢?编译后语句太长 报错sybase语句太长
编译为可执行程序之后,SQL语句大概一千多个字符就会报错,少于这个数就可以顺利执行,语句本身也没任何问题,仅仅是长度太长了就会报错说“对象已打开”,短些的语句不会报错语句当然可以帖出来,但是没意义,确实是可执行程序在SQL语句长的时候报错,SQL语句少于1000个字符是没问题的,VB6编译环境下无论多长都没问题 Dim Rs_Data As New ADODB.Recordset
Dim IrowCount As Double
Dim IcolCount As Double
Dim XX As Long, YY As String
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlQuery As Excel.QueryTable
Rs_Data.CursorLocation = adUseClient
DoEvents
Rs_Data.Open strOpen, oConn3, 1, 1 ' adOpenDynamic, adLockReadOnly '1, 3
With Rs_Data
If .RecordCount < 1 Then
MsgBox "没有找到相关记录!", , "提醒:"
Exit Function
End If
Set xlApp = CreateObject("Excel.Application")
Set xlBook = Nothing
Set xlSheet = Nothing
Set xlBook = xlApp.Workbooks().Add
Set xlSheet = xlBook.Worksheets("sheet1")
'xlApp.Visible = True
'记录总数
IrowCount = .RecordCount
'字段总数
IcolCount = .Fields.Count
End With
xlApp.Application.Visible = False
'添加查询语句,导入EXCEL数据
xlSheet.Cells(2, 1).CopyFromRecordset Rs_Data
'Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range("a1"))
有时候要查询那么长的SQL语句怎么办呢?有VB6有源码才可以执行查询,编译后的程序,发给同事们,用不了
编译后的程序为什么跟VB6环境下不一样呢?找到了区别,应该就可以解决的吧,是不是缺什么文件
if rs_data.state<>adstateclosed then rs_data.close
Rs_Data.Open strOpen, oConn3, 1, 1
那个错误这里也不说,不过你的变量最好规范,如IrowCount,IcolCount 为integer或long,导出的Excel记录条数是有限制的(有Excel本身的问题,也有电脑内存大小问题),你的长sql统计出的记录条数最好跟踪一下
至于 VB-IDE 中和 exe 执行时这个长度限制不一样,这个没有对比过。
编程原则是:不在程序中调用长 SQL 语句,可以用存储过程、视图等方法实现。
比如某个数据库驱动,用数据库的监视工具可以发现 SQL 超过 4K 就被截断了,但是有时候不到 1K 就出错了。
所以只用简短 SQL 是最保险的。
谢谢。由于我要查询的内容确实比较复杂,平常就是这样工作的。1万个字符的语句sqldbc软件可以连接ODBC获取结果,把语句放在dqy文件里excel也可以正常获取ODBC的数据的,我们这边都这么用的,就是VB编译成可执行程序有这个问题,VB6里也可以连接ODBC获取结果。
很多软件可以正常查询,唯独我的程序编译了就不能查询,程序目前只能我自己用TO AisaC
不存在全局的连接,这都是刚定义就直接使用的,无论是conn还是rs,都是局部变量,是sybase或者odbc返回的“对象已打开”,不是VB返回的“对象已打开,不允许操作”,只是在SQL语句稍微复杂一点的时候报错,简单的SQL语句不报错的,现在就是搞不清楚这个对象是什么,我也无法分辨报错的是ODBC还是SYBASE,好纠结
它的 ODBC 驱动可支持的游标类型、锁定方式等比常见数据库少,所以你认为“常见”的查询方式在它这里很可能失败。
具体细节看 Sybase 的手册。
“对象已打开”的错误好像是对同一个表加两次锁,即同时打开的两个可编辑的 RecordSet 都用到了同一个表。
oConn3 哪里来的,VB6 IDE会帮你销毁一些对象,和运行时不一样。
程序里凡是之前打开过的rs,conn我全部关了,也都set 为nothing了,仍然会报错
程序主要就一个功能,就一个纯粹的查询而已,其它的都是辅助拼接这个SQL语句的
我就打开一次,怎么可能锁2个表,VB应该怎么打开它呢,1,1或者,1,3都一样的报错to AisaC
具体版本不清楚,是sybase iq列结构的新型数据库
其实就是oconn3去连接ODBC,然后RS_DATA去执行查询操作,很简单的事情,VB6 IDE下就没事,可执行程序有有一定的概率报错,语句越复杂越长就越可能报错,跟我其它的代码没什么关系了,我都关闭并且set他们为nothing了,不会有影响的
我就是根据可视化的几个按钮和列表来拼出查询数据库锁需要的SQL语句来,然后用那么简单的一句代码进行查询
就这么简单的个事,我拼出来的语句太长了,无法粘贴上来,反正很多很多软件都可以连ODBC进行查询, 这个语句是可以正常查询的。这么说吧,我把程序其它的全部功能都废弃,直接把这句SQL拿来查询,VB IDE下是OK的,可执行程序就不行
一个按钮,三五句代码,仍然是这样的情况
SQL语句简单些就没问题了仍然在Rs_Data.Open strOpen, oConn3, 1, 1报错
Rs_Data是定义后马上就使用的局部变量
我曾经慢慢的尝试过,比如说都是聚合的SUM语句,慢慢的一句一句的加,所加的每一句都可以单独的查询获得到结果,然后加到一定的长度了,就没法再加了,再加就报错了
有没有什么办法模拟出VB IDE的运行环境呢?好多软件都可以用SQL语句连ODBC查询,我的软件就卡在这个地方了,要疯了
SUM(CLEVENTIV_HOATTVPACK) AS HOATTVPACK ,
SUM(CLEVENTIV_HOSUCVPACK) AS HOSUCVPACK ,
SUM(CLEVENTIV_HOATEVALV) AS HOATEVALV ,
SUM(CLEVENTIV_HOSUCEVALV) AS HOSUCEVALV到一定的程度,就会报错,不是加的某一句有问题,而是好像到了上限一样
单独的某一句是不存在问题的
这个SQL语句分裂成两个语句,各自都可以查出结果来,但是一旦放在一起就拜拜了
问题是我就是需要一起查,一起看,别的软件都可以做到
甚至是把这个语句加个前缀(写上ODBC的名称)放在qdy文件里双击,EXCEL都可以帮我连接ODBC把结果查出来
我简直被VB6打败了,十几年没遇到过这种坎过不去
set Rs_Data=oConn3.execute( strOpen)
谢谢,这个当然试过,没什么效果换个问题吧,我的程序查询的结果跟SQLDBX软件结果有点不一致,这个我没法理解:
select 100*[DC_E_BSS_CELL2_RAW].[CELTCHFP_TFCONGPGSM]/([DC_E_BSS_CELL_CS_RAW].[RANDOMACC_CNROCNT]+[DC_E_BSS_CELL_CS_RAW].[RANDOMACC_RAACCFA]+0.001)*([DC_E_BSS_CELL_CS_RAW].[CLTCH_TCASSALL]/([DC_E_BSS_CELL_CS_RAW].[CLTCH_TASSALL]+0.001)) as YHY1 from DC.[DC_E_BSS_CELL2_RAW] [DC_E_BSS_CELL2_RAW] LEFT JOIN DC.[DC_E_BSS_CELL_CS_RAW] [DC_E_BSS_CELL_CS_RAW] ON [DC_E_BSS_CELL2_RAW].MOID = [DC_E_BSS_CELL_CS_RAW].MOID AND [DC_E_BSS_CELL2_RAW].DATETIME_ID = [DC_E_BSS_CELL_CS_RAW].DATETIME_ID AND [DC_E_BSS_CELL2_RAW].SESSION_ID = [DC_E_BSS_CELL_CS_RAW].SESSION_ID where [DC_E_BSS_CELL2_RAW].DATE_ID IN ('2013/1/7') 我在ODBC里追踪,居然追不到SQLDBX软件的操作,我的软件的全部操作都在LOG里看到了,是明文的
别人的结果是99.89653217
我的结果是0.003240533
虽然总体来说大部分的结果是对的,但是软件不靠谱,就让人不敢用,我好烦躁
请勿使用魔法数!
SQL Server 可以用 CASE 语句,不同的情况用不同的计算表达式,Sybase 没有类似的语句?又:贴代码请整理一下排版,然后用编辑框上面工具条的代码格式,放在 UBB 标记里面。
非常感谢你的解答
其实我这边大部分的公式都是这样的,但是目前只发现这一个语句的返回结果跟其它纯SQL的查询软件查到的结果不一样,差别非常非常大,不是精度问题
使用的语句一模一样我也在ODBC里追踪了,发现别人的软件该干什么就干什么,VB的程序就N条消息,不停
将这条记录参与运算的各字段 SELECT 出来,看 VB 结果和查询工具是否一致。
如果上面的值一致,那么将 SQL 计算公式中的字段直接换成数值,再查询看是否一致。