Підключення таблиць PostgreSQL до бази даних MS Access, MS Office, Програмні керівництва, статті

При створенні багатокористувацького програми важливо зробити процес його поширення по робочих місцях якомога простіше. Важлива частина цієї проблеми – забезпечення програмного підключення таблиць до джерела даних. Якщо дані зберігаються в базі MS Access, то все просто, але при використанні будь-якого SQL-сервера завдання помітно ускладнюється.

Основна проблема полягає в тому, що для приєднання таблиці або подання з сервера потрібно встановити ODBC-драйвер і зареєструвати в системі так зване ім’я джерела даних (Data Source Name, DSN), яке служить для зберігання специфічної інформації про конкретний з’єднанні, яке забезпечується драйвером. Якщо додатком потрібні з’єднання з різними серверами, базами даних або просто відрізняються якими-небудь параметрами, то потрібно створити кілька DSN.

Вручну зробити все це дуже просто. Досить запустити програму установки ODBC драйвера, а потім створити всі потрібні DSN за допомогою Адміністратора джерел даних ODBC, який знаходиться в панелі управління Windows. Проблема в тому, що коли користувачів багато, дана нехитра процедура перетворюється в ціле захід. Як же автоматизувати цей процес? Ну, з установкою драйвера все досить просто: треба скопіювати на комп’ютер користувача необхідні файли і додати ключі до реєстру Windows. Які саме – залежить від самого драйвера. Це, звичайно, може викликати труднощі, однак, в крайньому випадку, встановити драйвер можна вручну один раз, а оновлення версій проводити автоматично, як правило, заміною єдиного файлу динамічної бібліотеки.

Створити DSN ще простіше. У MS Access є спеціальна функція для реєстрації нового джерела даних:

DBEngine.RegisterDatabase <Ім'я джерела даних>, _ <Назва ODBC драйвера>, _ <Виводити чи ні вікно діалогу драйвера ODBC>, _ <Список атрибутів>

Цим можливості Access і обмежуються. Отримати список джерел даних і, тим більше, значення окремих параметрів кожного джерела за допомогою вбудованих засобів MS Access неможливо. Однак не біда, процедуру RegisterDatabase можна запускати при кожному старті програми і, якщо Ви захочете встановити інші значення параметрів з’єднання, вони просто будуть перезаписані поверх старих.

Далі, треба власне підключити зовнішні таблиці та подання до бази даних Вашого застосування. Тут є два шляхи: перший – простий, але менш гнучкий і, можливо, більш інтерактивний. Він припускає використання команди DoCmd.TransferDatabase з типом перетворення acLink. Детальний опис наводиться в довідковій системі MS Access.

Другий шлях складніше, але дозволяє повністю програмно контролювати приєднання таблиці і полягає в створенні нового об’єкта TableDef. Розглянемо цей спосіб детальніше. Перед тим, як підключати таблицю, перевіримо нашу базу даних на предмет існування об’єкта з таким же ім’ям, наприклад, цією функцією:

Function IsTableExist(TableName As String) As Long “Функція повертає наступні коди: “0 – Ні таблиці ні запиту з вказаним ім’ям не існує. “1 – Існує локальна таблиця із зазначеним ім’ям. “2 – Існує приєднана таблиця із зазначеним ім’ям. “3 – Існує запит із зазначеним ім’ям.
On Error Resume Next
Dim db As Database
Dim td As TableDef
Dim qd As QueryDef
IsTableExist = 0

err.Clear
Set db = CurrentDb
Set td = db.TableDefs(TableName)
If err.Number = 0 Then If td.Connect = “” Then “Таблиця локальна
IsTableExist = 1 Else “Таблиця приєднана
IsTableExist = 2
End If
Set td = Nothing
Set db = Nothing
Exit Function
End If

err.Clear
Set qd = db.QueryDefs(TableName) If err.Number = 0 Then IsTableExist = 3 “Запит
Set qd = Nothing
Set db = Nothing

End Function


Якщо ця функція показала, що існує локальна таблиця або запит з таким же ім’ям, як у таблиці, яку ми хочемо підключити, то припиняємо всі подальші дії. Якщо ж існує приєднана таблиця, видалимо її і продовжимо, як і у випадку відсутності об’єкта з вказаним іменем.

Тепер наше завдання – створити об’єкт TableDef таким чином, щоб він виявився приєднаної таблицею, повністю придатною для будь-яких операцій з даними. Спочатку створимо сам об’єкт TableDef:

Set NewTableDef = CurrentDB.CreateTableDef (“Ім’я таблиці в БД MS Access”) NewTableDef.Connect = “Рядок підключення” NewTableDef.SourceTableName = “Ім’я таблиці або подання на сервері”

Як бачите, немає необхідності спеціально вказувати, що ми хочемо створити саме приєднану таблицю ODBC. Access сам визначає це аналізуючи рядок підключення. Про те, як її правильно сформувати – Трохи пізніше. Тепер додамо тільки що створене визначення таблиці в колекцію TableDefs:

CurrentDB.TableDefs.Append NewTableDef

І в кінці допоможемо Access “у визначити первинний ключ, якщо він сам його не розпізнав, що є нормальним явищем при підключенні уявлень (VIEW):

CurrentDB.Execute “CREATE UNIQUE INDEX PrimaryKey ON ” & _ “Ім’я таблиці в БД MS Access” & “(” & _ “Список полів первинного ключа” & “)”

Найскладніше тут – скласти рядок підключення. На початку обов’язково потрібно вказати “ODBC;”, потім – ім’я джерела даних (“ODBC; DSN = <Ім'я джерела даних>; …”), ім’я користувача (“…; UID = <Логін>;. .. “) і пароль (“…; PWD = <Пароль>; …”) наприклад:

“ODBC;DSN=PostgreSQL Test;UID=Postgres;PWD=secret;”

Далі, при необхідності, можна вказати ім’я бази даних та інші параметри, в тому числі, специфічні для використовуваного ODBC драйвера. Порядок проходження опцій не має особливого значення, так як всі вони розрізняються по іменах (DSN, UID, DB). Як роздільник використовується крапка з комою (;). Наприклад:

NewTableDef.Connect = “ODBC;DSN=PG_Sample;DATABASE=sample;SERVER=test;” & _
“UID=Postgres;PWD=;PORT=5432;””

На цьому можна було б закінчити, але не можна не згадати, що у деяких ODBC драйверів є одна чудова риса: вони дозволяють підключати таблиці взагалі без створення DSN. У їх числі драйвери для MS SQL Server 7.0 та PostgreSQL. Для цього треба просто замість параметра DSN вказати параметр DRIVER та ім’я драйвера, укладена у фігурні дужки. Звичайно, в такому випадку буде потрібно вказати всі необхідні драйверу опції. Наприклад:

NewTableDef.Connect = “ODBC;DRIVER={PostgreSQL};DATABASE=sample;SERVER=test;” & _
“UID=Postgres;PWD=;PORT=5432;A6=;A7=100;” & _
“C2=dd_;CX=188373ab;A8=4096;B0=254;B1=8190;BI=8;”

Опцій може бути досить багато і це викликає дуже серйозну проблему: довжина рядка підключення не може перевищувати приблизно 270 символів. Розробники драйвера PostgreSQL це розуміють і намагаються знайти вихід шляхом кодування деяких опцій. Параметр CX і є таким кодом. Формується він так: перші два байти містять кількість реально значущих бітів в подальшому числі (в шістнадцятковому форматі). Наприклад, 18 означає, що використовуються 24 біта які представляють наступні опції драйвера:

– Молодший біт –
LF <-> CR/LF conversion
Updatable Cursors
Disallow Premature
Recognize Unique Index
PROTOCOL 6.3
PROTOCOL 7.X,6.4
Unknown Sizes(Don”t know)
Unknown Sizes(Maximum)
Disable Genetic Optimizer
KSQO
CommLog
MyLog
Parse Statements
Cancel As FreeStmt
Use Declare/Fetch
Read Only
Text As LongVarChar
Unknowns As LongVarChar
Bools As Char
Row Versioning
Show System Tables
Oid Options(Show Column)
Oid Options(Fake Index)
True is -1
– Старший біт –

Деякі параметри неможливо закодувати таким чином і для їх іменування продовжують використовувати буквоціфровие скорочення:

  Connect Settings      A6
Cache Size A7
Socket A8
Max Varchar B0
Max LongVarChar B1
SysTable Prefixes C2
Int8 As BI

Приклад, який я зробив для Access “97, можна взяти тут. Він заснований на підході, описаному в замітці «Програмне підключення таблиць із зовнішньої бази даних MS Access», Але містить додаткову таблицю, в якій зберігається інформація, необхідна для підключення до сервера. Так як сам підхід досить універсальний, приклад годиться для підключення не тільки до серверу PostgreSQL, але і до будь-іншому, можливо, з якимись незначними доробками.

Рядок підключення можна легко отримати, приєднавши таблицю вручну, а потім скопіювавши весь вміст властивості «Опис» (крім тега table = …) з властивостей таблиці, відкритої в режимі конструктора. Для сервера PostgreSQL можна скористатися надбудовою, яку я створив спеціально для формування рядків коннекта і мінімального адміністрування сервера.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*