Доступ: Как найти поле во всей базе данных? - PullRequest
2 голосов
/ 22 декабря 2008

У меня есть база данных доступа со многими таблицами. Я ищу поле, которое может существовать или не существовать в одной или нескольких таблицах. Как мне проверить, существует он или нет? (без запроса каждой таблицы, конечно)

Ответы [ 7 ]

3 голосов
/ 23 декабря 2008

Если вы действительно не хотите открывать какие-либо таблицы, решение состоит в том, чтобы использовать коллекцию 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 в качестве аргумента, ограничивающего поиск таблицей / диапазоном таблиц.

2 голосов
/ 22 декабря 2008

Вот что я бы сделал, если бы хотел увидеть, находится ли конкретный столбец (указанный в 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)) 

Соединяя эти две части вместе, я оставлю в качестве упражнения для студента:)

2 голосов
/ 22 декабря 2008

Есть схема для полей:

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: Как обойти / подавить ошибку?

0 голосов
/ 27 сентября 2012

Вот, пожалуйста:

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
0 голосов
/ 22 декабря 2008

Вот как вы получаете доступ к схеме таблицы в MS Access с помощью VBScript:

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 голосов
/ 22 декабря 2008

Какой тип базы данных это? Если это SQL Server, вы можете попробовать это:

SELECT * FROM sysobjects WHERE xtype = 'U' AND name = 'myTable'

Но поскольку вы ищете столбец, а не таблицу (спасибо Брайану), попробуйте следующее:

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'
0 голосов
/ 22 декабря 2008

MSSQL Ищем колонку ADDRESS1: выберите so.name из sysobjects так где в.

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

Google найдет синтаксис для других БД ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...