Database Access:如何在整个数据库中查找字段?

Database Access:如何在整个数据库中查找字段?,database,ms-access,Database,Ms Access,我有一个包含许多表的access数据库。我正在寻找一个字段,该字段可能存在于一个或多个表中,也可能不存在。如何检查它是否存在?无需查询课程的每个表MSSQL 正在查找ADDRESS1列: 从sysobjects so中选择so.name 其中so.id在syscolumns sc中选择sc.id,其中名称如“ADDRESS1” 神谕 谷歌会找到其他数据库的语法…它是什么类型的数据库?如果是SQL Server,您可以尝试以下方法: 从sysobjects中选择*,其中xtype='U'和nam

我有一个包含许多表的access数据库。我正在寻找一个字段,该字段可能存在于一个或多个表中,也可能不存在。如何检查它是否存在?无需查询课程的每个表

MSSQL 正在查找ADDRESS1列: 从sysobjects so中选择so.name 其中so.id在syscolumns sc中选择sc.id,其中名称如“ADDRESS1”

神谕


谷歌会找到其他数据库的语法…

它是什么类型的数据库?如果是SQL Server,您可以尝试以下方法:

从sysobjects中选择*,其中xtype='U'和name='myTable' 但由于这是您要查找的专栏,而不是表格,谢谢Brian,请尝试以下方法:

选择 不同的 所以。[名称]作为“表”, sc.[名称]作为“列” 从…起 系统列sc 参加 系统对象如此 在…上 so.id=sc.id 哪里 sc.[name]=“myTable”
以下是如何使用VBScript在MS access中访问表架构:

TestData=PROVIDER=Microsoft.Jet.OLEDB.4.0;数据源=c:\somefolder\YOURDB.mdb 设置Conn=Server.CreateObjectADODB.Connection 康涅狄格州开放测试数据 设置rs=Conn.OpenSchema4 直到R.eof为止 tn=RSTABLE_名称 fn=RSCOLUMN\u NAME “你的剧本在这里 环
字段有一个架构:

Set cn = CurrentProject.Connection

SelectFieldName = "SomeFieldName" 

'Get names of all tables that have a column = SelectFieldName '
Set rs = cn.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, Empty, SelectFieldName))

From:

如果我想查看strearch中标识的特定列是否在特定表中,我会这样做

公共子搜索 dimdb作为数据库 作为字符串的Dim stresearch 作为字符串的Dim strSQL 将结果设置为记录集 作为整数的Dim i Dim cols作为整数 strSearch=a3 Set db=CurrentDb strSQL=从条形图中选择* Set rsResults=db.OpenRecordsetstrSQL、dbOpenDynaset、dbReadOnly 如果不是rsResults.BOF,则 rsResults.MoveFirst 如果结束 cols=rsResults.Fields.Count-1'-1,因为我们从0开始计算COL 对于i=0到cols 如果rsResultsi.Name=strSearch,则 MsgBox找到了搜索字符串 如果结束 下一个 MsgBox脚本结尾 端接头 现在我知道你不想为每个表写一个。因此,下一步要做的是遍历所有表。您可以找到包含以下SQL语句的所有表的列表

选择 名称 从…起 MSysObjects 哪里 左[姓名],1~ 左[姓名],4毫秒 和[Type]输入1,4,6 将这两部分连接在一起,我将留给学生作为练习:

如果您确实不想打开任何表,解决方案是使用数据库对象的tabledefs集合。每个tabledef项都有自己的字段集合,您可以浏览。它会给出这样的结果:

公共函数findFieldDatabasep\u myFieldName dimdb作为数据库_ tb作为tabledef_ fdas场 set db=currentDb 对于db.tabledefs中的每个tb 对于tb字段中的每个fd 如果fd.name=p_myFieldName,则 debug.print tb.name,fd.name 如果结束 下一个fd 下一个结核病 设置fd=无 设置tb=无 set db=nothing 端函数 这段代码可以很容易地修改为接受可选的p_myTableName作为参数,以将搜索限制在表/表范围内。

这里:

公共函数fTableExistsByVal vstrTable作为字符串作为布尔值 将rs设置为ADODB.Recordset 设置rs=CurrentProject.Connection.OpenSchema_ adschematables,ArrayEmpty,空,vstrTable fTableExists=非rs.EOF rs.Close 设置rs=无 端函数 公共函数fcolumnexistbyval vstrTable作为字符串_ ByVal VSTR列作为字符串作为布尔值 将rs设置为ADODB.Recordset 设置rs=CurrentProject.Connection.OpenSchemaAddSchemaColumns_ ArrayEmpty,空,vstrTable,vstrColumn fColumnExists=不是rs.EOF rs.Close 设置rs=无 端函数
他在找一列而不是一张桌子。但请关闭。数据库为ms access。在原来的帖子里是这样写的。不,在修改过的帖子里是这样写的。最初的帖子没有这样说。使用ADO模式有一种更简单的方法,但是如果代码在Access中运行,需要额外的库引用,我想除非使用后期绑定。最初的提问者没有明确说明代码运行的上下文。对我来说,如果您使用Access本身,DAO显然是Jet数据的首选。my',u'技巧只是变量声明的格式规则。使事情更具可读性。在枚举函数的参数时,也可以使用相同的技巧。另一个“学校”是www.stackoverflow.com/questions/166657/do-you-have-your-own-dnutndt-do-not-use-thisnever-do-that-list166717是的,我经常使用参数超过80个字符的函数。我仍然倾向于在每一行上做一个单独的dim。我只是希望它有一些明显的优势,比如执行速度,但每个人都有自己的优势。对我来说,DAO显然是Jet数据的首选。但在t
他的特殊情况当然是ADO解决方案更可取,因为OpenSchema返回的记录集只包含匹配项。DAO需要大量的循环,以便自己找到匹配项。额外的参考并不昂贵!数据库是ms access。Philippe,你为什么这么做,用你的dim's玩把戏?与多个dim相比有什么巨大的优势吗?BIBD,它只是一种垂直堆叠声明的干净方法,而不必重复dim关键字。也许简单解释一下如何使用这些函数会有所帮助。特别是,这些函数似乎假设了一个开放的数据库连接。