如果CursorType被设成adOpenForwardOnly的话,是不可以使用Move、MoveNext之类的方法的。且这样做效率不高嘛。如果你真的不想使用我所说的方法,还可以使用select count(*) from tablename来取recordcount。不过,要多与数据库连接一次。:)
to 寒星: 我前面已经说过,我必须要用command对象来做,因为只有它才能加参数,oracle才能处理它的参数。
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
to hosia(红霞飞): 我没有在Oracle上做过应用,这方面无法给你建议。但我认为Connection的Execute方法与Recordset的Open方法不太可能不适用于Oracle呀。如果真不行,那Select count(*) From TableName总该可以了吧?建议你还是再看看Connection与Recordset的设置是不是有问题,没道理呀。
试试下面的方法: 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我试了,好象是可以的。
if not rst.eof then rst.movelast msgbox rst.RecordCount end if
to hosia(红霞飞): 可以了吧?
to tonyjoule(寒星㊣) : 可以了,谢谢你!到底怎么回事?另外,我该怎么给你分数。
to hosia(红霞飞): 呵呵,在“我的问题”中选择此问题的“管理”功能后就可以给分了。 之所以加了那句话就可以了,原因我想是因为,Connection对象默认的CursorLocation是adUseServer,此时记录集是存放在服务器上的;而选adUseClient时,记录集是存放在ADO临时引擎中的。
to TonyJoule(寒星㊣): 我就给您100分了,以后还得请您多多关照了! 您是不是对vb很了解。我想问问您是否知道vb中怎样连接水晶报表?
运行rst.movelast
这样再查rst.recordcount。就可以了。
用rs.movelast
rs.movefirst
再移回来,保证就行了。
可以改为
if not rst.eof then
‘execute
end if
您说得对,不管我前面怎么设置cursortype,执行了以后,cursortype就会变成0,不知道您有什么高见?
我前面已经说过,我必须要用command对象来做,因为只有它才能加参数,oracle才能处理它的参数。
你的代码可以简化为
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
我没有在Oracle上做过应用,这方面无法给你建议。但我认为Connection的Execute方法与Recordset的Open方法不太可能不适用于Oracle呀。如果真不行,那Select count(*) From TableName总该可以了吧?建议你还是再看看Connection与Recordset的设置是不是有问题,没道理呀。
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我试了,好象是可以的。
rst.movelast
msgbox rst.RecordCount
end if
可以了吧?
可以了,谢谢你!到底怎么回事?另外,我该怎么给你分数。
呵呵,在“我的问题”中选择此问题的“管理”功能后就可以给分了。
之所以加了那句话就可以了,原因我想是因为,Connection对象默认的CursorLocation是adUseServer,此时记录集是存放在服务器上的;而选adUseClient时,记录集是存放在ADO临时引擎中的。
我就给您100分了,以后还得请您多多关照了!
您是不是对vb很了解。我想问问您是否知道vb中怎样连接水晶报表?
我已经给你了吗?
您知道vb连接水晶报表吗?