SQL запросы в VBA: DAO, ADO, ODBC - что использовать?

Программирование на Visual Basic for Applications
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

SQL запросы в VBA: DAO, ADO, ODBC - что использовать?

Сообщение Wasup! » 21.06.2005 (Вт) 11:27

Как использовать возможности sql из vba приложений?
Подключаться к БД делать в нее selectы, insertы, updatы?
Чем различаются механизмы DAO, ADO, ODBC, и что лучше использовать если база данных: ms access, ms foxpro, oracle, ms sql?
[/syntax]

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 21.06.2005 (Вт) 11:34

с какой базой тебе работать?

Ващето лучше с ADO
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 21.06.2005 (Вт) 12:00

скорее всего со всеми вышеперечисленными, кроме ms sql.
а почему ADO? какие различия между ADO, DAO, ODBC?

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 22.06.2005 (Ср) 8:34

d1=55"
Последний раз редактировалось Al Khamid 07.12.2007 (Пт) 19:32, всего редактировалось 1 раз.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 23.06.2005 (Чт) 15:07

а какие конкретно преимущества мне даст АДО по сравнению с ДАО при подключении к разным БД?
как я понял: при работе не с access, а например с foxpro или oracle оба будут использовать odbc драйвера, тогда в чем разница?

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 23.06.2005 (Чт) 19:51

Я согласен с Al Khamid:
---------------------------------------------------
"Не думаю, что стоит городить огород с АДО, когда ДАО вполне достаточно, а опыта нет. Будет задача посерьезнее, появится смысл посерьезнее заморачиваться."
---------------------------------------------------
ADO считается более современным подходом, но все зависит от поставленной задачи! А позже, когда появится опыт- возможно появится что-то еще, но более современное и интереснее ADO...
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 24.06.2005 (Пт) 10:46

[]
Последний раз редактировалось Al Khamid 07.12.2007 (Пт) 19:16, всего редактировалось 1 раз.

flying
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 17.06.2005 (Пт) 8:41

Сообщение flying » 24.06.2005 (Пт) 12:32

А насчет ODBC - с таблицами Access, FoxPro и рядом других можно работать и без него (способ я уже описал).

Конечно, зачем использовать ODBС, если можно использовать ADO.

Так что не суетись, освой для начала работу с Аксесс через ДАО, а там видно будет, что именно и зачем тебе нужно.


А почему так необходимо изучать DAO?

Давайте разберёмся в преимуществах.
Исторически первичны DAO (Data Access Objects) и RDO (Remote Data Objects). При этом, первая предназначается для доступа к локальным БД (на одном компе), вторая для удалённых (ну ясно, на разных компах, в сети). ADO (ActiveX Data Objects) появляется позже и обладает свойствами той и другой. Возможно часть локальных свойств ADO и не поддерживает, но SQL поддерживает.
Изучайте ADO и DAO параллельно. Но если спешите, и надо связывать удалённые БД, то лучше ADO.
Microsoft уже несколько лет, как поменяла идеологию с ODBC на OLE DB. История длинная. Рассказывать? :)
Короче OLE DB дает возможность работать не только с реляционными БД, но с любым хранилищем данных (от текстов, фото до знаний). Кому щас реляционные нужны? Так, только поучиться.
Чтобы быть в ногу со временем займитесь ADO, OLE DB и т.п.
Так вот ADO в некотором смысле является конвертером объектов OLE DB. Но дело-то ещё в том, что Microsoft отказались от технологии ODBC вообще. :)
Для локальных небольших БД DAO считается более подходящим.
Но DAO уходит в прошлое.
Подключение ADO аналогично DAO, использование SQL-предложений тоже аналогично.
Правда есть проблемы с транзакциями. Но вполне разрешимые.
Для начала изучите объекты ADO: Connection, Command, Recordset, Record, Streem.
Подключение:
Код: Выделить всё
‘Описание объекта Connection:
Dim Conn As New ADODB.Connection
‘Объявление нового соединения:
Set Conn=New ADODB.Connection
‘Eсли соединение с активной базой данных, то:
Set Conn=CurrentProject.Connection
‘Eсли соединение с внешней базой данных, то указывается путь и провайдер:
Сonn.Open "Provider=Microsoft jet 4.0 OLE DB Provider; Data Source=" + Путь

Это проще, чем DAO.
Дальше лучше на конкретном примере.
Я подберу что-нибудь из того, что у меня есть. Пожалуй, только завтра файл присоединю. :)

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 27.06.2005 (Пн) 8:19

$$
Последний раз редактировалось Al Khamid 07.12.2007 (Пт) 19:14, всего редактировалось 1 раз.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 27.06.2005 (Пн) 13:49

почитал доки, вроде немного разобрался в recordset`ах, connection`ах.. склоняюсь к использованию адо, если я правильно понял там используя разные connetion string можно используя одни и те же способы можно работать с любым типом БД
например 'АДО через OLE DB connection
Код: Выделить всё
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=physical path to .mdb file

или АДО через ODBC
Код: Выделить всё
Driver= {Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDb=physical path to .dbc file

всё правильно делаю :?:

как вызвать диалог на ввод пароля при подключении к защищенной базе? не записывать же пароль в коде? :wink:
Код: Выделить всё
"Provider=msdaora;Data Source=MyOracleDB;User Id=UserName;Password=asdasd;"

flying
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 17.06.2005 (Пт) 8:41

Сообщение flying » 01.07.2005 (Пт) 14:30

Wasup! писал(а):всё правильно делаю :?:


Вот тоска, кириллица не работает.
Дела отвлекли.
Ну-у-у! .doc – файлы не подключает!
Ладно см. ниже, там немного.

Примечания:

1. В приводимом примере для знакомства с технологией ADO в VBA все имена-идентификаторы являются конкретными, то есть, именно на эти имена делаются ссылки в программных кодах. (Имена баз данных, таблиц, полей).
2. В данном программном коде (см. ниже) выполнено подключение базы данных MS Access через драйвер Microsoft jet 4.0 OLE DB Provider. Если требуется подключать базы данных dBase, Paradox или FoxPro, то следует указать драйвер Microsoft OLE DB Provider for ODBC, для баз данных Oracle Microsoft OLE DB Provider Oracle.
3. Вообще посмотреть провайдеры для подключения можно в Delphi, начиная с версии 5 и выше, следующим образом:
Палитра компонентов ADO  компонент ADO Table (перенести на форму)  В Инспектор Объекта выбрать свойство ConnectionString и щелкнуть справа  щёлкнуть на кнопке с многоточием  появится окно диалога мастера связи  щелчок в окне на кнопке Вuild…  Provider имеется список всех провайдеров, используемых в твоей системе.
(Беда, я больше в Delphi работаю :) )

Для начала создайте две независимые базы данных.

Первая база данных.

Имя: baza_1
Имя таблицы: Маршрут_1
Структура таблицы и несколько записей:
Маршрут_1
K № Маршрут Продолжительность Стоимость
1 № C - 115 Сочи 10 дней $350,00
2 № A - 110 Ялта 7 дней $250,00
3 № F - 100 Анталия 7 дней $400,00
4 № F - 105 Ницца 7 дней $530,00

Для данных поля "№" можно ввести Маску ввода типа: " № "L" - "000
Для данных поля "Продолжительность", Формат поля: #" дней"
Для данных поля "Стоимость", Формат поля ввести: $# ##0,00
Вторая база данных.

Имя: proba_1
Без таблицы! Для проверки связи с независимой БД!
Теперь решим задачу.
Требуется:
в таблице Маршрут_1 базы данных baza_1 заменить Маршрут Сочи на Коста Брава, Продолжительность на 7 дней, Стоимость на $1300 ;

Сначала сделаем это средствами VBA, не используя SQL-инструкции.
Итак, открывайте MS Access.
Создавайте следующий модуль:
Код: Выделить всё
Private Sub Начало()
   ' Объявление переменных связи
  Dim Conn As New ADODB.Connection
  Dim Rs As New ADODB.Recordset

  Dim Stext As String
   '  Stext – для вывода в MsgBox, главным образом при отладке, потом можно убрать!
   
'  Организация связи с ADO
Set Conn = New ADODB.Connection
Set Rs = New ADODB.Recordset
   ' Подключение драйвера и независимой базы данных с указанием пути к ней
Conn.Open "Provider=Microsoft jet 4.0 OLE DB Provider;" & "Data Source=C:\Мои документы\flying\baza_1.mdb;"
   ' Data Source – здесь следует указать путь к ВАШЕЙ Базе Данных
   ' Открываем нужную таблицу, то есть, указываем её имя
Rs.Open "Маршрут_1", Conn, adOpenKeyset, adLockOptimistic
   ' Программный модуль решения поставленной задачи
   ' Переход на первую запись в таблице, это для упрощения задачи, можно,
' конечно, организовать поиск, но это совсем другая задача :)
Rs.MoveFirst
' Считывание значения третьего поля таблицы в первой записи, у нас это поле
' имеет имя Маршрут, для разнообразия здесь привожу, как работать с именем
' поля, как работать с его псевдонимом
Stext = Rs.Fields(2)
MsgBox Stext
   ' Изменяем значение поля
Rs![Маршрут] = "Коста Брава"
Stext = Rs.Fields(2)
Rs![Продолжительность] = 7
Rs![Стоимость] = 1300
MsgBox Stext
   ' Обновляем данные:
Rs.Update
  Set Conn = Nothing
End Sub

С паролем не знаю, как? Может вопрос уточнишь?
I’d like to speak Russian in my IE


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

    TopList