对于数据库而言,没有可用的搜索工具。事实上,它还没有提供。那么当在数据库中定位字符串时会怎样呢?如果你打开这个数据库,展示在你面前的就是一个应用程序或可能是众多的表和很少的基本工具来搜索这些表或是一个很麻烦的查询界面。这意味着你需要非常了解这个数据库,从而猜到这个字符串在哪或它是否存在。这篇文章告诉你在一个Access数据库中你可以怎样搜索所有的表,然后返回哪些表包含所搜索的字符串。使用强大的Microsoft Access链接技术可以将相同的技术应用于其它的数据库格式。 找到一个文本字符串 驱使数据库搜索的Access表单可以引入到你的数据库中。这个搜索工具会搜索数据库中的每一个表或链接表。这个软件具有以下特点: 建有一个前端Access数据库并链接到所有你希望某个特定用户或用户组搜索的后台表。Access允许你链接到Access数据库、文本文件和电子数据表,并通过从ODBC到特定驱动到更通用的后台数据库,例如SQL Server或MySQL或Oracle。 然后系统表会被分析,以便我们可以在这个数据库中创建所有的表。 所有这些表都被搜索以查找这些表里包含文本数据的所有字段。在这个过程中,所有数字的、日期的和blob类型数据字段都会被忽略。然后会生成一个SQL语句来查找每个表中的所有文本字段。 然后我们使用记录集对每个表运行这个查询,然后找到和报告任何成功的(第一个)匹配,以便用户知道哪些表含有所查找的字符串。 代码 这个搜索工具的所有来源都在这个搜索按钮之下。这个软件采用的第一个技术是循环Table集合中所有的表(略过Jet系统表和临时表)。 ’ Establish the phrases to be used for searching from ’ the fields on the form. The database file is 0selected ’ using standard VB file controls Set myDb = CurrentDb ’ wrkJet.OpenDatabase(0selectedFile, , 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是表格上你输入搜索字符串的字段。在这个字段中使用通配符来搜索这个字段中的任何位置,而不是调用一个准确的匹配。注意,这个软件允许你输入两个搜索字符串,而且它还可以扩展到更多。