俺是新手. 用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

解决方案 »

  1.   

    汗!不会用SQL语句搜索啊!晕死
      

  2.   

    首先建立ADO连接 connection
    然后:
    dim rs as Recordsetset rs=connection.execute("select count(*) from TableName where 编号='" & text1 & "'")if rs.fie;f(0) then msgbox "已存在"
      

  3.   

    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
      

  4.   

    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
      

  5.   

    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
        Wendfaysky2: 您的程序应该会重新设置adodc1的数据源吧. 那么datagrid显示也会变. 我只想查询是否有重叠编号. 不需要重新建立数据源. 怎么修改才好?
      

  6.   

    楼主,用SQL语句啦,很简单的,随便找本书看一下吧,会让你的数据库程序有本质上的飞跃的
      

  7.   

    楼主,你定义的连接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的数字),程序可通过判断此数值确定记录是否存在。
      

  8.   

    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中.也就是这个查询是后台运行的). 我只要知道是否找到重叠的记录即可. 我忙了一上午了. 还是不行. 真是晕啊!
      

  9.   

    请问你的连接是否已经成功打开了?
    为了确定是否成功,你可加入下列语句:
    在过程开时:
       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 
    这样,可以有助于排错.再试试吧.
      

  10.   

    引用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
      

  11.   

    搂上的大侠查询的是EXCEL文挡吧!