Что такое код odbc_do

Содержание

ODBC API

Автор: Антон Баула

Опубликовано: 15.10.2001
Исправлено: 24.03.2005

Для кого предназначена эта статья

Если вы не используете MFC для доступа к СУБД или вы хотите узнать, как работают классы CDatabase и CRecordset из этой библиотеки, то эта статья для вас.

Что такое ODBC и зачем оно надо?

Если объяснить просто, то для большинства разработчиков, ODBC это стандарт, поддерживая который можно создавать приложения способные работать со многими СУБД, при условии, что эти СУБД, в свою очередь, тоже поддерживают этот стандарт (поставляя драйвер, скрывающий от программиста подробности вызова native API). При этом, со стороны клиента совершенно не обязательно знать с какой СУБД он работает в данный момент: Oracle, MSSQL, Access. Если клиент использует ODBC, то он не замечает особой разницы.

Подробное описание ODBC API вы сможете найти в библиотеке MSDN в разделе Platform SDK Documentation -> Data Services -> Microsoft Data Access Components (MDAC) SDK -> Microsoft Open Database Connectivity (ODBC).

В данной статье мы рассмотрим, как с помощью ODBC создавать простые приложения способные выполнять запросы к базам данных и получать данные.

Мы разберём всю последовательность действий, которые необходимо выполнить любому приложению работающему с СУБД посредством ODBC.

Работа с СУБД через ODBC API

Сначала в общих чертах.

  • Установить соединение с базой данных
  • Выполнить запрос
  • Получить данные
  • Закрыть соединение

Шаг 1. Устанавливаем соединение с базой данных

Прежде чем начать работать, нам необходимо загрузить Driver Manager (Менеджер драйвера). Для этого вызовем функцию SQLAllocHandle , которая даст нам описатель (Handle) окружения. Необходимо сохранить его:

Затем нам необходимо зарегистрировать версию ODBC, с которой мы собираемся работать. Делается это с помощью функции SQLSetEnvAttr с флагом SQL_ATTR_APP_ODBC_VER . Эта функция, как видно из названия, изменяет атрибуты окружения Менеджера драйвера.

В нашем случае сообщаем, что работаем с 3-й версией ODBC ( SQL_OV_ODBC3 ):

Далее переходим непосредственно к установлению соединения. Для этого мы должны инициализировать структуру, в которой Менеджер драйвера хранит всю информацию о соединении, и получить описатель этой структуры (Handle). Делается это с помощью всё той же функции SQLAllocHandle , но теперь в качестве флага мы указываем не SQL_HANDLE_ENV , а SQL_HANDLE_DBC :

Теперь всё готово к установлению соединения с источником данных. Да, да, я не оговорился именно с источником данных (Data Source), хотя ODBC позволяет работать с СУБД напрямую, делать этого не рекомендуется, поэтому мы не будем рассматривать эту возможность в данной статье.

Итак, устанавливаем связь с помощью функции SQLConnect:

Эта функция принимает 7 аргументов:

  • описатель соединения, который мы получили чуть выше;
  • указатель на строку содержащую имя источника данных ( в нашем случае это переменная szDsn);
  • длина строки в байтах или флаг ( в нашем случае это SQL_NTS, что означает, что аргумент является строкой с нулевым символом на конце );
  • 4-й и 5-й параметры по аналогии со 2-м и 3-м содержат имя пользователя и длину строки;
  • 6-й и 7-й – строку авторизации, пароль.

Ну, что ж теперь мы имеем соединение с СУБД и неплохо было бы воспользоваться этим обстоятельством для собственной выгоды :-))) — начинаем работать с базой данных.

Шаг 2. Выполняем запрос к СУБД

Перед тем как выполнять запрос к СУБД нам необходимо инициализировать структуру, в которой хранится вся информация о текущем запросе, делается это с помощью всё того же метода SQLAllocHandle , с флагом SQL_HANDLE_STMT .

Запросы к базе данных можно выполнять двумя способами.

Прямой запрос с помощью SQLExecDirect , когда строка запроса непосредственно передаётся функции со всеми необходимыми параметрами.

Запрос сначала подготавливается с помощью SQLPrepare , затем если необходимо специальные символы в строке запроса, в ODBC это знак «?», можно связать с какими либо переменными, это делается с помощью SQLBindParameter , затем запрос отправляется в СУБД методом SQLExecute .

Поскольку с первым способом всё понятно и комментариев не требуется, то рассмотрим подробно лишь второй способ.

Как видите, здесь тоже нет ничего сложного.

Шаг 3. Получаем данные из СУБД

Чтобы получить данные из СУБД, нам необходимо просто подготовить переменные, в которые мы будем записывать получаемые значения, и связать эти переменные с соответствующими столбцами результата запроса. Делается это с помощью метода SQLBindCol .

Коротко опишем эту функцию. Она принимает на вход 6 параметров:

  • описатель запроса, который мы получили, перед тем как отправить запрос к СУБД;
  • номер столбца, с которым мы связываем переменную, очень важно запомнить, что счёт столбцов начинается с единицы;
  • флаг, показывающий к какому типу данных в терминах языка С принадлежит ваша переменная, например SQL_C_DOUBLE – это double, SQL_C_CHAR – char и так далее, соответствие типов приводится в MSDN;
  • указатель на вашу переменную, которую вы связываете с колонкой в результате запроса;
  • размер вашей переменной в байтах;
  • указатель на переменную типа long, в которую функция записывает дополнительную информацию.

Всё понятно если мы знаем, сколько столбцов в результате запроса и тип каждого из них, а если нет, если заранее мы не знаем ни количество столбцов, ни их тип? На этот случай ODBC API имеет один метод, чтобы узнать количество столбцов в результате запроса

И два метода, что бы получить информацию о каждом столбце SQLDescribeCol и SQLColAttribute обе эти функции функционально почти идентичны, но SQLColAttribute возвращает расширенное описание, основанное на стандарте ANSI SQL-92 и DBMS , а SQLDescribeCol информацию основанную на стандарте ANSI-89 SQL .

После того как мы связали наши переменные с каждым из столбцов, всё, что осталось нам сделать это вызывать метод SQLFetch , пока он не вернёт нам значение равное SQL_NO_DATA говорящее нам, что была достигнута последняя строка в результате запроса.

После каждого вызова SQLFetch , наши переменные, связанные со столбцами, содержат значения полей текущей строки в результате запроса.

Ну что же мы получили данные, теперь нам обязательно необходимо закрыть курсор, который открывается автоматически при выполнении запроса к СУБД ( SQLExecDirect или SQLExecute ), делаем это методом SQLCloseCursor

Далее мы возвращаемся к пункту номер 2 или завершаем работу, для чего закрываем все описатели в порядке обратном их открытию, не забываем закрыть соединения с базой данных, всё это выглядит следующим образом.

Шаг 4. Завершение работы

Вот так вкратце работают приложения на базе ODBC API. Возможности ODBC API намного шире, чем показано в данной статье, за дополнительной информацией обращайтесь в MSDN.

Как использовать ODBC с PHP

Руководство для начинающих по универсальному подключению к базам данных с помощью PHP

PHP ― один из наиболее часто используемых языков программирования для разработки динамических Web-сайтов. Это мощный и эффективный инструмент. К тому же он достаточно прост и очень хорош для начинающих ввиду своей гибкости.

PHP ― хороший язык и сам по себе (особенно в сочетании с XHTML). Однако для большинства приложений необходим удобный метод хранения данных, как правило, с помощью базы данных, например MySQL или PostgreSQL. Для подключения PHP к системам хранения данных требуется коннектор, позволяющий выполнять такие функции, как mysql_query () и pg_query () . В большинстве случаев этого достаточно, но иногда нужно, чтобы данные хранились в чем-то вроде электронной таблицы, с которой легко работать индивидуально. В таких ситуациях для связи с данными требуется другой коннектор.

А что делать, если нужно, чтобы команды SQL работали не с системой управления базами данных, а с любым специально настроенным хранилищем данных? Для этого и создан Open Database Connectivity (ODBC), и при правильной установке коннекторов можно получить доступ даже к Microsoft® Excel®, CSV и другим файлам данных. ODBC представляет собой коннектор, который делает PHP-разработку «не зависящей от коннектора базы данных». Он применяет такие функции, как odbc_query () , к таким базам данных, как MySQL, PostgreSQL, SQLite, Microsoft SQL Server®, IBM® DB2®, Sybase, OpenLink Virtuoso, FileMaker и Microsoft® Office®. Его можно применять и к CSV-файлам и таблицам Excel — в зависимости от настройки драйвера ODBC.

ODBC: что это такое?

ODBC – это система программных драйверов, использующихся для связи языков программирования с хранилищами данных. Это свободно распространяемая система с открытым исходным кодом, которая создана в 1992 году в попытке стандартизировать способы связи, такие как функции и настройки, между языками программирования и языками запросов к базам данных (стандартизация SQL).

ODBC работает как двойной интерфейс или коннектор: во-первых, как интерфейс от системы языка программирования к ODBC-системе, и во-вторых, как интерфейс от ODBC-системы к системе хранения данных. Таким образом, для ODBC требуется драйвер «язык программирования – ODBC» (например, библиотека PHP-ODBC ) и драйвер «ODBC – система хранения данных» (например, библиотека MySQL-ODBC). Это в дополнение к самой ODBC-системе, которая управляет конфигурациями источников данных и позволяет менять источники данных и языки программирования.

Как сопрягаются PHP и SQL?

PHP — это язык программирования, как правило, используемый в качестве серверного языка для динамических Web-сайтов. Это гибкий, динамичный и слабо типизированный язык. Он должен показаться знакомым многим разработчикам, поскольку создавался под влиянием языка программирования С. PHP, свободно распространяемый и открытый язык программирования, который появился в 1995 году, можно использовать с базами данных через коннектор для генерации XHTML и HTML в Web-браузере.

SQL представляет собой кросс-платформенный язык для обращения к хранилищам данных. Он используется главным образом для работы с реляционными базами данных, но имеет процедурные, объектно-ориентированные и объектно-реляционные расширения. Современные реализации SQL можно найти в MySQL, PostgreSQL, SQLite, DB2 (как коммерческих, так и Express-C редакциях), Microsoft SQL Server, OpenLink Virtuoso, FileMaker и Microsoft Access — все они могут подключаться для использования с языками программирования типа PHP через систему связи (ODBC).

Настройка ODBC

Давайте посмотрим, как типичную среду Linux-Apache-PHP-MySQL (LAMP) можно преобразовать в гибкую среду Linux-Apache-PHP-ODBC (LAPO). Существуют два основных варианта ODBC-драйверов для Linux®: iODBC и unixODBC. Оба набора драйверов имеют свои плюсы и минусы, и оба работают с PHP, но с разными наборами баз данных. Я предпочитаю iODBC за его традиционно сильную связь с такими языками Web-программирования, как PHP и Ruby, а также стабильность при работе с ODBC-совместимыми базами данных, такими как MySQL и OpenLink Virtuoso. Тем не менее, это всего лишь вопрос выбора, и вы можете оценивать их исходя из собственных требований эффективности. Не считая тонких внутренних различий, iODBC и UnixODBC работают одинаково и с точки зрения связи с языком программирования – PHP-функции идентичны, — и с базой данных (например, на MySQL это никак не повлияет).

И iODBC, и UnixODBC есть в Linux Software Package Managers. Например, в командной строке Debian, Ubuntu или Linux Mint нужно выполнить команду sudo apt-get install iodbc .

ODBC в других системах

Apple Mac OS X поставляется с предустановленным iODBC, так что ничего устанавливать не нужно. ОС Windows® также поставляются с собственным драйвером ODBC.

Соединение базы данных с ODBC

Если вы еще не сделали этого, установите СУБД, такую как MySQL или PostgreSQL. Затем установите коннектор «ODBC-база данных». Он будет разным для разных баз данных, но для MySQL, например, коннектор устанавливается путем установки с Web-сайта MySQL драйвера, соответствующего операционной системе.

В дистрибутивах Linux, поддерживающих apt , можно запустить с консоли следующую команду: sudo apt-get install libmyodbc .

Нужно будет настроить ODBC-клиент для работы с установленной базой данных, запустив такую программу, как iodbcadm-gtk. Файл iODBC можно отредактировать и вручную. (В Linux этот файл часто находится в каталоге /etc/iodbc.ini.)

Пример: соединение PHP с ODBC

Теперь нужно установить драйвер PHP ODBC. Это можно сделать, добавив iODBC или unixODBC в сценарий компиляции PHP (очень сложно) или путем установки библиотеки PHP-ODBC. В дистрибутиве на базе apt можно использовать следующую команду: sudo apt-get install php5-odbc .

Выполните проверку, запустив PHP в интерактивном режиме ( php -а ). Это открывает интерактивную консоль PHP, из которой можно установить связь, как в примере, приведенном в листинге 1.

Листинг 1. ODBC-соединение из командной строки

Проанализируем код из листинга 1.

  1. Установка соединения с использованием функции odbc_connect () в PHP. В качестве параметров эта функция принимает строку коннектора ODBC, имя пользователя и пароль. Строка коннектора сопоставляется с файлом odbc.ini, так что заранее убедитесь, что они совпадают.
  2. Создание экземпляра переменной для строки, соответствующей оператору SQL.
  3. Выполнение SQL с использованием функции odbc_exec , которая принимает соединение и строку SQL, возвращая результирующий набор.
  4. Выборка только одной строки из этого результирующего набора с использованием функции odbc_fetch_row() , которая принимает результирующий набор в качестве параметра. Это итерационная функция, то есть при следующем обращении к ней вы получите следующий результат из набора (до окончания результатов в наборе, после чего она выдаст значение false).
  5. Использование функции odbc_result () , которая принимает результирующий набор и имя столбца (в виде строки) и возвращает значение ячейки в строке, на которую указывает итератор строк.
  6. Закрытие ODBC-соединения с использованием функции odbc_close , которая принимает само соединение.
  7. Выход из интерактивного режима PHP по команде exit .

Все это хорошо, но для решения масштаба Web-приложений этого мало. Чтобы проверить метод на Web-приложении клиент/сервер, необходимо установить Web-сервер, такой как Apache или Lighttpd. (При работе с Linux установите PHP-модуль для своего Web-сервиса, иначе PHP работать не будет).

В листинге 2 показан тот же подход, реализованный через Web-сервер. Код PHP подобен тому, что приведен в листинге 1, но экспорт результатов выполняется через XHTML, а не из командной строки.

Листинг 2. Пример ODBC-соединения на основе XHTML

В этом листинге есть дополнение, которого не было в листинге 1: теперь в полной мере используются преимущества итерационной функции odbc_fetch_row () , так как она помещена в цикл while . Это означает, что если SQL немного сложнее и обращается к таблице за несколькими результатами, то в таблице XHTML будет создана новая строка.

Существует много разновидностей XHTML и HTML с различной степенью удобства и поддержки браузеров. Листинг 2 генерирует стандартизированный XHTML 1.0 Strict, одну из лучших форм XHTML для разработки документов, ориентированных на данные и не зависящих от браузера.

Программирование PHP-ODBC

Существуют четыре основных типа ODBC-функций: функции соединения, запроса, выборки данных и сообщения об ошибках. Функции запроса выполняют стандартные операции базы данных по созданию, чтению, редактированию и удалению данных (т.н. операции CRUD).

Функции связи

Каждый начавшийся процесс должен завершиться, иначе возникнут проблемы с ресурсами памяти и процессора. Поэтому соединения с базой данных необходимо закрывать.

Мы уже видели, что odbc_connect () принимает ODBC-совместимую строку установления связи, имя пользователя базы данных и пароль. В ответ она возвращает объект соединения, который можно использовать по всей PHP-программе. Следующий код демонстрирует пример:

В предыдущем примере мы уже видели также, что функция odbc_close () принимает объект соединения и завершает связь с ODBC и базой данных. Обязательно закрывайте свои соединения, в противном случае их станет слишком много, и придется перезапускать систему управления базами данных — или еще хуже, всю систему. Вот как это работает: odbc_close($connection); .

Функции запроса

Мы уже использовали функцию odbc_exec () ; она принимает объект соединения и строку SQL и возвращает объект результирующего набора. Объект результирующего набора ― это сложный зверь, так как обычно он находится в памяти СУБД и может быть расшифрован только теми функциями, которые с ним взаимодействуют. Строка odbc_exec () выглядит примерно так: $resultset = odbc_exec($connection, $sql); .

Функции odbc_prepare() и odbc_execute невероятно полезны для инъекции в SQL неизвестных переменных. Функция odbc_prepare () подготавливает SQL-оператор и СУБД, а затем odbc_execute () присылает переменные. Это мощнее, безопаснее и эффективнее, чем простое создание объединенной строки SQL в PHP и ее отправка посредством функции odbc_exec() . Вместе они выглядят примерно так:

В листинге 3 приведен хороший пример для поиска людей в таблице пользователей по адресу и дате рождения. Обратите внимание на вопросительный знак ( ? ) в строке SQL, которой означает что переменные определены в последовательном массиве функции odbc_execute() .

Листинг 3. Инъекция SQL-переменной с командами подготовки и исполнения

Функции приема

Функция odbc_fetch_row() принимает результирующий набор из запроса и сдвигает указатель итератора в следующую строку. Эта функция часто используется в сочетании с функцией odbc_result () для приема различных ячеек:

В предыдущих примерах odbc_result() принимала $resultset и строку с именем столбца и возвращала значение ячейки. Это используется в сочетании с функцией odbc_fetch_row() , чтобы указать конкретную строку в результирующем наборе:

Функция odbc_fetch_array () похожа на нее тем, что это функция итератора, используемая для извлечения данных из результирующего набора запроса. Однако она возвращает массив, который содержит строку с именем столбца в качестве ключа и ячейку в качестве значения:

Как и odbc_fetch_array() , функция odbc_fetch_object () выбирает объектно-ориентированную структуру, соответствующую строке. Она помещает имена столбцов в качестве свойств объекта и значения ячеек в качестве значений свойства:

Эта функция полезна для распечатки набора результатов в формате HTML. Это простая визуализация результатов, но она может быть полезна при создании прототипов или отладке:

Довольно удобная функция odbc_num_fields() просто берет набор результатов и указывает количество строк в этом наборе:

Решение проблем и отладка

Две удобные функции PHP ODBC — odbc_error() , которая возвращает код ошибки, если произошла ошибка, или значение false, если ошибки нет, и odbc_errormsg() , которая возвращает сообщения для пользователя – можно объединить в простую последовательность выдачи сообщений об ошибках:

Еще один совет: если вы получаете ошибки в процессе разработки, никогда не стесняйтесь добавлять печатные сообщения рядом с проблемными строками – конечно, при условии, что вы удалите эти «отладочные строки», когда будете демонстрировать свою программу. Вот PHP-функция, которая часто выручает:

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

Универсальная связь

Рассмотрим построение Web-приложений, которые можно развернуть в любом месте (примерами могут служить Drupal, WordPress или Joomla). Часто они строятся с использованием одной базы данных (например, MySQL) с ее специфическими функциями (например, mysql_connect () ), а затем тщательно перерабатываются для другой базы данных (например, PostgreSQL) с другими функциями (например, pg_connect () ). При использовании ODBC это лишнее, так как для перенастройки достаточно инициализации приложения, и функции ODBC индифферентны к системе базы данных.

Следует помнить, однако, что хотя все системы управления базами данных поддерживают стандартизованный SQL, иногда они содержат также собственные расширения. Вот почему преобразовать существующее приложение PHP-MySQL, PHP-PostgreSQL или PHP-MS-SQL в приложение PHP-ODBC не так просто. Поэтому, создавая новое приложение, нужно строго придерживаться стандартизированного SQL (или самых распространенных расширений SQL).

Как уже говорилось, ODBC можно использовать и для подключения к электронной таблице. Как и в случае баз данных, это делается с помощью коннектора. Их много – как с открытым исходным кодом, так и фирменных. Примером может служить Microsoft Office для Windows, который содержит ODBC-коннекторы для таблиц Excel. Возможно, работать с электронными таблицами с помощью ODBC весьма неудобно, и гораздо проще, наверное, преобразовать простую электронную таблицу в таблицу базы данных. Однако когда установлено ODBC-соединение с таблицей, его можно рассматривать как соединение с базой данных – те же функции ODBC PHP, но с SQL-подобным языком и стандартными формулами электронной таблицы Excel.

Применение связанных данных и Semantic Web

Перемещение связанных данных выглядит как подключение данных через Web. Этот подход имеет много преимуществ — в первую очередь для машин, понимающих отдельные элементы данных, но также и для пользователей, например, им становится легче находить информацию. Для перемещения связанных данных используются существующие стандарты Semantic Web (такие как Resource Description Framework и Web Ontology Language) и стандартизация интернет/Web (например, HTTP и OpenID). Становится понятно, что методы подключения к связанным данным несколько напоминают ODBC в том плане, что URI подобен строке соединения, а Semantic Web Query Language (SPARQL) подобен запросам SQL через установленное соединение.

Расширяя теорию о том, что связанные данные в какой-то мере аналогичны ODBC, можно установить ODBC-соединение с подключенным хранилищем данных (таким как triple store) и отправлять запросы SPARQL через ODBC-соединение. Это случай СУБД OpenLink Virtuoso, которая допускает связь через стандартное соединение ODBC.

Лицензирование и ODBC

iODBC лицензируется по двум лицензиям open source: GNU General Public License (GPL) и Berkeley Software Development. UnixODBC также лицензируется по лицензии open source GPL. Это означает, что все, что вы разработаете с применением этих библиотек, не обязательно должно быть открытым и может быть проприетарным. ODBC-драйвер от Microsoft также может быть частью проприетарного программного обеспечения, но связан лицензионными соглашениями по программному обеспечению Microsoft Office (в случае доступа к базам данных и таблицам Excel) и SQL Server (в случае баз данных SQL Server).

Заключение

ODBC может с успехом применяться для максимально универсальной связи. Это повышает эффективность разработки и позволяет расширять приложения для работы с новыми формами данных, такими как связанные данные на базе Web. Однако у этого подхода есть свои недостатки: для достижения универсального подключения нужно тщательно выбрать способ построения SQL-запросов, так как во всех системах управления базами данных можно использовать только подмножество общедоступных команд SQL. Хотелось бы надеяться, что эта статья окажется полезной для начала работы с базами данных через ODBC с использованием языка программирования PHP.

Ресурсы для скачивания

Похожие темы

  • Оригинал статьи (EN)
  • Раздел W3chools, посвященный SQL — полезен как учебник для начинающих и как справочник по SQL. В нем подробно описано то, что стандартизовано, а также то, что работает на той или иной системе управления базами данных. (EN)
  • Раздел W3Schools, посвященный PHP — еще один полезный ресурс для разработчиков, осваивающих PHP, а также для тех PHP-разработчиков, которым требуется справочник по языку.(EN)
  • iODBC.org: обширные сведения по установке и настройке iODBC, а также полезная информация по ODBC и коннекторам для различных СУБД и языков программирования. (EN)
  • unixODBC.org: информация по установке, настройке и драйверам коннекторов для UnixODBC.
  • MySQL.org: СУБД MySQL для разработчиков, которая с января 2010 года входит в семейство Oracle.(EN)
  • Коннектор ODBC MySQL можно загрузить прямо со страницы MySQL.(EN)
  • О драйвере ODBC Microsoft в MSDN и в файлах помощи программы ODBC Data Source Administrator. В этих двух местах можно найти сведения о работе с Access, SQL Server и Excel через ODBC. (EN)
  • PostgreSQL.org: страница СУБД PostgreSQL. (EN)
  • Проект PostgreSQL ODBC Connector: доступен в качестве бесплатного и открытого программного обеспечения. (EN)
  • OpenLink Virtuoso: «универсальный сервер». Обеспечивает Web-хостинг (в том числе с поддержкой языка PHP), базы данных, ODBC-соединения и технологию Semantic Web. OpenLink Software также отвечает за библиотеку с открытым исходным кодом iODBC, которая поставляется в версии open source и в проприетарной версии. (EN)
  • Для Web-серверов, отличных от OpenLink Virtuoso, ознакомьтесь с Apache HTTP Server и Lighttpd Server (EN)
  • PHP.net: все, что связано с PHP. (EN)
  • Подробная информация обо всех функциях PHP ODBC на сайте PHP.net. (EN)
  • LinkedData.org: хороший портал по связыванию открытых данных и Semantic Web. Портал W3C Semantic Web: еще один полезный ресурс.(EN)
  • Стандарты SQL Международной организации по стандартизации.

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

Работа с внешними данными с помощью технологии ODBC

Читайте также:

  1. C помощью микроскопа
  2. CALS-технологии
  3. CALS-технологии
  4. CALS-технологии
  5. CASE-технологии
  6. Ethernet — пример стандартной технологии коммутации пакетов
  7. I. Контрольная работа
  8. I. Технологии менеджмента качества
  9. II. Законодательное и нормативно-правовое регулирование вопросов воинского учета и бронирование граждан, пребывающих в запасе и работающих в организациях здравоохранения.
  10. II. Тригонометрические функции и функции работающие с углами.
  11. II.Затраты на организацию работ на строительных площадках и усовершенствование технологии
  12. III. Метод определения платежеспособности физических лиц, разработанная Сбербанком России.

Важнейшим этапом в построении приложения клиент-сервер является установка связи клиентского приложения с источником данных, находящимся на сервере БД. В настоящий момент различные средства разработки используют несколько технологий обеспечения доступа к данным. Общепризнанным стандартом, как мы уже писали ранее, является технология ODBC.

В этом параграфе мы рассмотрим основы применения технологии ODBC для установки связи с MS SQL Server.

Открытый доступ к данным — Open Database Connectivity (ODBC) — это общее определение языка и набор протоколов. ODBC позволяет клиентскому приложению, написанному, например, на Access или Visual FoxPro, работать с командами и функциями, поддерживаемыми сервером.

В качестве сервера может выступать любой сервер БД, имеющий драйвер ODBC (MS SQL Server, Oracle и т. д.), или даже настольная база данных, ведь часто может возникнуть необходимость в совместной обработке данных, хранящихся в формате Paradox, приложениями, написанными и на FoxPro и на Delphi. ODBC находится как бы посредине между приложением, использующем данные, и самими данными, хранящимися в формате, которые мы не можем обработать напрямую в приложении, и используется как средство коммуникации между двумя front-end и back-end сторонами.

Для использования ODBC с целью получения данных в сети вам необходимы средства коммуникации между машиной, на которой находятся данные, и станцией, где они будут просматриваться, модифицироваться и, возможно, пополняться. Это специальная программа, которая называется Администратор ODBC на рабочей станции, и драйверы, которые могут работать как с приложением, так и с данными на сервере. Технология ODBC обеспечивает возможность хранить данные на разных серверах БД, причем не обязательно в одном формате. В теории подразумевается, что для этого не надо переписывать ни одной строчки в вашем пользовательском приложении, работающем на клиентской ПЭВМ. На практике так бывает не всегда, из-за различий в структуре различных уровней построения ODBC.

ODBC определяет минимальный набор SQL команд и набор функций вызова с двумя уровнями расширений. Технология ODBC включает также механизм для вызова специфических для сервера возможностей, которые не включены в стандарт ODBC. В целом, это дает возможность разработчику решать самостоятельно, какой уровень функциональности ему достаточен для доступа к серверу баз данных. Разработчик выбирает между наименьшей обеспечиваемой ODBC функциональностью или пытается использовать все возможности сервера.

С минимальным набором функциональности ODBC разработчик может установить связь с источником данных через стандартный интерфейс загрузки, выполнять SQL команды, выбирать данные и получать сообщения об ошибках, если предпринятое действие закончилось неудачей.

С расширенной функциональностью ODBC разработчик может использовать дополнительные возможности стандарта SQL и функции ODBC, чтобы расширить возможности управления внешней СУБД. Расширения ODBC включают в себя такие дополнительные возможности, как асинхронное выполнение запросов, нестандартные в среде приложения типы данных (Timestamp, Binary), прокручиваемые курсоры, SQL команды для скалярных функций, внешние объединения, хранимые процедуры и способность использовать SQL расширения, характерные для конкретного сервера БД.

Если вы используете ODBC драйверы для MS SQL Server, разработанные Microsoft, то вам повезло, так как их расширения предоставляют практически все возможности для полноценной работы с сервером. Если же вы работаете с сервером, отличным от MS SQL Server, или с этим сервером, но драйвер ODBC не разработан фирмой Microsoft, то у вас могут возникнуть трудности ввиду не полной поддержки функциональности сервера драйвером. Если у вас есть сомнение в функциональности драйвера, то для получения полной и содержательной информации о нем используйте функции SQLGetInfo(), SQLGetFunction() и SQLGetStmtOption(). Более подробно о них мы расскажем ниже.

Одна из главных целей создания ODBC — скрыть сложность соединения с сервером и по мере возможности автоматизировать выполнение многочисленных процедур, связанных с получением данных. ODBC требует от разработчика только имени источника данных, при этом функции драйвера, адреса серверов, сети и шлюзы скрыты от пользователя. Возможно, вам как разработчикам захочется знать все тонкости работы ODBC, но учтите, прямая работа с функциями драйвера требует более сложного программирования, что не всегда сопровождается выигрышем в скорости.

Описание основных компонентов ODBC приведено в табл. 8.1.

Таблица 8.1. Основные компоненты ODBC

Компоненты Описание
Приложение Использует ODBC для связи с источником данных, отправления и получения данных. Приложение может использовать функцию SQLConnect(), чтобы передать указатель соединения, имя источника данных, идентификатор пользователя и пароль Диспетчеру драйверов.
Диспетчер драйверов Поддерживает связь между приложением и источником данных, обеспечивая информацией приложение и загружая драйверы динамически, по мере необходимости. ODBC позволяет приложению взаимодействовать с источниками данных разных типов посредством драйверов СУБД, используя Администратор ODBC для установки соединения. Диспетчер драйверов и сами драйверы разработаны как библиотеки DLL. Диспетчер драйверов загружает нужную библиотеку, соединяется с сервером с помощью драйвера, который на самом деле и выполняет все вызовы функций из приложения.
Драйвер Выполняет все вызовы ODBC функций, управляет всеми взаимодействиями между приложением и сервером, переводит SQL выражения на синтаксис источника данных. Драйверы обычно поставляются продавцом сервера БД и имеет смысл получить самую последнюю версию, в которой, вероятнее всего, будет наименьшее количество ошибок. Драйвер перехватывает все ошибки программ, переводя их в стандартные ошибки ODBC. Драйвер позволяет узнать информацию об объектах в базе данных, таких как таблицы, поля, индексы и т. п.
Сервер БД Хранит и выводит данные в ответ на запросы со стороны ODBC драйвера. Сервер по запросу возвращает данные или код ошибки, которые передаются в приложение.

Первые разработчики ODBC столкнулись с проблемой — какой из диалектов SQL поддерживать. Если есть сотни SQL продуктов на рынке, то есть и сотни диалектов SQL. В итоге, чтобы никого не обидеть, разработчики ODBC создали еще один диалект, который называется «ODBC SQL», и компонент, который позволяет программам переводить их собственные диалекты на универсальный диалект и наоборот.

На настоящий момент разработано очень много технологий для доступа к внешним данным. В них немудрено запутаться, и, чтобы этого не произошло, — ни слова о том, что не имеет отношения к рассматриваемым средствам разработки. Кстати, среди них СУБД Access имеет наибольшее число способов взаимодействия с MS SQL Server, поэтому как пример мы хотим кратко описать и перечислить их (см. также рис. 8.1):

· Использование связанных таблиц. Всю работу за вас выполняет процессор баз данных Microsoft Access. Самый надежный в плане программирования способ — он не требует вообще никаких дополнительных драйверов. Вы можете заниматься только обработкой данных, связывать таблицы на сервере с локальными таблицами, создавать запросы.

· Использование SQL pass-through функций. При этом вы обращаетесь напрямую к серверу, на его языке, минуя процессор баз данных Access. Ваш запрос, хотя и проходит через все компоненты ODBC, ни один из них реально не обрабатывает его.

· Прямое обращение к ODBC API. При этом способе вы также минуете процессор баз данных Access и напрямую используете Диспетчер драйверов и сам драйвер для доступа к базе данных. Таким образом, ваш код должен обеспечить всю функциональность, которую, как правило обеспечивает процессор баз данных Access. Сложность написания кода даже для довольно простых запросов заставляет обращаться к этому методу только тогда, когда действительно необходима значительная скорость выборки данных.

· Использование Remote Data Objects. Этот четвертый способ является самым дорогим по материальным затратам, так как для его функционирования необходимо, чтобы на вашей рабочей станции была установлена версия Enterprise Visual Basic 4.0 и выше. Технология Remote Data Objects (RDO) — Объекты для доступа к внешним данным — трактует запросы ODBC как объекты. Запросы работают со свойствами этих объектов и используют их методы, чтобы получить данные. В свою очередь, RDO конвертирует все действия в вызовы ODBC API. В принципе то же самое делает процессор баз данных, но во многих случаях RDO работает быстрее. Однако RDO также требует написания многих строчек кода, хотя и не такого сложного, как в случае прямого обращения к ODBC API. Ну и вспомните, что установка Enterprise версии Visual Basic стоит около 1000 долларов.

· Использование SQL DMO. За счет использования SQL OLE в этом случае не используются ни процессор баз данных, ни ODBC. В данном случае мы работаем с SQL-DMO. В этой технологии мы можем использовать такие продукты, как Visual Basic for Application, Visual Basic (32 bit), Visual FoxPro и C++ (32 bit), для работы с объектами, которые позволяют нам управлять различными SQL серверами в сети. Этот способ работает только под Windows NT. При этом на рабочей станции вам необходимо иметь клиентскую часть SQL Server. Программирование администрирования SQL Server значительно упрощается благодаря легкому в изучении и использовании объектному языку. Легко можно выполнять все запросы как выборки, так и управления.

После того как вы подсоединитесь к внешнему источнику данных, вы можете задействовать набор SQL — pass through функций. С помощью них вы можете выполнять SQL команды, которые обеспечивают следующие операции:

1. Выполнение хранимых процедур.

2. Выполнение запросов на языке сервера.

3. Создание новых баз данных, таблиц и индексов на сервере.

4. Создание и выполнение триггеров, значений по умолчанию, правил проверки ввода и хранимых процедур.

5. Поддержание бюджетов пользователей или выполнение других задач Системного Администратора.

6. Выполнение множественных операций добавления и обновления в одном наборе команд.

Для того чтобы получить доступ ко всем этим возможностям, вам необходимо наличие Администратора ODBC на вашей рабочей станции. Как правило, большинство приложений фирмы Microsoft устанавливают это приложение, если вы при установке указали, что это необходимо. Нужные драйверы, как правило, поставляются с продуктом, доступ к данным которого вы хотите иметь. Помимо этого их выпускают еще третьи фирмы. Можно написать драйвер и самостоятельно, используя ODBC SDK. После того как вы решили все эти проблемы, можете приступать к созданию хранилищ данных на выбранном сервере баз данных.

Дата добавления: 2014-01-11 ; Просмотров: 1852 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

odbc_do

(PHP 4, PHP 5, PHP 7)

Описание

Эта функция является псевдонимом: odbc_exec() .

User Contributed Notes 3 notes

To clear up: the SQL standard requires strings to be inside single quotes: ‘string’. It simply does not accept double quotes for this purpose.

Furthermore, in PHP, you can have a single quote ins » without the need to escape.

I used the following code to run normal double quotes inside my SQL queries. Hopefully this will save someone else a headache or two-

/**
* Query Function
* Allows quoted queries to be sent to SQL
*/

function query ( $query , $conn )
<
odbc_do ( $conn , ‘SET QUOTED_IDENTIFIER OFF’ );
return odbc_do ( $conn , $query );
>
?>

i have use this function so many times. it works well for my requirements. ok well done.

= «SELECT bill_no FROM SCROL» ;
$queryresult = odbc_do ( $conn , $sqlstr );
odbc_fetch_row ( $queryresult , $bills );

// if we want to access the records
// then we have to write the following code

?>

the out put for this will:

1
which is actullay first record of resultset.

Что такое код odbc_do

&nbsp На этой консультации, мы изучим механику использования ODBC API.

&nbsp Ваша программа не общается непосредственно с драйверами ODBC, она пользуется услугами менеджера ODBC. Управление работой менеджера осуществляется с помощью API функций к которым вы можете обращатся непосредственно из своей программы, вы должны только подключить odbc32.inc и odbc32.lib, а так же windows.inc.

&nbsp Шаги которые необходимо предпринять для соединения с базой данных следующие:

  1. Получить идентификатор окружения. Вам нужно делать это только один раз за ODBC-сеанс. Как только вы получите идентификатор, вы сможете модифицировать свойства окружения так, чтобы они удовлетворяли вашим требованиям. Вы можете понимать этот шаг как создание некой рабочей области.
  2. Указать какую версию ODBC ваша программа хочет использовать. Вы можете выбрать между версиями ODBC 2.x и 3.x. Они различны во многих аспектах, поэтому этот шаг — необходим. Таким образом менеджер ODBC сможет решить какой синтаксис он должен использовать, чтобы связаться с вашей программой и проинтерпретировать её команды.
  3. Выделить память для идентификатора соединения. Этот шаг можетрассматриватся как создание пустого соединения. Вы не обязаны определять нужный для соединения с базой данных драйвер.
  4. Установить связь. Вы вызываете функцию ODBC, чтобы установить связь.

&nbsp Когда вы закончите работу с базой данных, вы должны закрыть связь с ней следующим образом:

  1. Отключится от источника данных
  2. Уничтожить идентификатор соединения
  3. Уничтожить идентификатор окружения (если вы нежелаете использовать это окружение для других соединений)

ВЫДЕЛЕНИЕ ПАМЯТИ ДЛЯ ИДЕНТИФИКАТОРА

&nbsp В версиях ODBC до 3.x, вам нужно вызывать отдельные функции, чтобы выделить память для идентификатора окружения, соединения иинструкции (SQLAllocEnv, SQLAllocConnect, SQLAllocStmt). Теперь под ODBC 3.x все функции заменяются SQLAllocHandle , которая имеет следующий синтаксис:

&nbsp Вышеуказанный синтаксис может утомить ваш взор, поэтому мы его немного упростим.

&nbsp SQLRETURN определен как тип SQLSMALLINT, SQLSMALLINT определен как короткое целое, т.e. слово (16 бит). Таким образом функция возвращает выходную величину в ax, а не в eax, что является очень важным. Однако параметр передаётся функции под Win32 в 32-битном стеке. Поэтому, даже если параметр определён как словный (16-бит) вы должны его расширить до 32-бит. Вот почему HandleType — dword вместо word. Вы можете cвериться с библиотекой импорта: odbc32.lib . Вход для SQLAllocHandle это _SQLAllocHandle@12 . Эта запись означает, что комбинированный размер параметров составляет 12 байт (3 слова). Тем не менее, это не означает, что функциональный прототип C — неверный. SQLAllocHandle будет только использовать младшее слово HandleTypeи игнорировать старшее слово. Таким образом функциональный прототип C — корректен пока наш asm-функциональный прототип соответствует сказанному выше.

&nbsp С типом SQL разберёмся более обстоятельно. Рассмотрим входные функциональные параметры и обратную величину.

    HandleType — константа, которая определяет тип идентификатора, для которого вы хотите распределить памать. Возможные величины:
SQL_HANDLE_ENV идентификатор окружения
SQL_HANDLE_DBC идентификатор соединения
SQL_HANDLE_STMT идентификатор запроса
SQL_HANDLE_DESC идентификатор дескриптора

Дескриптор — это коллекция метаданных, которые описывают параметры инструкций SQL или столбцов с набором результатов, которые обрабатываются приложением или драйвером.

&nbsp Возможные возвращаемые значения SQLAllocHandle могут быть:

&nbsp

SQL_SUCCESS Функция завершена успешно
SQL_SUCCESS_WITH_INFO Функция завершена успешно, но с предупреждением
SQL_ERROR Функция потерпела неудачу.
SQL_INVALID_HANDLE Идентификатор переданный функции, недействителен

&nbsp Выполнилась ли функция успешно или потерпела неудачу, вы можете получить подробную информацию относительно этого, вызывая SQLGetDiagRec или SQLGetDiagField . Они играют ту же самую роль, что и GetLastError в Win32 API.

ВЫБОР ВЕРСИИ ODBC

&nbsp После выделения памяти для идентификатора окружения вы должны установить атрибут окружения, SQL_ATTR_ODBC_VERSION , в соответствующее значение. Установка значения атрибута окружения делается, вызовом SQLSetEnvAttr . К настоящему времени вы должны знать, что имеются также функции SQLSetConnectAttr и SQLSetStmtAttr . SQLSetEnvAttr определена как:

  • EnvironmentHandle. Содержит идентификатор окружения, атрибут которого вы хотите установить.
  • Attribute. Константа, которая представляет атрибут, который выхотите установить. Для нашей цели, это — SQL_ATTR_ODBC_VERSION . Вы можете искать полный списокв MSDN.
  • ValuePtr. Значение этого параметра зависит от атрибута, который вы хотите установить. Если атрибут — 32-разрядное значение, этот параметр обрабатывается как значение, которое вы хотите установить. Если атрибут — текстовая строка или двоичный буфер, то это интерпретируется как указатель на строку или буфер. Если вы определяете SQL_ATTR_ODBC_VERSION , то имеются два возможных значения, которые вы можете использовать: SQL_OV_ODBC3 и SQL_OV_ODBC2 , для ODBC версий 3.x и 2.x соответственно.
  • StringLength. Размер значения, указанного ValuePtr . Если значение — строка или двоичный буфер, этот параметр должен быть действителен. Если атрибут, который вы хотите установить — dword, этот параметр игнорируется. С тех пор как SQL_ATTR_ODBC_VERSION атрибут содержит значение dword, вы можете передавать NULL как этот параметр.

&nbsp Список возможных возвращаемых значений идентичен SQLAllocHandle.

ВЫДЕЛЕНИЕ ПАМЯТИ ДЛЯ ИДЕНТИФИКАТОРА ПОДКЛЮЧЕНИЯ

&nbsp Этот шаг подобен выделению памяти для ид. окружения, вы также вызываете SQLAllocHandle , но передаёте другое значение параметра.

&nbsp Теперь мы готовы сделать попытку фактического подключения к источнику данных через выбранный ODBC драйвер. Имеются фактически три функции ODBC, которые мы можем использовать, чтобы достичь этой цели. Они предлагают различную степень «выбора», который вы можете сделать.

&nbsp

SQLConnect Ядро Это — самая простая функция. Требуется только DSN (название источника Данных) и необязательное название пользователя и пароль. Она не предлагает интерфейса GUI типа подсказки пользователю в виде диалого окна для получения дополнительной информации. Вы должны использовать эту функцию, если вы уже имеете DSN для заданной базы данных.
SQLDriverConnect Ядро Эта функция предлагает более широкий спектр услуг чем SQLConnect. Вы можете соединяться с источником данных, который не определен в системной информации, то есть без DNS. Кроме того, вы можете определить, отобразит ли эта функция диалоговое окно, запрашивающее пользователя для получения дополнительной информации. Например, если вы опустили имя файла базы данных, она будет инструктировать ODBC драйвер об отображении диалогового окна, запрашивающего пользователя выбрать базу данных, для соединения с ней.
SQLBrowseConnect Уровень 1 Эта функция предлагает перечисление источников данных во время выполнения. Она обеспечивает более гибкий интерфейс в сравнении с SQLDriverConnect, потому что вы можете вызывать SQLBrowseConnect неско раз последовательно, каждый раз запрашивая пользователя для получения более конкретной информации, пока наконец вы не получите рабочую строку подключения.

&nbsp Я буду исследовать сначала SQLConnect. Чтобы использовать SQLConnect, вы должны знать кое-что относительно DSN. DSN расшифровывается как Название Источника Данных, т.е. это строка, которая уникально идентифицирует источник данных. DSN идентифицирует строение данных, которое содержит информацию о том, как соединиться с удельным источником данных. Информация включает и то, какой ODBC-драйвер использовать и с какой базой данных соединиться. Вы создаете, изменяете и удаляете DSN, используя 32-разрядного ODBC Администратора в панели управления.

&nbsp SQLConnect имеет следующий синтаксис:

  • ConnectionHandle. Идентификатор подключения который вы хотите использовать.
  • pDSN. Указатель на DSN-строку.
  • DSNLength. Длина DSN-строки.
  • pUserName. Указатель на строку содержащую имя пользователя.
  • NameLength. Длинна строки содержащей имя пользователя.
  • pPassword. Указатель на строку содержащую пароль ассоциированный с данным именем пользователя.
  • PasswordLength. Длина пароля

&nbsp По минимуму, SQLConnect требует идентификатор соединения, DSN и их длинну: имя пользователя и пароль необязательны, если источник данных не требует их. Список возможных возвращаемых значений идентичен таковому SQLAllocHandle. Предположим мы имеем DSN называемый «Продажи» в нашей системе, и мы хотим соединиться с ним. Мы можем сделать это следующим образом:

&nbsp Один из недостатоков SQLConnect — то, что, вы должны создать DSN прежде, чем сможете соединяться с источником данных. SQLDriverConnect предлагает более гибкий вариант. Она имеет следующий синтаксис:

  • ConnectionHandle. Идентификатор соединения.
  • hWnd. Дескриптор вашего окна. Если вы передадите NULL как параметр, драйвер не будет запрашивать пользователя для получения дополнительной информации (если необходимо).
  • pInConnectString.Указатель на строку подключения. Это — ASCIIZ строка, которая отформатирована, согласно специфике ODBC драйвера, с которым вы хотите соединиться. Она описывает название драйвера и источника данных а так же некоторые дополнительные параметры. Полное описание строки подключения можно найти в MSDN. Здесь я не буду углублятся в подробности.
  • InStringLength. Длина строки соединения.
  • pOutConnectString. Указатель на буфер, который будет заполнен законченной строкой подключения. Размер этого буфера должен быть по крайней мере 1,024 байта. Это может звучать запутывающе. Если строка подключения, которую вы передаёте функции, не закончена, то в этом случае, ODBC драйвер может запрашивать пользователя для получения дополнительной информации. ODBC драйвер в этом случае создает законченную строку подключения из всей располагаемой информации и помещает её в буфер. Даже если строка подключения, которую вы составили, была функциональна, этот буфер будет заполнен большим количеством атрибутов. Цель этого параметра — сохранить законченную строку подключения для будущего подключения.
  • OutBufferSize. Размер буфера, указанного pOutConnectString.
  • pOutConnectStringLength. Указатель на dword переменную, которая получит фактическую длину законченной строки подключения, возвращенной ODBC драйвером.
  • DriverCompletion. Флаг, который определяет запросит ли ODBC менеджер/драйвер пользователя для получения дополнительной информации. Однако, флаг зависит от того, передаёте ли вы дескриптор окна hWnd параметру SQLDriverConnect. Если вы не делали этого, ODBC менеджер/драйвер не будет запрашивать пользователя, даже если этот флаг инструктирует об этом.
SQL_DRIVER_PROMPT ODBC драйвер запрашивает пользователя относительно информации. Эта информация используется для создания строки подключения.
SQL_DRIVER_COMPLETE
SQL_DRIVER_COMPLETE_REQUIRED
ODBC драйвер запросит пользователя только, если строка подключения, составленная в вашей программе не закончена.
SQL_DRIVER_NOPROMPT ODBC драйвер не будет запрашивать пользователя для получения дополнительной информации.

РАЗЪЕДИНЕНИЕ С ИСТОЧНИКОМ ДАННЫХ

&nbsp После того, как подключение сделано успешно, вы можете создать одну или большее количество инструкций и сделать запрос источнику данных. Я буду исследовать эту часть на следующей консультации. Пока, давайте предположим, что вы уже отработали с источником данных, и должны разъединится с ним, вызывая SQLDisconnect. Эта функция проста (Это отражение грубой и грустной действительности о том, что разрушение — намного проще чем конструкция или созидание). Требуется только один параметр, маркер подключения.

УДАЛЕНИЕ ИДЕНТИФИКАТОРОВ ПОДКЛЮЧЕНИЯ И СРЕДЫ

&nbsp После успешного разъединения вы можете уничтожить идентификаторы подключения и среды, вызывая SQLFreeHandle. Это — новая функция, вводимая в ODBC 3.x., она заменяет SQLFreeConnect, SQLFreeEnvи SQLFreeStmt. SQLFreeHandle имеет следующий синтаксис:

ODBC: подробности

Давно тому назад я рассказывал на страницах «Компьютерных вестей» о технологиях доступа к данным, предлагаемых программистам и пользователям корпорацией Microsoft. Но общих сведений для работы с конкретной технологией не хватит даже самому талантливому программисту, а потому я решил рассказать подробнее о той из них, которая лучше всего себя зарекомендовала, так сказать, на поле боя. И для начала напомню, что же такое, собственно говоря, ODBC.


Четыре буквы, что за ними?

ODBC расшифровывается как Open Database Connectivity. На русский язык это словосочетание традиционно переводится как «открытый интерфейс взаимодействия с базой данных». Фактически, это программные интерфейсы, которые обеспечивают универсальное для всех СУБД взаимодействие между ними и пользовательским приложением. ODBC — программный интерфейс (API — Application Programming Interface), независимый от языка программирования и даже операционной системы. В общем-то, это всё действительно так, поскольку доступ к библиотекам, реализующим ODBC, например, под Windows, можно осуществлять и на Delphi, и на C++, и вообще практически на чём угодно. Есть даже реализация ODBC под UNIX-подобные платформы — UnixODBC.

Интересно, что хотя сейчас многие связывают возникновение ODBC с корпорацией Microsoft, это не совсем так. Изначально технологию разработала компания X/Open. Сейчас ODBC API — международный стандарт, который основан на спецификациях CLI от X/Open и ISO/IEC.

Каким образом реализуется поддержка множества СУБД, весьма, порой, разных по своему внутреннему устройству и «родному» интерфейсу доступа? Идея, как и всё гениальное, проста: для этого используется промежуточная прослойка в виде программы-посредника, которая транслирует запросы приложения системе управления базами данных. Такая программа называется ODBC-драйвером. Для каждой СУБД нужен свой драйвер, но программисту, если он нашёл себе нужный, должно быть всё равно, кто и когда его сделал и как при этом мучился — с его точки зрения, интерфейс всех ODBC-драйверов одинаков. Хотя, в общем-то, ODBC — технология гибкая, поэтому вовсе не все возможности в данном конкретном драйвере могут быть реализованы.

Для работы с данными приложение использует структурированный язык запросов — Structured Query Language, или, сокращённо, SQL. Такова спецификация ODBC API, и именно в этом состоит секрет её популярности. SQL — самый удобный из придуманных на сегодняшний день способов манипуляции данными. Если диалект, который использует СУБД, отличается от стандартного SQL, то драйвер преобразует запрос «на лету», и программисту не придётся вникать в тонкости запросов для каждой новой версии каждой СУБД.

Драйверы могут поддерживать три уровня грамматики SQL. Минимальная грамматика поддерживается всеми драйверами — это запросы Create Table, Drop Dtable Select, Insert, Update Dearch, Delete, Search; типы данных Char,VarChar или Long VarChar. Основная грамматика состоит из минимальной и запросов Alter Table, Create Index, Drop Index, Create View, Drop View, Grant, Revoke Select, а также типов данных Decimal, Numeric, SmallInt, Integer, Real, Float, Double Precision. Третий уровень грамматики — расширенная. Это основная плюс внешние соединения, типы Bit, TinyInt, BigInt, Binary, VarVariant, Long, VarBinary, Date, Time, TimeStamp, а также пакетные операторы SQL и вызов хранимых процедур.

Помимо задачи унификации доступа к данным, ODBC попутно решает ещё одну: одновременный доступ к нескольким базам данных. Для этого, помимо самих драйверов, в архитектуре ODBC предусмотрен специальный менеджер драйверов (Driver Manager), который по-русски также называют администратором или диспетчером драйверов. Он позволяет вызывать функции драйверов из прикладного приложения таким образом, что сохраняется возможность одинаково работать с разными СУБД и при этом не волноваться по поводу таблицы указателей на функции. Общую схему архитектуры ODBC можно увидеть на иллюстрации к статье.

Конечно, найти информацию по использованию ODBC легко — например, её полно в MSDN Library. Но эта статья задумывалась как нечто, имеющее практическую пользу, поэтому, думаю, будет совсем не лишним рассказать о практических основах работы с ODBC.

Поскольку ODBC для Windows реализована корпорацией Microsoft, она включила поддержку этой технологии в свои библиотеки для разработчиков. Поэтому сейчас мы с вами воспользуемся библиотекой MFC, которая, мягко говоря, знакома всем разработчикам, имевшим дело с Visual C++. Хотя она инкапсулирует и не все функции ODBC API, её для большинства проектов будет вполне достаточно.

Для работы с ODBC понадобится включить в приложение заголовочный файл afxdb.h. Класс, который используется для работы с БД через ODBC и имеет название CDatabase. Установка соединения вызывается методом Open, который имеет великое множество параметров:

Однако большую их часть задавать зачастую не обязательно, поскольку значения по умолчанию подходят львиной доле всех ODBC-драйверов. Задать нужно самый главный параметр — первый, lpszDSN. Это строка, которая указывает имя используемого DSN. Сейчас нужно сделать небольшое отступление и объяснить, что скрывается за этими тремя английскими буквами.

В данном случае под DSN понимается вовсе не система доменных имён, которая имеет похожую аббревиатуру — DNS, а Data Source Name — имя источника данных. Фактически, DSN — это строка, по которой ODBC определяет местонахождение драйвера, его тип, а также дополнительные параметры, нужные для установки соединения. Использование строковых DSN намного удобнее, чем, например, могло бы быть использование их в виде чисел — думаю, это очевидно.

В принципе, источник данных можно и не указывать — тогда при попытке установления соединения у пользователя спросят, какой DSN использовать. И не факт, что он будет знать, как ответить на этот вопрос. Кроме того, если у вас многопользовательская база данных, то ODBC сама спросит у него логин и пароль. Но при желании можно и не перекладывать эту задачу на ODBC, а опрашивать пользователя самостоятельно, меняя параметр lpszConnect на строку вида «»ODBC;U должны быть соответствующие имя пользователя и пароль.

Для того, чтобы определить, активно ли соединение с базой данных, нужно воспользоваться методом IsOpen всё того же класса CDatabase. Метод этот никаких параметров не имеет, а возвращает значение булевского типа. Для закрытия соединения используется точно метод Close, который также не имеет параметров.

Таким образом, минимальный код для работы с БД (в качестве источника данных возьмём, например, навевающий ностальгию Microsoft Access 97) будет иметь следующий вид:

В классе CDatabase есть метод, позволяющий узнать параметры уже установленного соединения. Называется он GetConnect, параметров не имеет и возвращает все параметры соединения в том же виде, в каком они устанавливаются методом Open (т.е. на выходе этого метода будем иметь строку вида «параметр1=значение1; параметр2=значение2; параметр3=значение3»). Аналогичным образом получается имя базы данных, с которой установил соединение драйвер, только для этого используется метод GetDatabaseName. Для проверки прав данного пользователя на внесение изменений в базу данных используется булевский метод CanUpdate.

Отдельно стоит упомянуть о транзакциях. Они, конечно же, в ODBC имеются, но только не все драйверы их могут поддерживать. Для того, чтобы узнать данную возможность конкретного драйвера, нужно воспользоваться методом CanTransact, который не имеет параметров и возвращает значение булевского типа. В случае, если драйвер признался, что транзакции он всё же поддерживает, то, чтобы их реализовать, перед внесением изменений в БД нужно вызывать метод BeginTrans, а после — CommitTrans для подтверждения транзакции, либо Rollback для её отмены. Все эти методы параметров не имеют и выдают после своей работы булевское значение, которое характеризует успешность их выполнения.

Обо всём мы с вами уже успели поговорить, кроме самого важного — то есть, непосредственной работы с данными. Для неё нам понадобится класс CRecordset, который и занимается выполнением SQL-запросов. При создании экземпляра этого класса конструктору в качестве параметра нужно передать экземпляр класса CDatabase. Далее для создания таблицы на основе SQL-запроса нужно воспользоваться методом Open.

Однако, углубившись в практику, я забыл, что хотел подробнее рассказать об одном аспекте, который уже упоминал выше.

Глядя на примеры с MFC и на периодические упоминания корпорации Microsoft, можно и забыть о том, что ODBC — технология, вообще-то, кросс-платформенная. Вот потому и хочу я чуть подробнее рассказать о проекте UnixODBC.

Цель проекта unixODBC, по словам самих его участников, состоит в том, чтобы разрабатывать и поддерживать unixODBC — API, который призван стать стандартом для ODBC на не-Windows системах. Задача осложняется тем, что реализация ODBC для Windows содержит множество расширений, не предусмотренных стандартом, и их тоже нужно реализовывать. Наилучшие результаты пока что достигнуты в написании UnixODBC под Linux. Библиотеки unixODBC распространяются согласно лицензиям GPL и LGPL, и последняя лицензия для библиотек позволяет применять их в коммерческом программном обеспечении с закрытыми исходными текстами.

В настоящий момент, помимо непосредственно библиотек, в рамках проекта написана масса полезных для разработчика утилит и драйверов. Найти всё это можно по адресу www.unixodbc.org. Русскоязычная документация по UnixODBC в Интернете практически отсутствует, если не учитывать некоторое число обзорных статей. Но англоязычной документации много, и, кроме того, для программиста UnixODBC схож с ODBC для Windows. А вот администраторам, конечно, придётся покорпеть над английскими «мануалами».

Однако, если unixODBC очень похожа на ODBC из Windows, то другая технология, очень созвучная по названию той, которую мы с вами сейчас рассматриваем, внутри отличается кардинально.


JDBC — совсем не ODBC для Java!

Есть у компании Sun Microsystems торговая марка JDBC. Согласитесь, звучит похоже на ODBC. И есть соблазн считать JDBC реализацией ODBC для языка Java. Однако это совсем не так на самом-то деле. Хотя JDBC очень похожа на ODBC идейно, это совсем другая технология.

JDBC, как и ODBC, основана на концепции драйверов, позволяющих получать соединение с базой данных по специально описанному URL. Загрузившись, драйвер сам регистрирует себя и вызывается автоматически, когда программа требует URL, содержащий протокол, за который драйвер «отвечает». Соединение с базой данных описывается классом, реализующим интерфейс java.sql.Connection. Имея соединение с базой данных, можно создавать объекты типа Statement, служащие для исполнения запросов к базе данных на языке SQL.

Однако драйверы для ODBC в общем случае не подходят для JDBC, хотя есть и такие драйверы, которые совмещают в себе функции для обеих технологий.

Адепты Java говорят, что JDBC позволяет писать приложения быстрее, чем ODBC из-за того, что сам интерфейс объектно-ориентирован. Однако если использовать MFC и другие оо-библиотеки, то можно так же быстро писать приложения и на других языках программирования.

Кто-то может сказать, что ODBC, созданная ещё в 1991 году, уже устарела морально. Однако востребованность этой технологии опровергает все доводы её противников. До сих пор продолжают разрабатываться приложения, которые поддерживают работу с СУБД через ODBC. И их появляется гораздо больше, чем, скажем, для ADO.NET.

На мой взгляд, использовать в своих программах такой проверенный временем интерфейс доступа к данным вполне разумно. Объектно-ориентированные библиотеки-обёртки, которых для ODBC написано немало, делают скорость разработки совсем не маленькой. Так что изучайте ODBC, и удачи вам в этом не таком уж и простом деле.

Что такое код odbc_do

Wikimedia Foundation . 2010 .

Смотреть что такое «ODBC» в других словарях:

ODBC — [Abk. für Open Database Connectivity, dt. »Vernetzung für offene Datenbanksysteme«], eine von der SQL Access Group (SAG) unter der Federführung von Microsoft entwickelte standardisierte Anwendungsprogrammierschnittstel … Universal-Lexikon

ODBC — son las siglas de Open DataBase Connectivity, un estándar de acceso a Bases de Datos desarrollado por Microsoft Corporation, el objetivo de ODBC es hacer posible el acceder a cualquier dato de cualquier aplicación, sin importar qué Sistema Gestor … Enciclopedia Universal

ODBC — (Open Database Connectivity) standard developed by Microsoft that enables users to access data from within any application regardless of the type of database management system used (Computers) … English contemporary dictionary

ODBC — In computing, ODBC (Open Database Connectivity) is a standard C interface for accessing database management systems (DBMS). The designers of ODBC aimed to make it independent of database systems and operating systems. An application can use ODBC… … Wikipedia

ODBC — Open Database Connectivity (ODBC, dt. etwa: „Offene Datenbank Verbindungsfähigkeit“) ist eine standardisierte Datenbankschnittstelle, die SQL als Datenbanksprache verwendet. ODBC bietet also eine Programmierschnittstelle (API), die es einem… … Deutsch Wikipedia

ODBC — Open Database Connectivity Open DataBase Connectivity (ODBC) est un ensemble API/pilote permettant la communication entre des clients de bases de données et les systèmes de gestion de base de données du marché. En 1992, un sous comité du SQL… … Wikipédia en Français

ODBC — Abk. für Open DataBase Connectivity; unter Windows bereitgestellte Schnittstelle für Anwendungen, die Zugriffe auf Datenbanken realisieren wollen. Der Vorteil von ODBC besteht in der Unabhängigkeit der Anwendungsprogrammierung von der zugrunde… … Lexikon der Economics

ODBC — Open Data Base Connectivity (Computing » General) … Abbreviations dictionary

ODBC — open database connectivity … Medical dictionary

ODBC — Open DataBase Connectivity Tool von EXCEL/Microsoft zum SQL Datenbankzugriff … Acronyms

Программное управление источниками данных ODBC

Введение

Тема нашего сегодняшнего разговора — ODBC. Если вы хоть раз писали СУБД (системы управления базами данных), то вам, наверное, знакома эта аббревиатура. Расшифровывается ODBC как Open DataBase Connectivity (вольный перевод — открытая система связи с базами данных). Open (открытая) в данном случае означает «расширяемая», «легко наращиваемая», «открытая для модификаций». Вы сами это поймете, если посмотрите на архитектуру построения ODBC:

Как легко заметить, она действительно легко наращиваемая. Для добавления нового типа БД нужно лишь написать драйвер и зарегистрировать его. Еще одно преимущество, вытекающее из такого построения ODBC — пользовательское приложение общается с физической БД через менеджер драйверов, фактически ничего не зная о типе используемой БД (общение менеджера драйверов и самих драйверов более менее стандартно, так что с точки зрения пользователя все источники данных обладают практически одинаковыми свойствами). Таким образом, вы легко можете поменять физический тип базы данных, а приложение даже не узнает об этом (конечно, существуют исключения из-за особенностей поддержки языка SQL различными типами БД, но они несущественны).

Физически ODBC представляет собой набор динамических библиотек DLL, которые обслуживают подключение и работу с конкретным типом базы данных.При запросе на подключение к определенной, заранее описанной базе «активизируется» определенная DLL — драйвер этого типа БД. Обращение к определенной базе данных происходит по имени так называемого источника данных ODBC (или DSN — data source name). Можно представить DSN как своего рода объявление БД на данном компьютере, причем DSN может быть пользовательским, т.е. находится в области видимости только одного польователя, в сеансе которого был создан этот DSN, и системным, т.е. видимым всеми пользователями данного компьютера.

Управление источниками данных ODBC (да и вообще настройкой всей системы ODBC) осуществляется с помощью специальной программы — ODBC-администратора. Давайте разберем, где его можно найти в различных версиях Windows:

— Windows 9х — сам исполняемый файл odbcad32.exe лежит в каталоге Windows\System. Запускать его можно напрямую либо через Панель управления (значок «Источники данных ODBC (32-бит)»). Если на компьютере установлен BDE, запустите администратор BDE и из меню Object выберите пункт ODBC Administrator.

— Windows 2000 — исполняемый файл odbcad32.exe лежит в каталоге WinNT\System32, а запускать его можно через Панель управления -> Администрирование -> Источники данных ODBC. К сожалению, у меня нет возможности проверить, как с ODBC в NT3.51 / 4 — не думаю, что там ребята из Microsoft сильно его спрятали.

Почему ODBC?

Ведь есть же BDE, скажете вы. Да, возможно вы правы. Однако здесь есть «но». У обоих движков есть свои преимущества и недостатки. ODBC намного лучше работает с «родными, от Microsoft» источниками данных продуктов Microsoft Office — типа Access, Excel, MS SQL Server (вообще-то из-за Access я и затеял всю эту писанину). Кроме того, в стандартный дистрибутив BDE, который можно на каждом шагу найти в Интернете, я что-то ни разу не встречал SQL Links, впрочем, как я ни разу не встречал и отдельного дистрибутива SQL Links. А именно после установки SQL Links в BDE появлется возможность создавать алиасы к Access, MS SQL Server, Oracle и др. типам баз данных. Устанавливать же полную версию C++Builder или Delphi на компьютер пользователя может не каждый. А ODBC на «голой» машине уже содержит драйверы Access, Excel, FoxPro и SQL Server. В общем, для общего развития не помешает освоить и ODBC, тем более что access’овские базы, с которыми мы будем работать через ODBC, очень надежны (не в пример стандартным BDE’шным paradox’овым, у которых то и дело сыпятся индексы, а про такое поле как счетчик я вообще молчу), практически на любом компьютере пользователя установлен Office, что позволяет вносить коррективы «на месте», да и удобство всей базы в одном файле тоже иногда сказывается.

Фнукции, с которыми нам придется работать

Естественно, я не буду рассказывать обо всех функциях, с помощью которых можно сделать с ODBC все, что угодно. Поверьте, их очень много. Нам же для нашей практической задачи достаточно будет всего четырех:

1. Функция SQLDataSources возвращает список всех источников данных ODBC.

  • hEnv — хэндл, возвращаемый функцией SQLAllocEnv();
  • fDirection — задает режим работы. Может принимать значения SQL_FETCH_FIRST — вернуть первую запись и SQL_FETCH_NEXT — вернуть следующую запись. Логика работы аналогична функциям FindFirst и FindNext (помните DOS?);
  • szDSN — указатель на буфер длиной не менее cbDSNMax, куда будет записано имя источника данных;
  • cbDSNMax — длина буфера szDSN;
  • pcbDSN — указатель на целое, куда записывается реальная длина (не включая завершающий \0) принятого имени источника данных;
  • szDescription — указатель на буфер длиной как минимум 255 символов, куда запистывается описание принятого источника данных;
  • cbDescriptionMax — длина буфера szDescription;
  • pcbDescripton — указатель на целое, куда записывается реальная длина описания источника данных.

2. Функция SQLConfigDataSources добавляет, изменяет или удаляет указанный источник данных.

  • hwndParent — хэндл родительского окна. Если не равен NULL, отображается стандартный для данного типа источника данных диалог настройки.
  • fRequest — тип запрашиваемой операции. Может принимать следующие значения:
    • ODBC_ADD_DSN (ODBC_ADD_SYS_DSN) — запрос на создание нового пользовательского (системного) источника данных;
    • ODBC_CONFIG_DSN (ODBC_CONFIG_SYS_DSN) — запрос на изменение существующего пользовательского (системного) источника данных;
    • ODBC_REMOVE_DSN (ODBC_REMOVE_SYS_DSN) — удаление пользовательского (системного) источника данных.
  • lpszDriver — указатель на строку, содержащую имя драйвера, ассоциированного с конкретным типом БД;
  • lpszAttributes — указатель на строку атрибутов в форме ключевое слово — значение. Каждая такая пара должна заканчиваться символом \0, в конце строки атрибутов должен стоять двойной символ \0.

Приведем несколько примеров строки атрибутов, чтобы вам было понятно, что это такое:

Каждый драйвер «понимает» свои ключевые слова, чаще всего применяются:

Для баз данных Microsoft Access для указания имени БД вместо DATABASE используется ключевое слово DBQ.

3. Функция SQLAllocEnv создает новый хэндл для использования в других функциях и инициализирует интерфейс для работы с ODBC

hEnv — указатель на переменную, которая будет хранить созданный хэндл в случае удачного выполнения функции

4. Функция SQLFreeEnv удаляет заданный хэндл и освобождает всю память, ассоциированную с ним.

  • hEnv — хэндл, который нужно удалить

Исходный код

Сначала несколько замечаний. В C++Builder есть заголовочные файлы для работы с ODBC. Нам нужно два из них — odbcinst.h и sql.h. Добавьте строки

в начало вашего файла. Реализация функций, описанных в этих файлах, находится в нескольких DLL, лежащих в каталоге Windows\System (или WinNT\System32). В наших примерах будут использоваться две такие DLL, а именно odbc32.dll и odbccp32.dll. Чтобы подключить их к проекту, нужно проделать следующие шаги:

1. Запускаем любой досовский файл-менеджер или командную строку Windows и переходим в каталог Windows\System (WinNT\System32) и находим эти две библиотеки.

2. Если каталог BIN С++Builder’а прописан в переменной окружения PATH, просто набираем

иначе набираем полностью путь к файлу implib.exe, либо копируем его в каталог, прописанный в PATH.

3. То же самое проделываем с odbccp32.dll:

4. Полученные .lib — файлы копируем в каталог с проектом

5. Из меню Project выбираем пункт Add to Project. и поочередно добавляем odbc32.lib и odbccp32.lib.

Все, теперь система сама загрузит эти DLL во время запуска программы.

Пример 1: Получаем список уже созданных источников данных ODBC.

Этот фрагмент кода просто перебирает все уже созданные источники данных. В первой строке фрагмента после объявления переменных создается хэндл текущего сеанса работы с ODBC, затем выбирается первое имя DSN. Если первое имя успешно прочитано (retCode содержит константу SQL_SUCCESS), то в цикле выбирается следующий DSN и т.д. до тех пор, пока не будет прочитан последний DSN. Если на место комментария вставить код (ListBox1 -> Items -> Add(DSNName)), добавляющий прочитанное имя в ListBox, например, то вы сможете просмотреть весь этот список. А если на место комментария вставить что-нибудь типа

то мы проверим, сможет ли наша программа работать нормально.

Пример 2: Создаем новый источник данных.

В этом примере вы узнаете, как создать системный DSN для базы данных Access. Предположим, файл с БД лежит в том же каталоге, что и программа, а его имя — db1.mdb.

Как видите, здесь уже не нужны хэндлы и код достаточно ясный. В первых трех строках — дописываем в строку атрибутов путь к файлу БД. Затем собственно создаем источник. Обработка ошибок тривиальна.

Важное замечание: При создании DSN если такое имя уже есть, то не возвращается ошибка, а создается DSN с текущими параметрами.

Пример 3: Как все это собрать воедино и использовать в программе

Здесь кода не будет, здесь будет описание. Итак, у нас есть программа, которой нужно «присоединиться» к базе Microsoft Access, лежащей совсем рядом, в текущем каталоге. На машине пользователя нам не нужно ничего, кроме стандартного набора bpl и BDE. Но — теперь не нужны SQL Links, можно использовать, например, Install Shield, можно взять отдельный дистрибутив BDE. Поехали:

1. На основную форму проекта кидаем компоненту TDatabase. Устанавливаем ее свойства: LoginPrompt — false, DatabaseName — dbMain, AliasName — c2a (имя источника данных ODBC). Во всех компонентах TQuery или TTable свойство Database Name будет равно dbMain. Конечно, можно не использовать компоненту TDatabase, а в TQuery или TTable прямо указывать имя источника данных ODBC, но представьте, если вы написаи проект формочек на двадцать-тридцать, а потом решили, что имя источника ‘MySuperDSN’ не в полной мере отражает всю вашу крутость :-) Изменять свойство у полусотни компонент — очень муторное занятие, поверьте.

2. В конструкторе основной формы прописываем код примера №1, вставляя на место комментария следующий код:

а после цикла — такой фрагмент:

3. Функция NewDSN() полностью повторяет код примера №2.

Теперь при первом запуске программы будет создан источник данных ODBC Microsoft Access с именем c2a, ссылающийся на файл db1.mdb, лежащий в том же каталоге, что и программа.

4. На всякий непредвиденный случай (если вы переместили программу в другой каталог, поменялась буква диска или сетевое имя, где лежит база данных) можно в программе предусмотреть немедленное перезаписывание DSN по горячей клавише, что-то типа такого:

Здесь для перезаписи DSN используется комбинация Alt-Ctrl-F1

Как создать запись DSN ODBC с помощью С#?

Я работаю над устаревшим приложением с расширенной хранимой процедурой С++. Этот xsproc использует ODBC для подключения к базе данных, что означает, что для него требуется настройка DSN.

Я обновляю установщик (созданный с помощью проекта установки Visual Studio 2008) и хочу иметь настраиваемое действие, которое может создать запись ODBC DSN, но я стараюсь найти полезную информацию в Google.

Может ли кто-нибудь помочь?

Я фактически решил это сам в конце, манипулируя реестром. Я создал класс, содержащий функции, содержание которых я здесь включил:

Исходный код ODBC

Сначала несколько замечаний. В C++Builder есть заголовочные файлы для работы с ODBC. Нам нужно два из них — odbcinst.h и sql.h. Добавьте строки

в начало вашего файла. Реализация функций, описанных в этих файлах, находится в нескольких DLL, лежащих в каталоге Windows\System (или WinNT\System32). В наших примерах будут использоваться две такие DLL, а именно odbc32.dll и odbccp32.dll . Чтобы подключить их к проекту, нужно проделать следующие шаги:

1. Запускаем любой досовский файл-менеджер или командную строку Windows и переходим в каталог Windows\System (WinNT\System32) и находим эти две библиотеки.

2. Если каталог BIN С++Builder’а прописан в переменной окружения PATH, просто набираем

иначе набираем полностью путь к файлу implib.exe, либо копируем его в каталог, прописанный в PATH.

3. То же самое проделываем с odbccp32.dll:

4 . Полученные .lib — файлы копируем в каталог с проектом

5 . Из меню Project выбираем пункт Add to Project. и поочередно добавляем odbc32.lib и odbccp32.lib .

Все, теперь система сама загрузит эти DLL во время запуска программы.

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Илон Маск рекомендует:  Asp справочные сведения по сценариям
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL