应用技巧:在数据库中搜索文本


对于数据库而言,没有可用的搜索工具。事实上,它还没有提供。那么当在数据库中定位字符串时会怎样呢?如果你打开这个数据库,展示在你面前的就是一个应用程序或可能是众多的表和很少的基本工具来搜索这些表或是一个很麻烦的查询界面。这意味着你需要非常了解这个数据库,从而猜到这个字符串在哪或它是否存在。这篇文章告诉你在一个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 'access@gr-fx.com') or

  (Subject like 'access@gr-fx.com') or

  ([From] like 'access@gr-fx.com') or

  ([Sender Name] like 'access@gr-fx.com') or

  (CC like 'access@gr-fx.com') or

  (To like 'access@gr-fx.com') or

  ([Subject Prefix] like 'access@gr-fx.com') or

  ([Normalized Subject] like 'access@gr-fx.com')

  系统扩展

  介绍的这个软件只找出某个文本字符串是否存在于一个表中然后报告结果。它还对没有找到任何文本字符串的表进行重复过滤,并保存结果到一个单独的日志文件中。你可以改进它,比如:

  对每个表中的每个字段执行一个查询,并报告匹配搜索内容的字段。

  创建软件时使用下面的代码,使得实际输出具有一个匹配,使得查看数据更简单:

  Currentdb.QueryDefs(item).SQL = "select .... from ... where ..."


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3