请注意,程序的流程本身没有任何问题,只是编译为可执行程序后,查询的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语句太长

解决方案 »

  1.   

    和sql的长短没什么关系.导出EXCEL的代码要不长都贴出来好判断
      

  2.   

    asftrhgjhkjlkttttttt 非常感谢您的关注我在VB6的环境下无论多长的SQL语句都是OK的,代码没任何变动
    编译为可执行程序之后,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"))
      

  3.   

    如果仅是sql太长造成的,应考虑建视图以简化那个sql的长度
      

  4.   

    错误就在这句了,Rs_Data.Open strOpen, oConn3, 1, 1不是那种“对象已打开,不允许操作”的错误。纯粹就是“对象已打开”
    有时候要查询那么长的SQL语句怎么办呢?有VB6有源码才可以执行查询,编译后的程序,发给同事们,用不了
    编译后的程序为什么跟VB6环境下不一样呢?找到了区别,应该就可以解决的吧,是不是缺什么文件
      

  5.   

    这样试试:
    if rs_data.state<>adstateclosed then rs_data.close
    Rs_Data.Open strOpen, oConn3, 1, 1
      

  6.   

    也可以建函数返回一个值以简化sql条件,方法有很多种.
    那个错误这里也不说,不过你的变量最好规范,如IrowCount,IcolCount 为integer或long,导出的Excel记录条数是有限制的(有Excel本身的问题,也有电脑内存大小问题),你的长sql统计出的记录条数最好跟踪一下
      

  7.   

    版主大人,我这个Rs_Data是刚定义就拿来用的只是编译为可执行程序才“有可能”报错,我的代码在VB6里按F5执行是绝对靠谱的。我目前最想知道的是为什么这两种环境下同样的SQL语句会有不同的结果,较短的SQL语句都OK,只是SQL语句长一点就有区别,难道我的程序就只能我自己在VB6的环境下用,无法给别人使用?那写程序还有什么意义呢?
      

  8.   

    我试过了,在VB6的环境下执行,SQL语句超过一万个字符都没事,编译为可执行程序后,有时候一千多个字符就会报错,有时候一千五百个报错,SQL语句本身也没看出什么问题来。
      

  9.   

    数据库驱动对解析的 SQL 语句有长度限制,这是一直存在的,虽然没有明显的文档表示。
    至于 VB-IDE 中和 exe 执行时这个长度限制不一样,这个没有对比过。
    编程原则是:不在程序中调用长 SQL 语句,可以用存储过程、视图等方法实现。
      

  10.   

    to Tiger_Zhao 也不见得就是纯粹的SQL长度问题,有个纯粹用SQL语句查询数据库的软件“sqldbx”就可以成功查询,一万个字符的语句都没问题,VB6的环境下也可以成功查询这一万个字符的SQL语句,就是编译为可执行程序了,查询不了,查询简断的就没问题,有时候一千六都可以查询,有时候一千一都查询不了,很奇怪
      

  11.   

    什么SQL语句要一千多个字符?
      

  12.   

    长度只是一个参考值,可能影响大的是复杂度,因为没有明确的文档说明,只能凭经验。
    比如某个数据库驱动,用数据库的监视工具可以发现 SQL 超过 4K 就被截断了,但是有时候不到 1K 就出错了。
    所以只用简短 SQL 是最保险的。
      

  13.   

    连接是全局的吧,最好别这么用。每次新建一个链接,然后连接,操作,关闭,销毁。可能造成这个现象的原因如下,你SQL执行时间过长,其它部分在调用连接的时候,尝试去打开连接,而你的连接可能还没有执行完成,也就是还未关闭,执行是否完成的时间可能还和你的连接执行命令时间相关联。
      

  14.   

    TO Tiger_Zhao 
    谢谢。由于我要查询的内容确实比较复杂,平常就是这样工作的。1万个字符的语句sqldbc软件可以连接ODBC获取结果,把语句放在dqy文件里excel也可以正常获取ODBC的数据的,我们这边都这么用的,就是VB编译成可执行程序有这个问题,VB6里也可以连接ODBC获取结果。
    很多软件可以正常查询,唯独我的程序编译了就不能查询,程序目前只能我自己用TO AisaC 
    不存在全局的连接,这都是刚定义就直接使用的,无论是conn还是rs,都是局部变量,是sybase或者odbc返回的“对象已打开”,不是VB返回的“对象已打开,不允许操作”,只是在SQL语句稍微复杂一点的时候报错,简单的SQL语句不报错的,现在就是搞不清楚这个对象是什么,我也无法分辨报错的是ODBC还是SYBASE,好纠结
      

  15.   

    早说是 Sybase 不就结了。
    它的 ODBC 驱动可支持的游标类型、锁定方式等比常见数据库少,所以你认为“常见”的查询方式在它这里很可能失败。
    具体细节看 Sybase 的手册。
    “对象已打开”的错误好像是对同一个表加两次锁,即同时打开的两个可编辑的 RecordSet 都用到了同一个表。
      

  16.   

    多少用户的Sysbase库?Sybase 是运行时版本还是什么版本。Rs_Data.Open strOpen, oConn3, 1, 1Rs_Data 最后没有关闭。
    oConn3  哪里来的,VB6 IDE会帮你销毁一些对象,和运行时不一样。
      

  17.   

    to Tiger_Zhao 
    程序里凡是之前打开过的rs,conn我全部关了,也都set 为nothing了,仍然会报错
    程序主要就一个功能,就一个纯粹的查询而已,其它的都是辅助拼接这个SQL语句的
    我就打开一次,怎么可能锁2个表,VB应该怎么打开它呢,1,1或者,1,3都一样的报错to AisaC 
    具体版本不清楚,是sybase iq列结构的新型数据库
    其实就是oconn3去连接ODBC,然后RS_DATA去执行查询操作,很简单的事情,VB6 IDE下就没事,可执行程序有有一定的概率报错,语句越复杂越长就越可能报错,跟我其它的代码没什么关系了,我都关闭并且set他们为nothing了,不会有影响的
      

  18.   

    to AisaC 
    我就是根据可视化的几个按钮和列表来拼出查询数据库锁需要的SQL语句来,然后用那么简单的一句代码进行查询
    就这么简单的个事,我拼出来的语句太长了,无法粘贴上来,反正很多很多软件都可以连ODBC进行查询, 这个语句是可以正常查询的。这么说吧,我把程序其它的全部功能都废弃,直接把这句SQL拿来查询,VB IDE下是OK的,可执行程序就不行
    一个按钮,三五句代码,仍然是这样的情况
    SQL语句简单些就没问题了仍然在Rs_Data.Open strOpen, oConn3, 1, 1报错
    Rs_Data是定义后马上就使用的局部变量
    我曾经慢慢的尝试过,比如说都是聚合的SUM语句,慢慢的一句一句的加,所加的每一句都可以单独的查询获得到结果,然后加到一定的长度了,就没法再加了,再加就报错了
    有没有什么办法模拟出VB IDE的运行环境呢?好多软件都可以用SQL语句连ODBC查询,我的软件就卡在这个地方了,要疯了
      

  19.   

    比如都是一大堆的类似这样的语句:SUM(CLEVENTIV_HOINBOCHV) AS HOINBOCHV ,
    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打败了,十几年没遇到过这种坎过不去
      

  20.   

    试试:
    set Rs_Data=oConn3.execute( strOpen)
      

  21.   

    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_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
      

  22.   

    其实SELECT里有一百列结果的话,好难得有一列是错的(我自己用了很久,就发现上面这一列结果不对),公式是一模一样的,查询语句是一模一样的
    虽然总体来说大部分的结果是对的,但是软件不靠谱,就让人不敢用,我好烦躁
      

  23.   

    Sybase 就是这么悲剧,一次查询两个表就锁两个表。
    请勿使用魔法数!
      

  24.   

    除数里面 +0.001 是为了避免除零错吧?这不影响精度?
    SQL Server 可以用 CASE 语句,不同的情况用不同的计算表达式,Sybase 没有类似的语句?又:贴代码请整理一下排版,然后用编辑框上面工具条的代码格式,放在 UBB 标记里面。
      

  25.   

    to Tiger_Zhao 
    非常感谢你的解答
    其实我这边大部分的公式都是这样的,但是目前只发现这一个语句的返回结果跟其它纯SQL的查询软件查到的结果不一样,差别非常非常大,不是精度问题
    使用的语句一模一样我也在ODBC里追踪了,发现别人的软件该干什么就干什么,VB的程序就N条消息,不停
      

  26.   

    检查参与运算的各字段类型,精度是否一致?不一致时加上显式转换试试。
    将这条记录参与运算的各字段 SELECT 出来,看 VB 结果和查询工具是否一致。
    如果上面的值一致,那么将 SQL 计算公式中的字段直接换成数值,再查询看是否一致。