| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 646 人关注过本帖
标题:[已解决]请教关于ADO控件的相关实例问题。
只看楼主 加入收藏
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
结帖率:96.77%
收藏
已结贴  问题点数:20 回复次数:9 
[已解决]请教关于ADO控件的相关实例问题。
界面:
图片附件: 游客没有浏览图片的权限,请 登录注册

代码:
程序代码:
Option Explicit
Private Sub Command1_Click()           'Command1单击事件
Dim i As Integer                   '定义i为整型变量
Adodc1.RecordSource = "select * from 库存表 where 药品序号=' " & Trim(Text1(0).Text) & "'"
Adodc1.Refresh
Set DataGrid1.DataSource = Adodc1
'判断输入数据是否存在
If Adodc1.Recordset.RecordCount > 0 Then          '如果存在则执行。
MsgBox "您输入的记录已存在,请重新输入。", vbOKOnly + vbCritical, "错误提示"
Else
Adodc1.Recordset.AddNew
For i = 0 To 4

 Adodc1.Recordset.Fields(i) = Text1(i).Text

 Next i

 Adodc1.Recordset.Update

 MsgBox "记录添加成功", vbOKOnly + vbInformation, "Information"
  Adodc1.RecordSource = "select * from 库存表 order by 药品序号"

 Adodc1.Refresh
End If
End Sub
Private Sub Form_Load()                 'Load事件
Adodc1.Visible = False                  '隐藏adodc1控件,使其不可见。
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\STMZHJ_db.mdb;persist security info=false"
'连接数据库
Adodc1.RecordSource = "select * from 库存表 order by 药品序号"    '连接数据表
Set DataGrid1.DataSource = Adodc1              '将Adodc1的源数据赋值给Datagrid1。
End Sub


IF  循环语句。
If Adodc1.Recordset.RecordCount > 0 Then          '如果存在则执行。
MsgBox "您输入的记录已存在,请重新输入。", vbOKOnly + vbCritical, "错误提示"
为什么当Adodc1.Recordset.Recordcount=1的时候,不执行Then后面的语句,反而执行Else后面的语句?
经验总结:
1.[非技术性]写代码时一定要认真啊。。。纫针啊。。一点的马虎可能会使你整个程序都达不到想要的结果。
2.[技术性]正常的recordcount对于过大的数据库数据不能返回准确的记录数,但对于100条以内的记录还是能准确的(好像和bookmark、游标类型等有关,如果对几十万记录统计记录数将极端消耗资源,必须遍历所有记录后才得到准确的数据)。
所以在做大数据程序的时候要谨慎使用recordcount属性
大家要注意帖子中的几个误区:
1.chen3523言论:“个人理解是:Adodc1.Recordset.RecordCount不存在,所以跳到Else后的语句。”这个是错误的。
2.wmf2014言论:“打开记录集时并不能立即返回记录数,需要异步等一段时间才返回正确的RecordCount”这个是不严谨的。应该是说在大数据的情况下,才会出现不能立即返回的情况。而我仅有10几条记录,不存在这个问题。
3.wmf2014言论:“你想要知道打开的记录里是否有记录应该用语句if rs.eof and rs.bof then 没有记录”这个我测试了,用rs,eof and rs.bof不能完成。(大家可以去试一下。不带表别人不可以)
基于以上的错误言论,大家要注意。列出以上并不是要说谁的不好,只是希望大家提起注意。以上几位给与了我很大的帮助。在此表示感谢。
问题完美解决。感谢xzlxzlxzl版主。


[ 本帖最后由 VB丶小宇 于 2014-12-21 18:37 编辑 ]
2014-12-20 16:49
chen3523
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:33
帖 子:223
专家分:1165
注 册:2013-2-12
收藏
得分:0 
我做过类似的程序。把text2与Adodc1捆绑,让text2显示“存在记录”。通过SQL查询方式Adodc1.RecordSource = "select * from 库存表 where 药品序号=' " & Trim(Text1(0).Text) & "'"。通过Text2来判断是否有记录。我查《VB6.0程序设计与开发技术大全》没发现介绍RecordCount属性。

调试失败3次后,关机睡觉,当醒来时多有收获。
2014-12-20 21:01
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
收藏
得分:0 
以下是引用chen3523在2014-12-20 21:01:42的发言:

我做过类似的程序。把text2与Adodc1捆绑,让text2显示“存在记录”。通过SQL查询方式Adodc1.RecordSource = "select * from 库存表 where 药品序号=' " & Trim(Text1(0).Text) & "'"。通过Text2来判断是否有记录。我查《VB6.0程序设计与开发技术大全》没发现介绍RecordCount属性。

您好,您的意思我没有明白,麻烦您再解释一遍。
我的问题是这样的:
图片附件: 游客没有浏览图片的权限,请 登录注册

如图所示:Adodc1.Recordset.RecordCount的值为1.
所以我做了一个判断,
当Adodc1.Recordset.RecordCount>0时。执行Then后面的语句。
可这里。Adodc1.Recordset.RecordCount的值为1>0,程序为什么不执行Then后面的语句?
反而执行了Else后面的语句?这不符合逻辑啊!

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-12-21 08:58
chen3523
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:33
帖 子:223
专家分:1165
注 册:2013-2-12
收藏
得分:5 
《VB6.0参考详解》(清华大学出版社)ovject.RecordCount具体为“应用于”列表中的一个对象。本属性用来返回记录集中的记录数,返回值为长整型。应用于DataRepeater控件。《VB6.0程序设计与开发技术大全》在介绍Adodc1控件时没介绍RecordCount属性。我个人理解是:Adodc1.Recordset.RecordCount不存在,所以跳到Else后的语句。(顺便一说,本人是自学的,对书本知识理解得不一定正确

调试失败3次后,关机睡觉,当醒来时多有收获。
2014-12-21 12:48
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
师兄说,你在Adodc1.Refresh后加一句msgbox Adodc1.Recordset.RecordCount看记录数的值就知道怎么回事了。师兄解释说:打开记录集时并不能立即返回记录数,需要异步等一段时间才返回正确的RecordCount,记录数越多,需要的时间越长,你想要知道打开的记录里是否有记录应该用语句
if rs.eof and rs.bof then 没有记录

能编个毛线衣吗?
2014-12-21 13:52
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
收藏
得分:0 
以下是引用chen3523在2014-12-21 12:48:45的发言:

《VB6.0参考详解》(清华大学出版社)ovject.RecordCount具体为“应用于”列表中的一个对象。本属性用来返回记录集中的记录数,返回值为长整型。应用于DataRepeater控件。《VB6.0程序设计与开发技术大全》在介绍Adodc1控件时没介绍RecordCount属性。我个人理解是:Adodc1.Recordset.RecordCount不存在,所以跳到Else后的语句。(顺便一说,本人是自学的,对书本知识理解得不一定正确

您好,首先非常感谢您的回复。
我的理解跟您是相同的:“应用于”列表中的一个对象。本属性用来返回记录集中的记录数。
正因为属性用来返回记录集中的记录数,所以我才做了一个if的判断语句。
If Adodc1.Recordset.RecordCount > 0 Then          '如果存在则执行。
MsgBox "您输入的记录已存在,请重新输入。", vbOKOnly + vbCritical, "错误提示"
Else
Adodc1.Recordset.AddNew
For i = 0 To 4
Adodc1.Recordset.Fields(i) = Text1(i).Text
Next i
Adodc1.Recordset.Update
MsgBox "记录添加成功", vbOKOnly + vbInformation, "Information"
  Adodc1.RecordSource = "select * from 库存表 order by 药品序号"
Adodc1.Refresh
思路很简单:首先判断返回记录集中的记录数是否>0,也就是说。看看返回的记录集是否有记录。如果有记录,就代表这条记录已经存在在这个数据表中了,所以不允许重复的记录继续添加。
如果没有记录,就表明所添加的是一条新的记录。所以提示添加纪录成功。添加并保存。
然后您所说的。
“Adodc1.Recordset.RecordCount不存在,所以跳到Else后的语句。”这句话我是不认可的。个人认为也是错误的言论。如果不存在,VB应该会给出相应的错误提示,或者就根本不能引用。
但是,您的回答对我来说就是一种动力,感谢!

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-12-21 14:17
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
收藏
得分:0 
以下是引用wmf2014在2014-12-21 13:52:32的发言:

师兄说,你在Adodc1.Refresh后加一句msgbox Adodc1.Recordset.RecordCount看记录数的值就知道怎么回事了。师兄解释说:打开记录集时并不能立即返回记录数,需要异步等一段时间才返回正确的RecordCount,记录数越多,需要的时间越长,你想要知道打开的记录里是否有记录应该用语句
if rs.eof and rs.bof then 没有记录

使用了您的方法,确实是您说的这样。
如图A:
图片附件: 游客没有浏览图片的权限,请 登录注册

确实是,在药品序号中输入12,这个12号是数据表中现有的数据。但是仍然给出了0条记录数的弹窗。
0>0肯定是不满足的。所以执行Else后面的语句。
但是药品序号"12"确实是存在在数据表中的。故会报错,如图B:
图片附件: 游客没有浏览图片的权限,请 登录注册

问题的发生我明白了。
但还是有几个问题要问:
QA:打开记录集为什么不能立即返回记录数?原因:BUG?
QB:何为异步?异步是怎么定义的?记录数越多,需要的时间越长?难道100000条记录还要反应10分钟么。。
应该用语句 if rs.eof and rs.bof then 我试一试。
非常感谢。到目前为止,您的比较正确。

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-12-21 15:57
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
收藏
得分:0 
以下是引用wmf2014在2014-12-21 13:52:32的发言:

师兄说,你在Adodc1.Refresh后加一句msgbox Adodc1.Recordset.RecordCount看记录数的值就知道怎么回事了。师兄解释说:打开记录集时并不能立即返回记录数,需要异步等一段时间才返回正确的RecordCount,记录数越多,需要的时间越长,你想要知道打开的记录里是否有记录应该用语句
if rs.eof and rs.bof then 没有记录

您好。。刚试了下if rs.eof and rs.bof then 。。没有解决。。
不知道能否麻烦您将代码贴上来。。看看

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-12-21 16:40
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
根据你的描述,非常怀疑你的sql语句有问题。因为正常的recordcount虽然不能返回准确的记录数,但对于100条以内的记录还是能准确的(好像和bookmark、游标类型等有关,如果对几十万记录统计记录数将极端消耗资源,必须遍历所有记录后才得到准确的数据)。你使用了条件筛选,应该只有一条记录,recordcount应该不能为0的,你直接在Adodc1.Refresh后执行msgbox Adodc1.Recordset.eof语句,如果显示true(或-1)则说明你的sql语句没有查到记录,语句有问题。
2014-12-21 16:40
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
收藏
得分:0 
以下是引用xzlxzlxzl在2014-12-21 16:40:41的发言:

根据你的描述,非常怀疑你的sql语句有问题。因为正常的recordcount虽然不能返回准确的记录数,但对于100条以内的记录还是能准确的(好像和bookmark、游标类型等有关,如果对几十万记录统计记录数将极端消耗资源,必须遍历所有记录后才得到准确的数据)。你使用了条件筛选,应该只有一条记录,recordcount应该不能为0的,你直接在Adodc1.Refresh后执行msgbox Adodc1.Recordset.eof语句,如果显示true(或-1)则说明你的sql语句没有查到记录,语句有问题。

您好,我非常高兴的告诉您,您的推断是正确的。是我的SQL语句有问题。
首先加上msgbox Adodc1.Recordset.eof值为true。
表明没有在表中查到数据。
为了验证我的SQL语句。我特意添加了一个Command按钮。caption改为查询。
输入代码。
Adodc1.RecordSource = "select * from 库存表 where 药品序号='" & Trim(Text1(0).Text) & "'"
Adodc1.Refresh
Set DataGrid1.DataSource = Adodc1
然后我在text(0)1.text输入数据表中现有的数据。结果是可以查到的。然后我就检查添加按钮的SQL语句。。你猜怎么着?
因为我的马虎,多写了一个空格。所以造成查询数据的错误。也就是这条查询语句根本没起作用。
错误的查询语句:Adodc1.RecordSource = "select * from 库存表 where 药品序号='"  & Trim(Text1(0).Text) & "'"
正确的查询语句:Adodc1.RecordSource = "select * from 库存表 where 药品序号='" & Trim(Text1(0).Text) & "'"
感谢您的指点!

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-12-21 18:06
快速回复:[已解决]请教关于ADO控件的相关实例问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029079 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved