程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> 應用技巧:在數據庫中搜索文本

應用技巧:在數據庫中搜索文本

編輯:關於Access數據庫
對於數據庫而言,沒有可用的搜索工具。事實上,它還沒有提供。那麼當在數據庫中定位字符串時會怎樣呢?如果你打開這個數據庫,展示在你面前的就是一個應用程序或可能是眾多的表和很少的基本工具來搜索這些表或是一個很麻煩的查詢界面。這意味著你需要非常了解這個數據庫,從而猜到這個字符串在哪或它是否存在。這篇文章告訴你在一個Access數據庫中你可以怎樣搜索所有的表,然後返回哪些表包含所搜索的字符串。使用強大的Microsoft Access鏈接技術可以將相同的技術應用於其它的數據庫格式。

  找到一個文本字符串

  驅使數據庫搜索的Access表單(見圖1)可以引入到你的數據庫中。這個搜索工具會搜索數據庫中的每一個表或鏈接表。這個軟件具有以下特點:

  建有一個前端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 fIElds

  booRstSch = 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

  接下來,也是對於Access數據庫很重要的一個步驟,就是管理可以用來命名字段的眾多名稱。遵循明確命名規范的表和字段名稱使得事情容易得多。大多數情況下,你會看到的是具有空格的擴展描述,比如“Emergency Contact First Name”或% 、#,或者甚至是句號“.”。 Access在內部管理這些,它允許你使用方括號將字段或表名稱括起來[]。下面的代碼顯示了怎樣處理這些。

      ' Jet fIEldnames can include unusual letters

  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 matches

  If 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 ..."

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved