2012-05-02 19 views
1

我在MS Access 2010中有一个数据库。我不是DB的创建者,也没有办法联系他来问这个问题。这是一个拥有许多表和记录的大型数据库,表和列的名称是非常不具描述性的。基本上,我试图找到哪个表/列存储某些数据,并且我特别知道数据的价值。例如:我知道有一个客户被称为'ABCDEF',因为我刚刚使用使用数据库的软件添加了它。现在,我需要知道哪些表存储这些客户数据。在数据库中查找文本而不知道表或列是什么?

这可能吗?一种按表,按记录记录,按字段逐个数据库并将其与我的字符串进行比较的方法?

回答

1

试试这个

Public Sub FindInAllTables(ByVal s As String) 
    Dim db As DAO.Database, rs As DAO.Recordset 
    Dim tdf As DAO.TableDef, fld As DAO.Field 
    Dim pattern As String 

    pattern = "*" & s & "*" 
    Set db = CurrentDb 
    For Each tdf In db.TableDefs 
     If (tdf.Attributes And dbSystemObject) = 0 Then 
      On Error Resume Next 
      Set rs = tdf.OpenRecordset(dbOpenSnapshot) 
      If err.Number = 0 Then 
       On Error GoTo 0 
       Debug.Print "Scanning [" & tdf.Name & "] "; 
       Do Until rs.EOF() 
        For Each fld In rs.Fields 
         If fld.Value Like pattern Then 
          Debug.Print 
          Debug.Print " Match in [" & tdf.Name & "].[" & _ 
           fld.Name & "] ===> """ & fld.Value & """"; 
          Exit Do 
         End If 
        Next fld 
        If rs.AbsolutePosition Mod 1000 = 999 Then 
         Debug.Print "."; 
        End If 
        rs.MoveNext 
       Loop 
       Debug.Print 
       rs.Close 
      Else 
       On Error GoTo 0 
       Debug.Print "Cannot open table [" & tdf.Name & "]" 
      End If 
     End If 
    Next tdf 
    db.Close 
End Sub 

此发现包含在一个字段的任何部分字符串。如果您只想查找整个字段,请用If fld.Value = s Then替换If fld.Value Like pattern Then

+0

当我试图在即时窗口中执行它时,它会显示“运行时错误3167”:记录被删除。“ – Antrim

+0

奇怪。这不会发生在我的数据库中。有人在同一时间在同一个数据库上工作吗?尝试添加一些错误处理('On Error Resume Next'或类似的)。 –

+0

我试了两种方法,并且都抛出“运行时错误'3167':记录被删除。”任何想法有什么不对? – Antrim

相关问题