odbc data sources 32 bit что это
Средство администратора ODBC отображает как 32-битные, так и 64-битные DSNs пользователей в 64-битной версии Windows
В этой статье содержится решение проблемы, возникаемой в средстве администратора источника данных ODBC.
Оригинальная версия продукта: SQL Server
Исходный номер КБ: 942976
Симптомы
64-битная версия операционной системы Microsoft Windows включает следующие версии средства администратора источника данных ODBC (Odbcad32.exe):
В Odbcad32.exe отображаются следующие типы имен источников данных (DSNs):
Симптом 1
В 32-битной версии средства администратора ODBC отображаются 32-битные DSNs системы, 32-битные DSNs пользователей и 64-битные DSNs пользователей. В 64-битной версии средства администратора ODBC отображаются 64-битные DSNs системы, 32-битные DSNs пользователей и 64-битные DSNs пользователей.
Симптом 2
Функция возвращает все версии пользовательских SQLDataSources DSNs независимо от архитектуры приложения. Функция, которая называется в 32-битных приложениях, возвращает только системные DSNs для 32-битных драйверов, но возвращает пользовательские DSNs как для 32-битных драйверов, так и SQLDataSources для 64-битных драйверов. Кроме того, функция, которая называется в 64-битных приложениях, возвращает только системные DSNs для 64-битных драйверов, но возвращает пользовательские DSNs как для 32-битных драйверов, так и SQLDataSources для 64-битных драйверов. Поэтому, если приложение делает подключение с помощью пользовательского DSN, возвращаемой из функции, вы можете получить следующее сообщение SQLDataSources об ошибке:
Имя источника данных не найдено, а драйвер по умолчанию не указан
Например, рассмотрим следующий сценарий. Создается пользовательский DSN для 32-битного драйвера «Microsoft Access Driver (*.mdb)». Этот драйвер не имеет соответствующей 64-битной версии. Функция, вызванная в 64-битном приложении, возвращает этот SQLDataSources 32-битный пользовательский DSN. Однако, если вы сделаете подключение через этот 32-битный пользовательский DSN, вы получите сообщение об ошибке, упомянутое ранее в этом разделе.
Причина
DSNs пользователя хранятся в следующем подкайке реестра:
Перенаправление реестра не включено для этого подкайки реестра. Поэтому DSNs пользователя видны как в 32-битной, так и в 64-битной версиях средства администратора ODBC.
Решение
Для поддержания обратной совместимости решение этой проблемы в настоящее время не доступно.
Обходной путь
Дополнительные сведения
64-битный инструмент администратора ODBC можно вызвать из панели управления для управления пользовательскими DSNs и системные DSNs, которые используются в 64-битных процессах. В 64-битной операционной системе 32-битный инструмент администратора ODBC используется для Windows процессов Windows 64 (WOW64). Необходимо непосредственно вызвать 32-битный инструмент администратора ODBC из папки SysWoW64. Вы можете использовать 32-битный инструмент администратора ODBC для управления пользовательскими DSNs и системами DSNs, которые используются процессами WOW64.
Системные DSNs хранятся в следующем подкайке реестра:
Перенаправление реестра включено для этого подкайки реестра. Поэтому системы DSNs для 32-битных драйверов и для 64-битных драйверов разделены. 64-битный инструмент администратора ODBC не отображает системные DSNs, созданные 32-битным средством администратора ODBC. Кроме того, 32-битный инструмент администратора ODBC не отображает системы DSNs, созданные с помощью 64-битного средства администратора ODBC. Кроме того, 64-битный инструмент администратора ODBC не отображает системные DSNs, которые используют 32-битные драйверы. Кроме того, 32-битный инструмент администратора ODBC не отображает системы DSNs, которые используют 64-битные драйверы.
Пользовательские DSNs хранятся в следующем подкайке реестра:
Перенаправление реестра не включено для этого подкайки реестра. Поэтому оба средства администратора ODBC отображают все пользовательские DSNs.
Дополнительные сведения о перенаправлении реестра см. в перенаправлении реестра.
Программное управление источниками данных ODBC
Введение
Почему ODBC?
Фнукции, с которыми нам придется работать
Естественно, я не буду рассказывать обо всех функциях, с помощью которых можно сделать с ODBC все, что угодно. Поверьте, их очень много. Нам же для нашей практической задачи достаточно будет всего четырех:
1. Функция SQLDataSources возвращает список всех источников данных ODBC.
2. Функция SQLConfigDataSources добавляет, изменяет или удаляет указанный источник данных.
Приведем несколько примеров строки атрибутов, чтобы вам было понятно, что это такое:
Каждый драйвер «понимает» свои ключевые слова, чаще всего применяются:
Для баз данных Microsoft Access для указания имени БД вместо DATABASE используется ключевое слово DBQ.
3. Функция SQLAllocEnv создает новый хэндл для использования в других функциях и инициализирует интерфейс для работы с ODBC
4. Функция SQLFreeEnv удаляет заданный хэндл и освобождает всю память, ассоциированную с ним.
Исходный код
в начало вашего файла. Реализация функций, описанных в этих файлах, находится в нескольких 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:
5. Из меню Project выбираем пункт Add to Project. и поочередно добавляем odbc32.lib и odbccp32.lib.
Все, теперь система сама загрузит эти DLL во время запуска программы.
Пример 1: Получаем список уже созданных источников данных ODBC.
то мы проверим, сможет ли наша программа работать нормально.
Пример 2: Создаем новый источник данных.
Важное замечание: При создании DSN если такое имя уже есть, то не возвращается ошибка, а создается DSN с текущими параметрами.
Пример 3: Как все это собрать воедино и использовать в программе
2. В конструкторе основной формы прописываем код примера №1, вставляя на место комментария следующий код:
3. Функция NewDSN() полностью повторяет код примера №2.
Теперь при первом запуске программы будет создан источник данных ODBC Microsoft Access с именем c2a, ссылающийся на файл db1.mdb, лежащий в том же каталоге, что и программа.
4. На всякий непредвиденный случай (если вы переместили программу в другой каталог, поменялась буква диска или сетевое имя, где лежит база данных) можно в программе предусмотреть немедленное перезаписывание DSN по горячей клавише, что-то типа такого:
Здесь для перезаписи DSN используется комбинация Alt-Ctrl-F1
Подключение к источнику данных ODBC (мастер импорта и экспорта SQL Server)
В этом разделе показано, как подключаться к источникам данных ODBC со страницы Выбор источника данных или Выбор назначения в мастере импорта и экспорта SQL Server.
Нужный драйвер ODBC может потребоваться скачать с веб-сайта корпорации Майкрософт или другого разработчика.
Кроме того, вам может потребоваться найти сведений о подключении, которые нужно будет предоставить. На этом стороннем сайте со справочником по строкам подключения представлены примеры строк подключения и дополнительные сведения о поставщиках данных и используемых ими данных подключений.
Проверка на наличие установленного драйвера
Найдите или выберите приложение Источники данных ODBC (64-разрядное) в меню «Пуск» или панели управления. Если у вас есть только 32-разрядный драйвер или вы знаете, что вам нужен именно 32-разрядный драйвер, найдите вместо этого приложение ODBC Data Sources (32-bit) (Источники данных ODBC (32-разрядное)).
Запустите приложение. Открывается окно Администратор источников данных ODBC.
На вкладке Драйверы приведен список драйверов ODBC, установленных на вашем компьютере. (Имена некоторых драйверов могут быть указаны на нескольких языках.)
Ниже приведен пример списка установленных 64-разрядных драйверов.
Если вы знаете, что ваш драйвер установлен, но не видите его в 64-разрядном приложении, перейдите в 32-разрядное приложение. Все это также указывает, какую версию мастера импорта и экспорта SQL Server вам нужно запустить — 64- или 32-разрядную.
Чтобы использовать 64-разрядную версию мастера экспорта и импорта SQL Server, нужно установить SQL Server. SQL Server Data Tools (SSDT) и SQL Server Management Studio (SSMS) являются 32-разрядными приложениями и устанавливают только 32-разрядные файлы, включая 32-разрядную версию мастера.
Шаг 1. Выбор источника данных
Шаг 2. Указание сведений о подключении
Следующим шагом является предоставление сведений о подключении для драйвера ODBC и источника данных. Имеются две возможности.
Укажите DSN (имя источника данных), который уже существует или был создан вами в приложении Администратор источников данных ODBC. Имя DSN представляет собой коллекцию параметров, необходимых для подключения к источнику данных ODBC.
Если вы уже знаете имя DSN или сумеете его создать, можете пропустить оставшуюся часть этой страницы. Введите имя DSN в поле Dsn на странице Выбор источника данных или Выбор назначения, а затем перейдите к следующему шагу в мастере.
Укажите строку подключения, которую можно узнать в сети или создать и протестировать на компьютере с помощью приложения Администратор источников данных ODBC.
Если у вас уже есть строка подключения или вы знаете, как ее создать, можете пропустить оставшуюся часть этой страницы. Введите строку подключения в поле ConnectionString на странице Выбор источника данных или Выбор назначения, а затем перейдите к следующему шагу в мастере.
Если вы указали строку подключения, на странице Выбор источника данных или Выбор назначения отображаются все сведения о подключении, которые мастер будет использовать для подключения к источнику данных, например имя сервера и базы данных, а также метод проверки подлинности. Если вы указали имя DSN, эта информация не отображается.
Вариант 1. Указание имени DSN
Если вы хотите предоставить сведения о подключении с помощью имени DSN, используйте приложение Администратор источников данных ODBC для поиска существующего или создания нового имени DSN.
Найдите или выберите приложение Источники данных ODBC (64-разрядное) в меню «Пуск» или панели управления. Если у вас есть только 32-разрядный драйвер или вам нужен именно 32-разрядный драйвер, найдите вместо этого приложение ODBC Data Sources (32-bit) (Источники данных ODBC (32-разрядное)).
Запустите приложение. Открывается окно Администратор источников данных ODBC. Вот как это приложение выглядит.
Если вам нужно использовать существующее имя DSN для источника данных, вы можете использовать любое имя DSN, отображающееся на вкладке DSN пользователя, System DSN (Системный DSN) или DSN файла. Просмотрите имя, затем вернитесь к мастеру и введите его в поле Имя DSN на странице Выбор источника данных или Выбор назначения. Пропустите оставшуюся часть этой страницы и перейдите к следующему шагу в мастере.
Если вы хотите создать имя DSN, решите, должно ли оно быть видимым только вам («DSN пользователя»), видимым всем пользователям компьютера, включая службы Windows («DSN системы») или сохраненным в файле («Файловый DSN»). Этот пример создает имя DSN системы.
На вкладке DSN системы нажмите кнопку Добавить.
В диалоговом окне Создать новый источник данных выберите драйвер для источника данных, а затем нажмите кнопку Готово.
Драйвер теперь отображает один или несколько экранов, где можно ввести сведения, необходимые для подключения к источнику данных. (Например, для драйвера SQL Server предусмотрено четыре страницы настраиваемых параметров.) По завершении работы в списке появится новый системный DSN.
Вернитесь в мастер и введите имя DSN в поле Dsn на странице Выбор источника данных или Выбор назначения. Перейдите к следующему шагу в мастере.
Вариант 2. Указание строки подключения
Если вы хотите предоставить сведения о подключении с помощью строки подключения, дочитайте оставшуюся часть раздела до конца.
В этом примере будет использоваться следующая строка подключения, которая подключается к Microsoft SQL Server. В качестве примера базы данных используется WideWorldImporters, и мы подключаемся к SQL Server на локальном компьютере.
Введите строку подключения в поле ConnectionString на странице Выбор источника данных или Выбор назначения. После того как вы введете строку подключения, мастер проанализирует ее и отобразит отдельные свойства и их значения в списке.
Ниже показан экран, который появляется после ввода строки подключения.
Параметры подключения для этого драйвера ODBC одинаковы независимо от того, настраиваете ли вы источник или назначение. Таким образом, на страницах Выбор источника данных и Выбор назначения мастера отображаются одинаковые параметры.
Получение строки подключения в сети
Чтобы найти строки подключения для своего драйвера ODBC в сети, см. раздел Справочник по строкам подключения. На этом стороннем сайте представлены примеры строк подключения и дополнительные сведения о поставщиках данных и используемых ими данных подключений.
Получение строки подключения с помощью приложения
Чтобы собрать и проверить строку подключения для своего драйвера ODBC на локальном компьютере, вы можете использовать приложение Администратор источников данных ODBC на панели управления. Создайте файловое имя DSN для подключения, а затем скопируйте параметры из этого имени, чтобы использовать их при сборке строки подключения. Это требует выполнения нескольких действий, но позволяет проверить работоспособность строки подключения.
Найдите или выберите приложение Источники данных ODBC (64-разрядное) в меню «Пуск» или панели управления. Если у вас есть только 32-разрядный драйвер или вам нужен именно 32-разрядный драйвер, найдите вместо этого приложение ODBC Data Sources (32-bit) (Источники данных ODBC (32-разрядное)).
Запустите приложение. Открывается окно Администратор источников данных ODBC.
Перейдите на вкладку Файловый DSN приложения. Нажмите кнопку Добавить.
В рамках этого примера создайте файловое, а не пользовательское или системное имя DSN, так как файловое имя DSN сохраняет пары имя-значение в определенном формате, который подходит для строки подключения.
В диалоговом окне Создать новый источник данных выберите драйвер в списке и нажмите кнопку Далее. В этом примере будет создано имя DSN, которое содержит аргументы строки подключения, необходимые для подключения к Microsoft SQL Server.
Выберите расположение и введите имя файла для нового файлового имени DSN, а затем нажмите кнопку Далее. Запомните, куда сохраняете файл, чтобы позднее вам было легче его найти.
Просмотрите сводные данные и нажмите кнопку Готово.
После нажатия кнопки Готово выбранный вами драйвер отображает один или несколько собственных экранов, чтобы собрать необходимые для подключения сведения. Обычно эти сведения включают в себя сервер, учетные данные и базу данных для источников на основе серверов и файл, формат и версию для источников, на основе файлов.
После настройки источника данных нажмите кнопку Готово. После этого обычно отображаются сводные сведения о выбранных параметрах и предоставляется возможность протестировать их.
Проверив источник данных и закрыв диалоговые окна, найдите файловое имя DSN там, куда вы его сохранили. Если вы не изменяли расширение файла, по умолчанию используется расширение DSN.
Откройте этот файл в блокноте или другом текстовом редакторе. Ниже приведено содержимое нашего примера SQL Server.
Скопируйте и вставьте необходимые значения в строку подключения, в которой пары имя-значение разделяются точкой с запятой.
Собрав все необходимые значения из образца файлового имени DSN, вы получите следующую строку подключения.
Если вы используете приложение «Администратор источников данных ODBC», переносить все эти параметры в имени DSN для создания работающей строки подключения обычно не требуется.
Введите строку подключения в поле ConnectionString на странице Выбор источника данных или Выбор назначения мастера. Мастер анализирует строку, после чего можно двигаться дальше.
Общие замечания
Последняя версия ODBC, выпущенная в 1997 году, имеет номер 3.51; как показывает практика, для решения большинства типичных задач бывает достаточно версий 2.x, выходивших в период с 1993 по 1995 год. Заметим, что Microsoft официально прекратила развитие ODBC, предлагая в качестве замены технологию ADO (Active Data Objects), которая представляет собой ни что иное, как построенную на базе COM оболочку ядра ODBC.
В основе ODBC лежат следующие четыре понятия:
Типы данных, используемые в ODBC
SQL API (родовой тип) | SQL for C (C-псевдоним) | Тип ANSI C | Префикс в венгерской нотации |
---|---|---|---|
SQLINTERGER | SDWORD | long | sdw |
SQLUINTEGER | UDWORD | unsigned long | udw |
SQLSMALLINT | SWORD | short | sw |
SQLUSMALLINT | UWORD | unsigned short | uw |
RETCODE | — | short | sw |
— | SLONG | long | sn |
— | ULONG | unsigned long | un |
— | SSHORT | short | ss |
— | USHORT | unsigned short | us |
SQLDOUBLE | SDOUBLE | double | sd |
SQLREAL | SFLOAT | float | sf |
SQLCHAR | UCHAR | unsigned char | uc |
SQLSCHAR | SCHAR | signed char | sc |
SQLTCHAR | — | unsigned char / short | tc |
SQLPOINTER | — | void* | pv |
Порядок работы с базой данных
Рассмотрим основные шаги, которые необходимо предпринять при разработке приложения, использующего механизм ODBC для обращения к базам данных.
2. Создание дескриптора окружения
Для этого используется функция
В переменную по адресу phenv будет записан созданный дескриптор окружения. Пример использования:
3. Установление соединения
Вначале необходимо создать дескриптор соединения с помощью функции
При необходимости, после создания дескриптора назначаются характеристики устанавливаемого соединения. Для этого используется функция
Через параметр hdbc передается дескриптор соединения; параметр swOption должен содержать идентификатор характеристики, а параметр sdwValue — назначаемое ей значение. Например, для того, чтобы драйвер БД самостоятельно обслуживал результаты выполнения операторов, используется вызов
Последним шагом является собственно установление соединения, выполняемое с помощью функции
4. Выполнение оператора SQL
Вначале необходимо создать дескриптор оператора с помощью функции
Для выполнения оператора можно использовать функцию
Через параметр hstmt передается дескриптор оператора, а через параметр pStmtText — текст оператора на SQL. Параметр sdwStmtLen должен содержать длину этого текста; для строк, завершающихся двоичным нулем, указывается значение SQL_NTS.
Частным случаем оператора SQL является SQL-запрос, пример выполнения которого приведен ниже:
5. Получение информации о результатах выполнения оператора
Для получения количества колонок (полей) в результирующей таблице используется функция
Для получения атрибутов заданной колонки можно воспользоваться функцией
ODBC предусматривает следующие типы полей:
название | описание |
---|---|
SQL_UNKNOWN_TYPE | неизвестный тип |
SQL_CHAR | строка |
SQL_INTERGER | длинное целое |
SQL_SMALLINT | короткое целое |
SQL_FLOAT | 4-байтовое вещественное |
SQL_DOUBLE | 8-байтовое вещественное |
SQL_DATETIME | дата/время |
SQL_NUMERIC | числовой тип |
SQL_DECIMAL | десятичный тип |
6. Доступ к результатам выполнения оператора
Результаты выполнения любого оператора SQL ассоциируются с его дескриптором и приложение не имеет к ним непосредственного доступа. Чтобы получить значения полей в результирующей таблице необходимо предварительно связать с каждой из интересующих нас колонок переменную соответствующего типа. В терминах ODBC эта операция называется binding и выполняется с помощью функции
Еще раз подчеркнем, что каждая колонка, данные в которой нас интересуют, должна быть связана со своей собственной переменной.
После связывания всех необходимых колонок выполняется построчное чтение данных. В терминах ODBC эта операция называется fetching и выполняется с помощью функции
Через параметр hstmt передается дескриптор оператора. Каждый вызов этой функции записывает в переменные, связанные с колонками, значения соответствующих полей текущей записи, после чего делает текущей следующую запись. Функция должна циклически вызываться до тех пор, пока не будет достигнут конец результирующей таблицы (то есть, пока она возвращает значение SQL_SUCCESS или SQL_SUCCESS_WITH_INFO). Для проверки возвращаемого значения можно воспользоваться макросом
и организовать, например, следующий цикл:
7. Освобождение системных ресурсов
После завершения работы с базой данных необходимо «удалить» каждый созданный оператор с помощью функции
Через параметр hstmt передается дескриптор удаляемого оператора, а через параметр uwOption — характер удаления. Для полного освобождения системных ресурсов, занятых оператором и результатами его выполнения, необходимо сделать два последовательных вызова:
После удаления всех операторов необходимо разорвать соединение с сервером БД вызовом функции
и удалить дескриптор этого соединения с помощью функции
В обоих случаях, через параметр hdbc передается дескриптор разрываемого соединения.
Последним шагом является удаление дескриптора окружения, выполняемое при помощи функции
которой через параметр henv нужно передать подлежащий удалению дескриптор.
Заметим, что операция установления соединения с базой данных является наиболее длительной из всех, поэтому для обеспечения максимального быстродействия приложения-клиента целесообразно выполнять ее один раз (при запуске) и разрывать это соединение только перед завершением работы приложения.
Определение количества строк в результирующей таблице
Начиная с ODBC версии 3.0 можно также воспользоваться функцией
Для перемещения по строкам статического курсора можно воспользоваться универсальной функцией
Через параметр hstmt передается дескриптор оператора, параметр swType задает тип перемещения, а параметр sdwOffset — требуемое смещение в результирующей таблице (курсоре). Возможные значения последнего параметра зависят от типа перемещения и приведены ниже:
swType | sdwOffset | |
---|---|---|
значение | описание | |
SQL_FETCH_FIRST | перемещение к первой строке | игнорируется |
SQL_FETCH_LAST | перемещение к последней строке | игнорируется |
SQL_FETCH_NEXT | перемещение к следующей строке | игнорируется |
SQL_FETCH_PRIOR | перемещение к предыдущей строке | игнорируется |
SQL_FETCH_ABSOLUTE | перемещение к строке с номером sdwOffset | номер строки |
SQL_FETCH_RELATIVE | перемещение на sdwOffset строк от текущей | смещение |
Заметим, что если требуется только перемещение к соответствующей строке, то выполнять перед вызовом этой функции связывание столбцов с переменными не требуется.
Поскольку нумерация строк начинается с 1, то можно переместиться на последнюю строку и получить ее номер, который и будет соответствовать искомому значению. Для получения номера текущей строки можно воспользоваться функцией
Начиная с ODBC версии 3.0 для получения атрибута оператора можно использовать функцию
Примером получения количества строк в результирующей таблице может служить следующий код:
Получение информации об ошибках
Если проверка возвращаемого значения какой-либо функции ODBC макросом SQL_SUCCEEDED дает ложный результат, то для получения подробной информации о возникшей ошибке необходимо сразу же вызвать функцию
Заметим, что чем больше дескрипторов (первые три параметра) доступно при вызове этой функции, тем выше вероятность получения корректного сообщения об ошибке.