Тема: какдобавить поле в таблицу через ADO

Здравcтвуйте.
Подскажите пожалуйста. Как через ADO добавить поле в существующую таблицу.
Вот мой код, который не работает.

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set con = New ADODB.Connection
With con
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .Open "\\server\manager\table.mdb"
End With
Set rs = New ADODB.Recordset
rs.Open source:="select p1, p2 from mytable", ActiveConnection:=con, CursorType:=adOpenForwardOnly, LockType:=adLockOptimistic, Options:=adCmdText
rs.Fields.Append "p3", adChar

Что здесь неправильно. В закрытый или открытй рекордсет добавляют поля? Если он закрытый, то как указать в какую именно таблицу добавляется поле?

Re: какдобавить поле в таблицу через ADO

Попробуй нечто типа

con.Execute "alter table mytable add column p3, char, not null;"

Пишу без проверок, так что посмотри справку по Access.

Re: какдобавить поле в таблицу через ADO

> Airiz
Юзай лучше через ADOX, только не забудь
подключить библиотеку:
'Microsoft ADO Ext. 2.8 for DDL and Security

Sub AppendColumn()
    On Error GoTo AppendColumn_Error
    Dim tbl As ADOX.Table
    Dim cat As New ADOX.Catalog
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='\\server\manager\table.mdb';"
    Set tbl = cat.Tables("mytable")
    tbl.Columns.Append "p3", adWChar, 20
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set tbl = Nothing
    Exit Sub
AppendColumn_Error:
    Set cat = Nothing
    Set tbl = Nothing
    If Err <> 0 Then
        MsgBox Err.Source & ":" & vbCr & Err.Description, , "Error"
    End If
End Sub

~'J'~

Re: какдобавить поле в таблицу через ADO

> Fatty
ADOX блокирует БД и переводит ее в монопольный режим использования. Не всегда приемлемо (ЯТД).

Re: какдобавить поле в таблицу через ADO

> Кулик Алексей aka kpblc
а как задать подпись поля? насколько я знаю в этой команде нет такого атрибута.

Re: какдобавить поле в таблицу через ADO

Подпись полю задается только через ADOX, другого варианта (именно для такого дела) нет. Вопрос - а кто мешает в запросе использовать конструкцию типа

select [pt3] as [Результат поля pt3] from mytable;

Re: какдобавить поле в таблицу через ADO

> Кулик Алексей aka kpblc
Я не знаю из каких источников ты это берешь, это полный бред, извини
Код только добавляет столбец и потом обнуляет ссылки на использованные
объекты, посему никаких проблем не будет
Для справки
Метод ADO позволяет работать ТОЛЬКО с существующими объектами
независимо будь это таблица или запрос, тогда как ADOX (который по сути
просто является расширением ADO) позволяет работать со вновь
создаваемыми
Причем это касается всех объектов: Command, Connection или RecordSet
Учи матчасть :)
Полезная статья насчет ADOX:
http://www.codeguru.com/Cpp/data/mfc_da … .php/c4343
Хороший краткий учебник:
"Автоматизация Microsoft Access с помощью VBA"
Mike Gunderloy, Susan Sales Harkins
изд-во "Williams" Санкт-Петербург, 2006
Толковый блог одного из соавторов книги:
http://blogs.techrepublic.com.com/msoffice/
~'J'~

Re: какдобавить поле в таблицу через ADO

Fatty пишет:

Я не знаю из каких источников ты это берешь, это полный бред, извини

Из эксперимента (проводил на VB6, примерно с год назад): 2 проекта, один подключен был через ADOX, второй пытался подключиться через ADO (или ADOX). Скорее всего, я чего-то там перемудрил, но базу полностью захватил первый и не отпускал ни в какую.
По информации и общим впечатлениям обсуждения с vbstreets.ru - ADOX необходим фактически только в момент создания файла базы (того же Access, например) и некоторых специфических задач (типа ужать базу). После этого ADOX становится ненужным. Я, например, работаю с access'ной базой из-под лиспа через ado. Ничего так, пашет.

Метод ADO позволяет работать ТОЛЬКО с существующими объектами независимо будь это таблица или запрос

Ну извини, но тут не соглашусь. Подключись через ADO к любой существующей базе и выполни запрос вида

create table my_new_table (id autoincrement, name char(50));

Таблица будет создана (код пишу "всухую", поэтому запрос проверить не помешает). Добавив constraint, можно и ключи, и индексы задавать.
За ссылки thnx, сейчас гляну.

Re: какдобавить поле в таблицу через ADO

Во, специально провернул запросы

create table my_new_table (ID autoincrement not null unique constraint id primary key, name char(50) not null unique);
alter table my_new_table add column Name2 char(25) unique not null;

через ADO (соединение с Aсcess). Все нормально создалось и имеет "предсказуемый" формат данных.

Re: какдобавить поле в таблицу через ADO

> Airiz
Вот пример как получить подпись поля
(готовый пример) посмотри на его основе
как его можно задать

' требуется ссылка на Microsoft DAO 3.6 Object Library
Private Function GetCaption(ByVal tblName As String, intNum As Integer) As String
On Error GoTo Err_Report
Dim tbls As TableDefs
Set tbls = CurrentDb.TableDefs
Dim tbl As TableDef
Set tbl = tbls(tblName)
If Not tbl Is Nothing Then
On Error Resume Next
GetCaption = tbl.Fields(intNum).Properties("Caption")
If Err Then
Err.Clear
GetCaption = tbl.Fields(intNum).Name
End If
On Error GoTo 0
Else
GetCaption = vbNullString
End If
Set tbl = Nothing
Set tbls = Nothing
Err_Report:
End Function
' Пример
Sub Test()
Dim i As Integer
i = 1
Dim tb As String
tb = "[Марки топлива]"
MsgBox GetCaption(tb, i)
End Sub

~'J'~

Re: какдобавить поле в таблицу через ADO

Кулик Алексей aka kpblc пишет:

Подпись полю задается только через ADOX, другого варианта (именно для такого дела) нет. Вопрос — а кто мешает в запросе использовать конструкцию типа
select [pt3] as [Результат поля pt3] from mytable;

теоретически ничто не мешает, а практически.. я плохо знаю SQL

Re: какдобавить поле в таблицу через ADO

> Кулик Алексей aka kpblc
Повторю еще раз:
« Метод ADO позволяет работать ТОЛЬКО с существующими объектами независимо будь это таблица или запрос
Это цитата отца-основателя (Mr.Access)
Мне даже интересно как ты обратишься через ADO
к свойствам объекта, который еще не создан :)
~'J'~

Re: какдобавить поле в таблицу через ADO

> Fatty
Шутку понял :)
Если серьезно, у меня не было (пока?) задач, требующих обращения к свойствам таблиц или запросов.

Re: какдобавить поле в таблицу через ADO

> Fatty
я еще делала таким способом:

' Set fld = tdfNew.Fields("MEMBER")
' Set prop = fld.CreateProperty("Caption", dbText, "Memb")
' fld.Properties.Append prop
' prop = Nothing

Это насколько я поняла тоже через DAO. Потом на этой же ветке форума было сказано, что предпочтительнее использовать ADO, после чего и началось все это..

Re: какдобавить поле в таблицу через ADO

> Airiz
Я тут вот что нарыл на просторах Google:

Sub SetFieldCaption( _
                    Tablename As String, _
                    Fieldname As String, _
                    Caption As String)
  Dim fd                As DAO.Field
  On Error GoTo ErrorHandler
  Set fd = DBEngine(0)(0)(Tablename)(Fieldname)
  fd.Properties("Caption") = Caption
ExitHere:
  Set fd = Nothing
  Exit Sub
ErrorHandler:
  If Err = 3270 Then
    fd.Properties.Append fd.CreateProperty("Caption", dbText, Caption)
    Resume Next
  Else
    MsgBox "Error: " & Error$ & "(" & Err & ")"
    Resume ExitHere
  End If
End Sub

Но не тестировал, времени нет
Успехов :)
~'J'~