rs.CursorType = adOpenStatic
改成这个看看需要那么麻烦用参数码?直接select ... from ... where vsl..=aaa or call...=bbb
这样看看

解决方案 »

  1.   

    各种CursorType的参数都试过了,但都不行。您所说的用aaa,bbb等,对写程序来说是比较方便。但由于该程序将实时运行,对oracle数据库产生较大的影响。故我们要求sql语句都写成用参数的形式,提高(SGA中)重新利用率。
      

  2.   

    这与CursorType的设置有关。当CursorType的值为adOpenDynamic或adOpenForwardOnly时,ADO不能提供RecordCount的确切值。而设为adOpenStatic与adOpenKeySet时可以。
      

  3.   

    运行完上述代码后,
    运行rst.movelast
    这样再查rst.recordcount。就可以了。
      

  4.   

    rs.CursorLocation=3,然后结合着修改CursorType,就差不多了!
      

  5.   

    对,先记下目前的位置。
    用rs.movelast
    rs.movefirst
    再移回来,保证就行了。
      

  6.   

    如果CursorType被设成adOpenForwardOnly的话,是不可以使用Move、MoveNext之类的方法的。且这样做效率不高嘛。如果你真的不想使用我所说的方法,还可以使用select count(*) from tablename来取recordcount。不过,要多与数据库连接一次。:)
      

  7.   

    各位,你们提供的方法我都试过了,不管是数字还使用adOpenStatic、adOpenKeySet都是不行的,各位高手帮我看看是什么原因?很怪的是:有跟踪的时候,还是可以看到有值的,但就是RECORDCOUNT=-1.
      

  8.   

    请跟踪一下,看看Set rst = cmd.Execute执行完后rst.CursorType有没有被改变?
      

  9.   

    我想我找到原因了,问题出在Command对象的Execute方法上,我试了一下,有此方法执行后,它会将返回的记录集的CursorType置为adForwardOnly。所以,recordcount为-1也就不奇怪了。
      

  10.   

    rst为-1是因为rst里找到的记录为空
    可以改为
    if not rst.eof then
    ‘execute
    end if
      

  11.   

    to  寒星
    您说得对,不管我前面怎么设置cursortype,执行了以后,cursortype就会变成0,不知道您有什么高见?
      

  12.   

    我看了你上面写的代码,其实没有必要使用Command对象嘛,可以用Connection来做呀,它返回的对象不会有这种问题的。你试试看。
      

  13.   

    to 寒星:
    我前面已经说过,我必须要用command对象来做,因为只有它才能加参数,oracle才能处理它的参数。
      

  14.   

    rs.CursorLocation=3 
    你的代码可以简化为 
       Dim rst As New ADODB.Recordset
       Set conn = New ADODB.Connection
       conn.Open "DSN=eview32;UID=EDI;PWD=EDI;DBQ=EVCTMS32;ASY=ON;"
       sql = "select * from vessel where vsl_eng_name=? or
       rst.open sql,conn,1,3
       if not (myrs.eof and myrs.bof) then
           progressbar1.max=rst.recordcont
       end if
        
      

  15.   

    to hosia(红霞飞):
    我没有在Oracle上做过应用,这方面无法给你建议。但我认为Connection的Execute方法与Recordset的Open方法不太可能不适用于Oracle呀。如果真不行,那Select count(*) From TableName总该可以了吧?建议你还是再看看Connection与Recordset的设置是不是有问题,没道理呀。
      

  16.   

    试试下面的方法:
       Dim rst As New ADODB.Recordset
       Dim cmd As New ADODB.Command
       Set conn = New ADODB.Connection
       Dim pm1 As ADODB.Parameter
       Dim pm2 As ADODB.Parameter
         
         rst.CursorLocation = adUseClient
         rst.CursorType = adOpenKeyset
         rst.LockType = adLockBatchOptimistic     conn.CursorLocation = adUseClient
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     
         conn.Open "DSN=eview32;UID=EDI;PWD=EDI;DBQ=EVCTMS32;ASY=ON;"
         sql = "select * from vessel where vsl_eng_name=? or call_sign=? "
         cmd.CommandType = adCmdText
         cmd.CommandText = sql
         Set pm1 = cmd.CreateParameter("a", adVarChar, adParamInput, 10, vesname)
         Set pm2 = cmd.CreateParameter("b", adVarChar, adParamInput, 10, callsign)
         cmd.Parameters.Append pm1
         cmd.Parameters.Append pm2
         Set cmd.ActiveConnection = conn
         Set rst = cmd.Execute我试了,好象是可以的。
      

  17.   

    if not rst.eof then
       rst.movelast
       msgbox rst.RecordCount
    end if
      

  18.   

    to hosia(红霞飞):
    可以了吧?
      

  19.   

    to tonyjoule(寒星㊣) :
    可以了,谢谢你!到底怎么回事?另外,我该怎么给你分数。
      

  20.   

    to hosia(红霞飞):
    呵呵,在“我的问题”中选择此问题的“管理”功能后就可以给分了。
    之所以加了那句话就可以了,原因我想是因为,Connection对象默认的CursorLocation是adUseServer,此时记录集是存放在服务器上的;而选adUseClient时,记录集是存放在ADO临时引擎中的。
      

  21.   

    to TonyJoule(寒星㊣):
    我就给您100分了,以后还得请您多多关照了!
    您是不是对vb很了解。我想问问您是否知道vb中怎样连接水晶报表?
      

  22.   

    to  TonyJoule(寒星㊣):  
    我已经给你了吗?
    您知道vb连接水晶报表吗?