2012-05-02 20 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

相關問題