求在数据表中最快的精确查询方法

cokeliu 九月天电子 技术总监  2006-02-24 09:56:30
俺是新手. 用VB做了个物料管理Access数据库. 需要用text文本框做为物料编号的输入. 在物料输入时候.先查询数据表中是否有同编号的记录. 我用的查询方法可以实现. 但效率非常低. 特别是现在数据库有几千条记录时候. 从表头查到表尾的花一分种. 太长了. 以下是我的代码. 请问哪位大侠帮改改. 主要是想知道当前数据表中时候有同物料编号和描述的记录存在. 如有. 增加新记录失败.
'检查是否物料编号重复
If Adodc1.Recordset.RecordCount > 0 Then
Adodc1.Recordset.MoveFirst
Do While Adodc1.Recordset.EOF <> True
If Adodc1.Recordset.Fields(1).Value = Text1(1).Text Or Adodc1.Recordset.Fields(2).Value = Text1(2).Text Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
Text1(1).SetFocus
Exit Sub
End If
Adodc1.Recordset.MoveNext
Loop
End If
...全文
160 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
1984bobby 2006-02-28
同问~我也有这个问题呢
回复
cokeliu 2006-02-28
搂上的大侠查询的是EXCEL文挡吧!
回复
引用Excel("工程"/"引用"/Microsoft Excel Object X.0 Library)
Private Sub Command1_Click()
Dim AdoCon As New ADODB.Connection
Dim AdoRec As New ADODB.Recordset
Dim ctl As Object

AdoCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\test.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""

'根据用户输入的姓名,查找对应的记录
AdoRec.Open "select 姓名,年龄,学历,性别 from [Sheet1$] where 姓名='" & Text1.Text & "' ", AdoCon, adOpenDynamic, adLockReadOnly

With DataReport1
Set .DataSource = AdoRec
For Each ctl In .Sections.Item("Section1").Controls
If TypeName(ctl) = "RptTextBox" Then
Select Case ctl.Name
Case "Text1"
ctl.DataField = AdoRec.Fields("姓名").Name
Case "Text2"
ctl.DataField = AdoRec.Fields("年龄").Name
Case "Text3"
ctl.DataField = AdoRec.Fields("学历").Name
Case "Text4"
ctl.DataField = AdoRec.Fields("性别").Name
End Select
End If
Next
End With
DataReport1.Show
End Sub

回复
gdgf 2006-02-25
请问你的连接是否已经成功打开了?
为了确定是否成功,你可加入下列语句:
在过程开时:
   on error resume next
在下语句之后 cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & dataname
加上: if err then msgbox err.description
若此处出错,则后面肯定不正确.

此外,你的这条语句也将出现类型不匹配的错误: If rs.Fields(0).Value = "" Then
因为 rs.Fields(0).Value 的类型为数值型,非字符串类型.

建议在 
  Set rs = cn1.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
之后,加上: if err then msgbox err.description
这样,可以有助于排错.

再试试吧.

回复
楼主,用SQL语句啦,很简单的,随便找本书看一下吧,会让你的数据库程序有本质上的飞跃的
回复
cokeliu 2006-02-24
re: 谢谢各位.
gdgf. 我按照你的程序更改如下.
Dim con As ADODB.Connection
Dim rs As Recordset
Set rs = con.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
If rs.Find Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
程序执行出错. 错在 if rs.Find这条句子.

christion:按照你的程序更改如下. 执行也出错.
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
While Not rst.EOF
If Text1(1).Text = rst.Fields("物料编号") Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
Wend

faysky2: 您的程序应该会重新设置adodc1的数据源吧. 那么datagrid显示也会变. 我只想查询是否有重叠编号. 不需要重新建立数据源. 怎么修改才好?
回复
faysky2 2006-02-24
Adodc1.RecordSource = "select * from 表 where 第2列列名='" & Text1.Text & "' or 第3列列名='" & Text2.Text & "'"
Adodc1.Recordset.Requery
If Not Adodc1.Recordset.EOF Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"

End If
回复
christion3 2006-02-24
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
sql = "select distinct 物料编号 from form "
While Not rst.EOF
If text1.Text = rst.Fields("物料遍号") Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
text1(1).SetFocus
End If
Wend
con.ConnectionString = ""
con.Open
rst.Open con, sql, adOpenDynamic, adLockOptimistic, -1
End Function
回复
gdgf 2006-02-24
首先建立ADO连接 connection
然后:
dim rs as Recordset

set rs=connection.execute("select count(*) from TableName where 编号='" & text1 & "'")

if rs.fie;f(0) then msgbox "已存在"
回复
lc_mtt 2006-02-24
汗!不会用SQL语句搜索啊!晕死
回复
cokeliu 2006-02-24
Public cn1 As New ADODB.Connection
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & dataname
Dim rs As Recordset
Set rs = cn1.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
If rs.Fields(0).Value = "" Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
以上是我按照gdgf大侠的意思更改后的程序. 运行出错. 好象还没连到数据库.
========================================================================
增加新物料前. 该数据库已经被adodc连接到并打开显示在datagrid了.
我只想在输入新物料前. 查查看是否与数据表中记录重叠(查询的结果不需要显示datagrid中.也就是这个查询是后台运行的). 我只要知道是否找到重叠的记录即可. 我忙了一上午了. 还是不行. 真是晕啊!
回复
gdgf 2006-02-24
楼主,你定义的连接con尚未打开,当前会出错啦!

1、你表中的[物料编号]最好建立索引。
2、定义 Dim con As New ADODB.Connection
用Open方法打开与数据库的连接:
con.Open ConnectString
其中,ConnectString 是连接到你的数据库的连接串(不清楚如何设置可参考VB联机帮助)
只有当con.Open 方法正确打开后,才能继续后面的查询操作。

Dim rs As Recordset
Set rs = con.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")

在此用rs.Find方法是不行的,只能通过判断rs.Field(0).Value的值。
因为用 select Count(*) 返回的记录一定存在(非0的数字),程序可通过判断此数值确定记录是否存在。

回复
相关推荐
发帖

1188

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2006-02-24 09:56
社区公告
暂无公告