找到一個文本字符串
建有一個前端Access數據庫並鏈接到所有你希望某個特定用戶或用戶組搜索的後台表。Access允許你鏈接到Access數據庫、文本文件和電子數據表,並通過從ODBC到特定驅動到更通用的後台數據庫,例如SQL Server或MySQL或Oracle。
然後系統表會被分析,以便我們可以在這個數據庫中創建所有的表。
所有這些表都被搜索以查找這些表裡包含文本數據的所有字段。在這個過程中,所有數字的、日期的和blob類型數據字段都會被忽略。然後會生成一個SQL語句來查找每個表中的所有文本字段。
然後我們使用記錄集對每個表運行這個查詢,然後找到和報告任何成功的(第一個)匹配,以便用戶知道哪些表含有所查找的字符串。
圖1 – 搜索後台數據庫中字符串位置的工具
代碼
這個搜索工具的所有來源都在這個搜索按鈕之下。這個軟件采用的第一個技術是循環Table集合中所有的表(略過Jet系統表和臨時表)。
' Establish the phrases to be used for searching from' the fIElds on the form. The database file is selected
' using standard VB file controls
Set myDb = CurrentDb ' wrkJet.OpenDatabase(selectedFile, , True)
' Loop through all tables extracting the names
For i = 0 To myDb.TableDefs.Count - 1
Set MyTable = myDb.TableDefs(i)
tableName = MyTable.Name
If Left(tableName, 4) <> "MSys" And Left(tableName, 4) <> "usys" _
And Left(tableName, 1) <> "~" Then
現在這個軟件打開一個記錄集並循環每個表中的所有字段來確認哪些字段是文本字段。在這個過程中,我們在搜索每個表時要使用的過濾是重置。
' Now find the text fIEldsbooRstSch = True
numFields = MyTable.FIElds.Count
Set rstSearchTable = myDb.OpenRecordset( _
tableName, dbOpenSnapshot)
wherestr = ""
For j = 0 To numFIElds - 1
Set myField = MyTable.FIElds(j)
fldStr = myFIEld.Name
fldType = myFIEld.Type
If fldType = dbText Then
blankpos = InStr(1, fldStr, " ") + _
InStr(1, fldStr, "#") + _
InStr(1, fldStr, "-") + _
InStr(1, fldStr, "/")
If blankpos > 1 Then
' Make sure blank spaces and other odd
' fIEldname characters are handled correctly
fldStr = "[" & fldStr & "]"
End If
現在我們將根據主屏幕上搜索所用的內容來組裝這個SQL過濾字符串。對於這個系統,這些搜索利用Jet引擎LIKE語句,這和一個SQL後台數據庫中的MATCHES是一樣的。在Jet中的通配符是一個*,而在ANSI SQL中它可以是一個百分號%也可以是一個下劃線。Jet引擎用哪種方法排序都和你使用什麼後台數據庫無關。SearchString是表格上你輸入搜索字符串的字段。在這個字段中使用通配符來搜索這個字段中的任何位置,而不是調用一個准確的匹配。注意,這個軟件允許你輸入兩個搜索字符串,而且它還可以擴展到更多。If Len(wherestr) > 1 Then
wherestr = wherestr & " or "
End If
wherestr = wherestr & "(" & fldStr _
& " like '" & searchString(1) & "'"
If Len(searchString(2)) > 1 Then
wherestr = wherestr & OrStr & fldStr _
& " like '" & searchString(2) & "')"
Else
wherestr = wherestr & ")"
End If
End If
Next j
既然我們已經為這個表建立了一個合適的過濾,我們可以從我們之前建立的記錄集開始,並使用Recordset FindFirst方法和這個過濾來搜索任何成功的匹配。在這個過程中,這個軟件會編寫全部的SQL到一個叫做sqlFilter的文本框,並將搜索標識為成功或失敗。它不會在匹配了這個過濾之後繼續搜索整個表,因為這個軟件的目的是告訴你這個表中是否包含這個字符串。
' Now search for a string that matchesIf Len(wherestr) > 1 Then
With rstSearchTable
.FindFirst wherestr
If .NoMatch Then
sqlFilterNot = sqlFilterNot & UCase(tableName) _
& " : Not Found" & vbCrLf & _
"Select * from " & tableName _
& " where " & wherestr & ";" _
& vbCrLf & vbCrLf
GoTo nextTable
End If
sqlFilter = sqlFilter & UCase(tableName) _
& " : FOUND" & vbCrLf & "Select * from " _
& tableName & " where " & wherestr & ";" _
& vbCrLf & vbCrLf
End With
End If
然後這個軟件會記錄搜索這個數據庫中的所有表,建立一個這些搜索的完整列表,無論是成功還是失敗。為使得這個文本輸出更加可讀,發送到sqlFilter文本框的文本字符串會使用輸出回車或換行的vbCrLF常量來填充。這是代碼所做的所有事情,其余的取決於你使用這個軟件來完成你所需要的。一個鏈接到Outlook收件箱的表的示例Where從句
where (Icon like '[email protected]') or(Subject like '[email protected]') or
([From] like '[email protected]') or
([Sender Name] like '[email protected]') or
(CC like '[email protected]') or
(To like '[email protected]') or
([Subject Prefix] like '[email protected]') or
([Normalized Subject] like '[email protected]')
系統擴展介紹的這個軟件只找出某個文本字符串是否存在於一個表中然後報告結果。它還對沒有找到任何文本字符串的表進行重復過濾,並保存結果到一個單獨的日志文件中。你可以改進它,比如:
對每個表中的每個字段執行一個查詢,並報告匹配搜索內容的字段。
創建軟件時使用下面的代碼,使得實際輸出具有一個匹配,使得查看數據更簡單:
Currentdb.QueryDefs(item).SQL = "select .... from ... where ..."