Можете ли вы использовать ADO для редактирования схемы таблицы в MS Access? - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь выяснить, возможно ли редактировать длину текстового поля в каждой таблице в базе данных.По сути, номера счетов в настоящее время представляют собой текстовое поле длиной 7. Нам нужно их сократить до 9. Я знаю, что могу просмотреть каждую таблицу, где находится ACCT_NUM, и изменить ее (их около 100), но я пытаюсьнапишите некоторый код для его обработки, просматривая все таблицы.До сих пор я дошел до этого:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = CurrentProject.Connection
Set rs = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, "ACCOUNT"))

While Not rs.EOF
    If rs![Column_Name] = "ACCT_NUM" Then
        If rs![CHARACTER_MAXIMUM_LENGTH] = 7 Then
            'the following line generates the this error: Current Recordset does not support updating. This may be alimitation of the provider, or of the selected locktype.
            rs![CHARACTER_MAXIMUM_LENGTH] = 9 
        End If
        rs.Update
    End If
    rs.MoveNext
Wend

Я знаю, что при редактировании записей с использованием DAO я использовал бы что-то вроде "recordset.Edit", но, похоже, ADO-эквивалент не существует..

Кто-нибудь знает, как я могу это сделать?Я не женат на идее использования ADO, поэтому, если есть какой-то другой способ сделать это, я с радостью перекодирую!


РЕДАКТИРОВАТЬ


С @HansUpПомогите, вот решение.Я уберу это немного, но вот, пожалуйста:

Public Sub sp_change()
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim fld As DAO.Field
    Dim s As String, buf As String
    Dim i As Integer

    Set db = CurrentDb()
    i = 0

    For Each tbl In db.TableDefs
        If ((tbl.Attributes And dbSystemObject) = 0) And ((tbl.Attributes And dbAttachedODBC) = 0) And ((tbl.Attributes And dbAttachedTable) = 0) And ((tbl.Attributes And dbAttachExclusive) = 0) Then
            Debug.Print "Processing table: " & tbl.Name
            For Each fld In tbl.Fields
                If fld.Name = "ACCT_NUM" And fld.Size = 7 Then
                    CurrentProject.Connection.Execute "ALTER TABLE " & tbl.Name & " ALTER COLUMN ACCT_NUM TEXT(9);"
                    i = i + 1
                    Exit For
                End If
            Next
        End If
    Next

    Debug.Print "Edited " & i & " instances."
End Sub

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Вы можете сделать это с помощью ADO, отправив команды DDL в базу данных:

 ALTER TABLE table_name ALTER COLUMN ACCT_NUM TEXT(9)

Вы можете получить имена таблиц, выполнив цикл по схеме.

В качестве альтернативы, чтобы фактически изменитьДля определения базы данных в процедурном коде необходимо использовать другую библиотеку ADOX.Мне никогда не удавалось найти хорошую документацию или хорошее руководство по использованию этой библиотеки от Delphi, где я выполняю большую часть своей работы с ADO.

1 голос
/ 03 ноября 2011

Вы не сказали, что DAO запрещен. Я бы использовал его для поиска ACCT_NUM среди полей в каждом TableDef, а затем использовал ADO для DDL-предложения, предложенного Ларри.

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim strDdl As String
strDdl = "ALTER TABLE table_name ALTER COLUMN ACCT_NUM TEXT(9)"

Set db = CurrentDb
For Each tdf In db.TableDefs
    For Each fld In tdf.Fields
        If fld.name = "ACCT_NUM" And fld.Size = 7 Then
            CurrentProject.Connection.Execute Replace(strDdl, "table_name", tdf.name)
            Exit For
        End If
    Next fld
Next tdf
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing

Если ваша версия Access более ранняя, чем 2000, функция Replace () будет недоступна, поэтому вам придется использовать другой метод для создания инструкции DDL.

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