访问数据库:如何在整个数据库中查找字段?

4

我有一个包含多个表格的访问数据库。我正在寻找一个可能存在于一个或多个表格中的字段。如何检查它是否存在?(当然不能逐个查询每个表格)

7个回答

3

字段有一个模式:

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))

来源:MS Access:如何绕过/抑制错误?


3
如果您真的不想打开任何表格,解决方法是使用数据库对象的tabledefs集合。每个tabledef项都有自己的fields集合,您可以浏览它。它会给出类似以下的结果:
Public function findFieldInDatabase(p_myFieldName)
    dim db as database, _
        tb as tabledef, _
        fd as field

    set db = currentDb
    for each tb in db.tabledefs
        for each fd in tb.fields
            if fd.name = p_myFieldName then
                debug.print tb.name, fd.name
            end if
        next fd
    next tb
    set fd = nothing
    set tb = nothing
    set db = nothing
end function 

这段代码可以轻松地进行适应,接受一个可选的p_myTableName参数来限制搜索到表格/一系列表格。


菲利普,你为什么在定义数组时使用”_“符号的技巧?相比使用多个维度,这有什么巨大的优势吗? - BIBD
BIBD,它只是一种干净的方式,可以垂直堆叠声明,而无需重复使用“Dim”关键字。 - pstraton

2

如果我想查看特定表格中的特定列(在strSearch中标识),以下是我会执行的操作:

Public Sub search()

Dim db As Database
Dim strSearch As String
Dim strSQL As String
Dim rsResults As Recordset
Dim i As Integer
Dim cols As Integer

    strSearch = "a3"

    Set db = CurrentDb
    strSQL = "select * from bar"
    Set rsResults = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
    If Not rsResults.BOF Then
        rsResults.MoveFirst
    End If

    cols = rsResults.Fields.Count - 1 ' -1 because we start counting cols at 0
    For i = 0 To cols
        If rsResults(i).Name = strSearch Then
            MsgBox "Found the seach string"
        End If
    Next
    MsgBox "end of script"

End Sub

现在我知道你不想为每个表都写一个。所以下一步要做的是循环遍历所有的表。您可以使用以下SQL找到所有表的列表:

SELECT 
    name
FROM 
    MSysObjects 
WHERE 
    (Left([Name],1)<>"~") 
    AND (Left([Name],4) <> "MSys") 
    AND ([Type] In (1, 4, 6)) 

将这两个部分连接起来,我会留给学生作为练习 :)

有一种更简单的方法,可以使用 ADO 模式。 - Fionnuala
但是,如果代码在Access中运行,则需要额外的库引用(除非您使用后期绑定,我猜)。原问题提问者没有明确说明代码将运行的上下文。对我来说,如果您在Access本身中工作,则DAO是Jet数据的明显首选。 - David-W-Fenton
我的 '_ trick' 只是一种变量声明的格式规则,使得代码更易读。当枚举函数参数时,您也可以使用相同的技巧。另一个相关的资源是 www.stackoverflow.com/questions/166657/do-you-have-your-own-dnutndt-do-not-use-thisnever-do-that-list#166717。 - Philippe Grondier
是的,我经常在函数中使用超过80个字符的参数。我仍然倾向于在每行上进行单独的dim操作。我只是希望有一些明显的优势(比如执行速度),但每个人都有自己的做法。 - BIBD
对我来说,DAO是Jet数据的明显首选。但在这种特殊情况下,ADO解决方案肯定更可取,因为OpenSchema只返回匹配项组成的记录集。而DAO需要大量循环才能自己找到匹配项。额外的引用并不昂贵! - onedaywhen

0

以下是使用VBScript访问MS Access表模式的方法:

TestData = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=c:\somefolder\YOURDB.mdb"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open TestData

Set rs = Conn.OpenSchema(4)

do until Rs.eof
    tn = RS("TABLE_NAME")
    fn = RS("COLUMN_NAME")
    ' your script goes here
loop

0

给你:

Public Function fTableExists(ByVal vstrTable As String) As Boolean
    Dim rs As ADODB.Recordset
    Set rs = CurrentProject.Connection.OpenSchema( _
           adschematables, Array(Empty, Empty, vstrTable))
    fTableExists = Not rs.EOF
    rs.Close
    Set rs = Nothing
End Function

Public Function fColumnExists(ByVal vstrTable As String, _
                              ByVal vstrColumn As String) As Boolean
    Dim rs As ADODB.Recordset
    Set rs = CurrentProject.Connection.OpenSchema(adSchemaColumns, _
      Array(Empty, Empty, vstrTable, vstrColumn))
    fColumnExists = Not rs.EOF
    rs.Close
    Set rs = Nothing
End Function

也许对于如何使用这些函数的简短说明会有所帮助。特别是这些函数似乎假定已经打开了数据库连接。 - nalply

-1

MSSQL 查找 ADDRESS1 列: select so.name from sysobjects so where so.id in (select sc.id from syscolumns sc where name like 'ADDRESS1')

ORACLE http://en.wikipedia.org/wiki/Oracle_metadata

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


数据库是ms-access。原帖中已经这样说了。 - Fionnuala

-1
这是什么类型的数据库?如果是SQL Server,您可以尝试以下方法:
SELECT * FROM sysobjects WHERE xtype = 'U' AND name = 'myTable'

但是既然你要找的是列而不是表格(感谢Brian),请尝试这个:

SELECT 
    DISTINCT
    so.[name] AS 'Table',
    sc.[name] AS 'Column' 
    FROM 
        syscolumns sc
    JOIN
        sysobjects so
        ON
            so.id = sc.id
    WHERE 
        sc.[name] = 'myTable'

他正在寻找一列而不是一张表。接近了。 - Brian Rudolph
数据库是MS-Access。原帖中已经说明了。 - Fionnuala
不是,修改后的帖子中有写明。原始帖子没有提到。 - Paul Mitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接