Odbc sql server driver не предоставлены ключевые слова dsn и server

Обновлено: 07.07.2024

Тема нашего сегодняшнего разговора - 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) - удаление пользовательского (системного) источника данных.

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

    "DSN=MySource\0UID=MyLogin\0PWD=MyPass" - источник данных с именем MySource, логин - MyLogin, пароль - MyPass

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

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

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

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

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

    Исходный код

    Сначала несколько замечаний. В 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 по горячей клавише, что-то типа такого:


    С помощью ODBC, программы могут подключаться к различным СУБД (MySQL, Microsoft SQL Server, SQLite, MongoDB и другие) и выполнять SQL-запросы.

    Как создать имя источника базы данных (DSN)

    Имя источника базы данных указывается в функции подключения ODBC.
    Например, в PHP эта функция называется odbc_connect().









    16. Готово, мы создали имя источника базы данных (DSN) и теперь мы можем использовать его в своих программах.


    Как подключаться к ODBC из PHP

    Убедитесь, что в php.ini раскомментирована строка:
    Подключаться будем с помощью функции odbc_connect().

    Есть 2 способа подключения:
    1. Указать имя источника базы данных (DSN)

    В завершении, давайте попробуем получить данные из MS SQL сервера через ODBC-подключение

    Если в проге написанной на VB6 использовать
    Con.Open "DSN=Test;UID=sa;PWD=pass"
    то все работает.
    А если я пишу в станичку ASP точно такую же строку то получаю ошибку

    [Microsoft][ODBC SQL Server Driver][Named Pipes]SQL Server does not exist or access denied.
    /a1/gbook_msg_list.asp, line 21

    Пробывал и такие строчки
    SQL = "Provider=SQLOLEDB.1;Password=pass;Persist Security Info=True;User Catalog=test3;data source=test.domain.local;network library=dbmssocn"

    И многие другие строчки

    Я вот подумал
    А может при инициализации ADODB/Connection в ASP значения по умолчанию одни а в VB6 другие? Жаль нельзя продебугить ASP страничку.

    видимо где - то стоит использовать довереное соединение (trusted connection) а аккаунт под которым работает IIS не имеет прав к SQL server

    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied.
    /a1/gbook_msg_list.asp, line 21

    Там у меня подключены TCP IP(1433) and Named Pie
    Но когда делаю Netstat - у меня нет Listen на 1433 а есть 1434 :-(
    Что бы это значило?

    Any symptoms of this or that?

    Угу - симптомы похожие, только вот там черт ногу сломит. Буду всю ночь сидеть, а хрен ли делать.

    может неправильно указываешь ?
    <SERVER_NAME> = имясервера\инстанс

    Да я и IP пробывал подставлять. Нихрена.

    Подскажите пожалуйста какой либо способ проверки доступности моего SQL сервера. Какую либо прогу в которой я мог бы ввести имя сервер а она мне скажет есть такая бяка и где сидит.

    To pin-point problem, try to run following VB script on different machines under different accounts

    cn.Open "Provider=sqloledb;Data Source=CASTLE;Initial Catalog=Pubs;Integrated Security=SSPI"

    Вот в таком виде это работает на машине на которой у меня стоит IIS

    cn.Open "Provider=sqloledb;Data Source=CASTLE;Initial Catalog=Pubs;UID=111;PWD=222;"

    И ни в каком виде это неработает на ASP страничке.
    слов нет -- одни эмоции.

    Исправления платформы, позволяющие запустить 1cv77 в клиент-серверном варианте на СУБД MS SQL 2005-2014 без понижения режима совместимости.

    dungeonkeeper пишет:
    По этому кровь из носу надо перетаскивать всю базу на SQL. Выбора у нас нет.
    Можете объяснить как-то по подробнее, только наверное не здесь.

    Ну что, поделюсь то же своим мнением.
    Сервак Win2003 x64 (замен драйверов нет), SQL 2005

    Перевел базу в режим совместимости 2005(90). В конфигураторе закрузка базы проходит, в режим предприятия тоже, но до тех пор пока не пытаешься открыть любой журнал документов или сформировать отчет!
    Ошибка:
    SQL State 42000
    Native 1018
    Incorrect syntax near 'INDEX' . a table hint, a WITH keyword

    Пытался внести изменения в конфу(для так наз реструктуризации, добавил новый реквизит у справочника - достаточно. ) - результат ТОТ ЖЕ!

    (78)ты качал 10.03.11. После этого новый вариант не скачивал? Скачивал здесь 15.04.11(версия BkEnd proxy DLL 1.0.0.5).
    Есть что-то свежее?? (80)Версия та. Открытие журнала, формирование отчета к вылету не приводят.
    Давай описание конфигурации 1с и трассу профайлера. Пару раз вопрос задавали "преимущества в использовании формата SQL 2005/8 "
    Присоединяюсь к вопросу.
    Установил Server2008r2 + sql server 2008. в базе указал режим совместимости с sql 2000 (80)
    Пробовал переводить в режим совместимости с sql 2008 (100) - в однопользовательском режиме не заметил никаких изменений.
    Что дает режим sql 2008 (100)?

    Сорри! Ввел в заблуждение(как оказалось). Оказывается вылета из 1С по причине использования "vk_Hook1C.dll".

    Подскажите где найти более подробную информацию по созданию базы на SQL 2008 для 1С7.7. С SQL 2008 не знаком, литературу очень сложно найти.

    Скачал вчера - запустил под Win 7 с SQL 2000.
    Прямой запрос через ODBCRecordSet выдает ошибку:
    State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'GETDATE'.

    (85)на каком запросе так валится?
    Точно версия релиза 1.0.0.5??

    (85) на каком запросе так валится?
    Точно версия релиза 1.0.0.5??

    Посмотрел - версия BkEnd.dll была 1.0.0.1. Поменял на 1.0.0.5 и все пошло.
    Спасибо за наводку.

    ругался именно на SQL функции GETDATE().

    ОС на сервере WinSer2008 Enterprise R2, СУБД SQL 2008 R2.
    1C77 привилась к такой среде нормально, поднимал рабочую базу из выгрузки. Выгрузка сделана с SQL 2005 базы, ну т.е. 1С Sql, не с помощью средств СУБД, а с помощью 1С.
    Есть одна база тоже скульная, тоже на SQL 2005 сидела, вот она не хочет подниматься, целую ночь загружалась в SQL 2008 и до сих пор висит, почему остальные базы загружаются, а именно одна нет. Где искать причину? Дело в том, что загрузка в SQL 2008 идет до сих пор, уже прошло порядка 18 часов, сама база на SQL 2005 весит около 980Мб это файл .mdf, а лог файл .log чуть больше 50 Мб. Выгрузка базы средствами 1С 36 Мб.

    База на SQL 2008 создана с учетом предложенных тут настроек, а все остальные по умолчанию, дело в том что не хочет грузится одна база.

    У меня аналогично. вчера стал грузить выгрузку с DBF базы на SQL Express 2008, тоже застряла близко к концу (судя по размеру MDF файла)
    Причем глядя на список процессов видно было загрузку на SQL сервере и практически полное бездействие на 1c.
    На другой машине (собрал в виртуалке с нуля для проверки) всё залилось.
    Думается мне тут есть тлетворное влияние разных версий DLL

    Подскажите есть обработки которые позволяют изменить ДАТУ ДОКУМЕНТА не проводя его? Документ уже проведен и не хочется перепроводить его. Ответ: Нельзя изменить атрибут ДатаДок у проведенного документа, надо сделать не проведенным.

    Подскажите есть обработки которые позволяют изменить ДАТУ ДОКУМЕНТА не проводя его? Документ уже проведен и не хочется перепроводить его. Ответ: Нельзя изменить атрибут ДатаДок у проведенного документа, надо сделать не проведенным.

    Я бы вам (и всем) посоветовал перед началом выгрузки данных из 1С открыть общий журнал документов, установить начало периода пустым, а не как вы предлагаете "01.01.0000". Столкнулся с те ми же проблемами.
    Перенос бызы, точнее ее загрузка в SQL занимала около 10 часов. Периодически заглядывая на экран обнаружил что идет пересчет перектрестных ссылок начиная с даты "01.01.1753" по каждому документу. Стал копать. Обнуружил что в базе присутствуют два документа без даты !.При чем давность этих документов порядка двух-трех лет. Как умудрились сохранить такие документы мне не понятно, программа этого не позволяет. Как вариант это могло произойти в результате какого-то сбоя.
    Так что проверяйте.
    Причем если вы всетаки загрузите такие данные, я вам не завидую, потому что пересчет итогов вас неприятно удивит своей продолжительностью ;) по той же причине.

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