应用技巧:在数据库中搜索文本
2008-12-31 00:00:00 来源:WEB开发网对于数据库而言,没有可用的搜索工具。事实上,它还没有提供。那么当在数据库中定位字符串时会怎样呢?如果你打开这个数据库,展示在你面前的就是一个应用程序或可能是众多的表和很少的基本工具来搜索这些表或是一个很麻烦的查询界面。这意味着你需要非常了解这个数据库,从而猜到这个字符串在哪或它是否存在。这篇文章告诉你在一个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 |
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 |
一个链接到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 ..."
更多精彩
赞助商链接