ADO连接数据库一点小问题,谢谢

ybw2001 2002-05-21 09:40:23
我打开记录集后,
使用语句 rs.movelast,系统出错“行集不支持反向取”
屏蔽掉,取 max=rs.recordcount , max=-1;
敢问各位,这是为什么?

(记录集已经打开,因为

Text1.Text = rs.Fields("CRTYPE")
有显示值。)

代码如下:

Dim db As ADODB.Connection
Dim rs As ADODB.Recordset

Set db = New ADODB.Connection
Set rs = New ADODB.Recordset

db.ConnectionString = "provider=ibmdadb2;dsn=...;uid=dwuser;pwd=dwuser;database=..."
db.Open

Set rs = db.Execute("select * from XXX.EXCHANGE_RATE where EXTRACT_DATE='20020520'")

rs.MoveLast '行集不支持反向取

Dim max As Integer
max = rs.RecordCount

Text1.Text = max
Text2.Text = rs.Fields("CRTYPE")

rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
...全文
5 点赞 收藏 21
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒星 2002-05-21
To ybw2001(血仍未冷):
  呵呵,笔误,笔误。
回复
ybw2001 2002-05-21
Thank you,thank you! :)

果然搞定.(脸上写满泪水的问:)朋友哪里人

寒兄说的也对,不过语句
db.CursorLocation = adUserClient
的位置不太正确,应该在打开数据库之前定义属性。

db.ConnectionString = "provider=ibmdadb2;dsn=...;uid=dwuser;pwd=dwuser;database=... "

db.CursorLocation = adUserClient
db.Open
不过,同样感谢,有分相送。呵呵
回复
xi_sea 2002-05-21
如果不对我再帮你找,一定要把它拿下,呵呵!!!
回复
xi_sea 2002-05-21
我终于找到原因了,我刚才在vb中调试了,vb中的游标支持反向提取记录集,但必须设db.CursorLocation = adUseClient这样就可以了,我刚才试了
就是这的毛病。代码如下:

Private Sub Form_Load()
Dim db As Connection
Dim rs As Recordset

Set db = New ADODB.Connection
Set rs = New ADODB.Recordset

With db
.CursorLocation = adUseClient
.Provider = "SQLOLEDB;"
.ConnectionString = "User ID=sa;Data Source = citsql;Initial Catalog = pmpdb"
.Open
End With
Set rs = db.Execute("select * from jobs")

rs.MoveLast
MsgBox rs.RecordCount

rs.Close
Set rs = Nothing
db.Close
Set db = Nothing

End Sub
回复
ybw2001 2002-05-21
就是加的那一行。

难道是因为“用EXECUTE返回的RECORDSET是只读的,并且是仅向前光标。如果你需要用RECORDSET物件的更多函数,你首先要创建RECORDSET物件并设置想要设置的属性然后用OPEN方法打开它来执行查询和返回想要得到的光标类型.?

回复
寒星 2002-05-21
To ybw2001(血仍未冷):
  嗯?“变量或类型不正确,或者不在可以接受的范围内...”发生在哪一行?
回复
ybw2001 2002-05-21
使用joan的方法,同样提示“行集不支持反向取”

天啊!难道没有高手了吗?
回复
ybw2001 2002-05-21
谢谢寒星和小溪,

星:我开始就试过,不行,说“变量或类型不正确,或者不在可以接受的范围内...”

溪:XXX.EXCHANGE_RATE 确实是IBM DB2 数据库中的表名
回复
xi_sea 2002-05-21
我又注意到了一点,是你的问题所在
sql语句错误
Set rs = db.Execute("select * from XXX.EXCHANGE_RATE where EXTRACT_DATE='20020520'")
XXX.EXCHANGE_RATE 应是表名XXX而不是字段
满意了吧!
回复
ybw2001 2002-05-21
我觉得不是记录集打开方式的问题,记录集已经打开。
因为令
Text2.Text = rs.Fields("CRTYPE")
有显示第一条记录正确字段值。
难道打开的记录集是循环链表,指针指在...也不对啊
回复
寒星 2002-05-21
我不是说了嘛,你的记录集打开方式有问题:
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset

Set db = New ADODB.Connection
Set rs = New ADODB.Recordset

db.ConnectionString = "provider=ibmdadb2;dsn=...;uid=dwuser;pwd=dwuser;database=..."
db.Open

db.CursorLocation = adUserClient
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Set rs = db.Execute("select * from XXX.EXCHANGE_RATE where EXTRACT_DATE='20020520'")

rs.MoveLast

Dim max As Integer
max = rs.RecordCount

Text1.Text = max
Text2.Text = rs.Fields("CRTYPE")

rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
回复
xi_sea 2002-05-21
你是在数据库方面出现了问题,试试下面的函数,调用一下吧
Public Function dbConnect() As Integer

Set dbConnection = New Connection
With dbConnection
.CursorLocation = adUseClient
.Provider = "SQLOLEDB;"
.ConnectionString = "uid=...;dsn=...;pwd=...;database=.."
.Open
End With
end Function
Public Function RecordSetOpen(strQuery As String) As Recordset

Set RecordSetOpen = New Recordset
With RecordSetOpen
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.ActiveConnection = dbConnection
.PageSize = 50
.CursorLocation = adUseClient
.Open strQuery
End With
Exit Function
Exit Function
回复
ybw2001 2002-05-21
问题不是很难吧
加加加加加加加加加加加加加加 分---------!!
回复
ybw2001 2002-05-21
不行,记录集已经打开了啊,我觉得(见本贴)
回复
no_com 2002-05-21
打开记录集得方式不对,按 joan_lu(joan) ( ) 说得试试~
回复
no_com 2002-05-21
打开记录集得方式不对,按 joan_lu(joan) ( ) 说得试试~
回复
ybw2001 2002-05-21
不行,都不行
回复
joan_lu 2002-05-21
Set rs = db.Execute("select * from XXX.EXCHANGE_RATE where EXTRACT_DATE='20020520'")

改成rs.open "select .....",db,3,1
回复
寒星 2002-05-21
db.CursorLocation = adUserClient
回复
ybw2001 2002-05-21
谢谢,但提示
#20020520#在使用它的上下文使用无效 :(
回复
发动态
发帖子

1180

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
社区公告
暂无公告