Ошибка sqlsetconnectattr для драйвера

Обновлено: 08.07.2024

I made sure that the Oracle client tools are installed ont he SQL Server 2000 already and also the ODBC connections are there, but I am still receiving the following error:

Error = -2147467259 (80004005)

Error string: [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed

Error source: Microsoft OLE DB Provider for ODBC Drivers

Error Detail Records:

Error: -2147467259 (80004005); Provider Error: 0 (0)

Error string: [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed

Error source: Microsoft OLE DB Provider for ODBC Drivers

Error: -2147467259 (80004005); Provider Error: 12154 (2F7A)

Error string: [Microsoft][ODBC driver for Oracle][Oracle]ORA-12154: TNS:cou. Process Exit Code 1. The step failed.

I am seeking assistance here because I have tried and searched all over the place for the solution (MS Site, Tek-Tips, and other forums), but no luck. Can anyone please tell me what is occurring here? It seems to be that the ODBC connections are not set on that machine, correct? Or is it something else? Just to make sure, I reconfigured those ODBC connections and the machine and then tried the Jobs again but they failed! Should I have restarted SQL Server after these simple ODBC changes?

I would greatly appreciate any help.

March 4, 2004 at 3:11 pm

First, I don't know the answer specifically.

Some ruminations. SQL Server has the ability to communicate (send/receive data) via serveral communications links. I.e. TCP/Ip, Named pipes, etc.

For a given server, you define what communications links that SQL server is going to support. Normally communication links not needed are not supported.

A client is in some ways similiar. Meaning you define on a client what communication links are going to be supported to SQL Server.

Is it possible that there is a mis-match on what communication link is being supported between the client and server?

March 4, 2004 at 3:18 pm

How did you tested the ODBC DSN ?

March 4, 2004 at 3:19 pm

I don't think this is the problem since the client (my workstation) has the same Oracle Client Tools and ODBCs (communication links) as the server does. Is this what you mean by 'communication links'? My links are the ODBCs I have set.

March 4, 2004 at 3:24 pm

Try doing a link server to the oracle server, see if you can get there from there. Could be a RPC issue

March 4, 2004 at 3:24 pm

Excuse my ignorance, but how I can test the ODBC DSNs I have set for Oracle to make sure they do indeed work from the server?

March 4, 2004 at 3:28 pm

1. Make sure they are set up as System DSN not User DSN

2. Create a linked server as expressed above by John Zacharkan

3. see if you can connect

March 5, 2004 at 2:44 pm

I am getting the same error message

(Error string: Error Code: 0 Error Source= Microsoft OLE DB Provider for Oracle Error Description: Error while trying to retrieve text for error ORA-12154 Help context: 4500 Error: -2147467259 (80004005);Provider Error: 12154 (2F7A)).

The DTS packages will run when executed from the design window. But not when run as a job. I have defined SYSTEM Data Sources Not User Data Sources.

March 5, 2004 at 2:54 pm

The data sources need to be set up on the server when run as a job. When running from the designer, the job processes on the local machine (where the designer is running).

March 5, 2004 at 4:09 pm

Thanks to everyone that has participated in this discussion in trying to solve my problem. I am a bit astonished as to the lack of documentation on setting linked servers via SQL Server to Oracle sources. I have perused numerous URLs and forums since early yesterday morning, and still can't seem to find a proper solution. I also have 3 MS Press books and one other one on SQL Server and all of these skim the subject of linked servers!

This is what I do know and have done (hopefully it'll help you experts out more in assisting me):

1. On my client PC's EM, I can successfully run DTS jobs that query both of my Oracle sources with no problems.

2. On my PC, with MS Access, I can successfully link to those Oracle sources via ODBC after I installed Oracle Client Tools. This is utilizing the driver Oracle73 , version 2.05.03.01, company Oracle Corporation and file SQL32_73.DLL.

3. Once the jobs are scheduled, the jobs fail on the SQL Server because what is listed below (I believe):

4. I recently installed the same Oracle Client Tools and ODBCs onto the SQL Server, but haven't rebooted yet (will do this tonight). Is rebooting necessary for SQL Server to recognize the new Oracle installations? None of my references say to do this, but I read in one place on the web, thus I will try this.

5. On the server's EM, I picked the Linked Servers node and chose New Linked Server with the following settings:

a. Linked Server: DATA1.ORACLE

b. Provider name: Oracle Provider for OLE DB (is this correct??)

c. Product name: Oracle 7.3

d. Data source: I picked the same name that was located in the TNS.ORA file by the SID attribute, e.g. DATA123

e. Provider string: . don't know what exactly goes here; I have seen tons of examples, but don't know how to access this data; I have also heard of aliases for this attribute and don't know exactly what to do?

I have tried different combinations of attributes but nothing seems to work. I believe it is the Provider Name I am picking. Will rebooting the system have Oracle73 in the drop-down? How about the Provider String?

I would like to thank everyone who has taken the time to look at this thread and their attempt at assisting me. I greatly appreciate everyone's help.

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

Процесс подключения отличается. Когда приложение вызывает функцию SQLAllocHandle с параметрами SQL_HANDLE_ENV и SQL_HANDLE_DBC, функция выделяет дескрипторы только в диспетчере драйверов. Диспетчер драйверов не вызывает эту функцию в драйвере, так как не знает, какой драйвер следует вызывать. Аналогичным образом, если приложение передает маркер неподключенного подключения к SQLSetConnectAttr или SQLGetConnectAttr, функция выполняется только диспетчером драйверов. Он сохраняет или получает значение атрибута из своего обработчика соединения и возвращает значение SQLSTATE 08003 (соединение не открыто) при получении значения для атрибута, который не был задан и для которого ODBC не определяет значение по умолчанию.

Когда приложение вызывает SQLConnect, SQLDriverConnect или SQLBrowseConnect, диспетчер драйверов сначала определяет, какой драйвер следует использовать. Затем он проверяет, загружен ли в данный момент драйвер для подключения:

Если в подключении не загружен драйвер, диспетчер драйверов проверяет, загружен ли указанный драйвер в другое подключение в той же среде. В противном случае диспетчер драйверов загружает драйвер в подключение и вызывает функцию SQLAllocHandle в драйвере с параметром SQL_HANDLE_ENV.

Затем Диспетчер драйверов вызывает функцию SQLAllocHandle в драйвере с параметром SQL_HANDLE_DBC, независимо от того, был ли он загружен. Если приложение устанавливает какие бы то ни было атрибуты подключения, диспетчер драйверов вызывает SQLSetConnectAttr в драйвере. При возникновении ошибки функция подключения диспетчера драйверов возвращает значение SQLSTATE IM006 (сбой драйвера SQLSetConnectAttr ). Наконец, диспетчер драйверов вызывает функцию подключения в драйвере.

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

Если в подключении загружен другой драйвер, диспетчер драйверов вызывает SQLFreeHandle в драйвере, чтобы освободить подключение. Если других соединений, использующих этот драйвер, нет, диспетчер драйверов вызывает SQLFreeHandle в драйвере, чтобы освободить среду и выгрузить драйвер. Затем Диспетчер драйверов выполняет те же операции, что и когда драйвер не загружен в соединении.

Диспетчер драйверов блокирует обработчик среды (хенв) перед вызовом функцию SQLAllocHandle драйвера и SQLFreeHandle , когда параметром handletype имеет значение SQL_HANDLE_DBC.

Когда приложение вызывает SQLDisconnect, диспетчер драйверов вызывает SQLDisconnect в драйвере. Однако он оставляет драйвер загруженным, если приложение повторно подключится к драйверу. Когда приложение вызывает SQLFreeHandle с параметром SQL_HANDLE_DBC, диспетчер драйверов вызывает SQLFreeHandle в драйвере. Если драйвер не используется какими-либо другими соединениями, диспетчер драйверов вызывает SQLFreeHandle в драйвере с параметром SQL_HANDLE_ENV и выгружает драйвер.

Сводка
SQLSetConnectAttr задает атрибуты, управляющие аспектами соединений.

Дополнительные сведения о том, как диспетчер драйверов сопоставляет эту функцию, когда приложение ODBC 3 . x работает с драйвером ODBC 2 . x , см. в разделе Сопоставление функций замены для обратной совместимости приложений.

Синтаксис

Аргументы

коннектионхандле
[Input] Дескриптор подключения

Если атрибут Attribute является атрибутом, ОПРЕДЕЛЯЕМым ODBC, а ValuePtr — целым числом, StringLength игнорируется.

Если атрибут является атрибутом, определяемым драйвером, приложение указывает природу атрибута для диспетчера драйверов, задавая аргумент StringLength . StringLength могут иметь следующие значения:

Если ValuePtr является указателем на символьную строку, StringLength — это длина строки или SQL_NTS.

Если ValuePtr является указателем на двоичный буфер, приложение помещает результат макроса SQL_LEN_BINARY_ATTR (length) в StringLength. Это помещает отрицательное значение в StringLength.

Если ValuePtr является указателем на значение, отличное от символьной строки или двоичной строки, StringLength должно иметь значение SQL_IS_POINTER.

Если ValuePtr содержит значение фиксированной длины, то StringLength либо SQL_IS_INTEGER, либо SQL_IS_UINTEGER, соответственно.

Возвращаемое значение

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE или SQL_STILL_EXECUTING.

Диагностика

Когда SQLSetConnectAttr возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE может быть получено путем вызова SQLGetDiagRec с параметром handletype SQL_HANDLE_DBC и маркером коннектионхандле. В следующей таблице перечислены значения SQLSTATE, обычно возвращаемые функцией SQLSetConnectAttr , и объясняется каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATE, возвращаемым диспетчером драйверов. Код возврата, связанный с каждым значением SQLSTATE, имеет SQL_ERROR, если не указано иное.

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

Подключение уже прикреплено к DTC.

(DM) вызывается асинхронно исполняемая функция (не эта одна) для коннектионхандле и все еще выполнялась при вызове этой функции.

(DM) SQLExecute, SQLExecDirect или SQLMoreResults были вызваны для одного из дескрипторов инструкций, связанных с коннектионхандле и возвращаемых SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для статеменсандле , связанного с коннектионхандле , и возвращены SQL_NEED_DATA. Эта функция была вызвана перед отправкой данных для всех параметров или столбцов данных, выполняемых во время выполнения.

Если атрибут является атрибутом инструкции, SQLSetConnectAttr может возвращать любой SQLSTATE, возвращенный SQLSetStmtAttr.

Комментарии

Общие сведения об атрибутах соединения см. в разделе атрибуты соединения.

Определенные в настоящее время атрибуты и версия ODBC, в которой они были представлены, показаны в таблице далее в этом разделе. Ожидается, что для использования преимуществ различных источников данных будут определены дополнительные атрибуты. Диапазон атрибутов зарезервирован ODBC; Разработчики драйверов должны зарезервировать значения для собственного использования драйвера из Open Group.

Возможность установки атрибутов инструкций на уровне соединения путем вызова SQLSetConnectAttr является устаревшей в ODBC 3 . x. Приложения ODBC 3 . x никогда не должны задавать атрибуты инструкций на уровне соединения. Атрибуты инструкций ODBC 3 . x не могут быть установлены на уровне соединения, за исключением атрибутов SQL_ATTR_METADATA_ID и SQL_ATTR_ASYNC_ENABLE, которые являются атрибутами соединения и атрибутами инструкции и могут быть установлены на уровне соединения или инструкции.

Драйверы ODBC 3 . x должны поддерживать эту функцию только в том случае, если они должны работать с приложениями ODBC 2 . x , которые задают параметры инструкции ODBC 2 . x на уровне соединения. Дополнительные сведения см. в разделе сопоставление SQLSetConnectOption в приложении G: рекомендации по драйверу для обеспечения обратной совместимости.

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

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

attribute Задать до или после подключения?
SQL_ATTR_ACCESS_MODE Либо [1]
SQL_ATTR_ASYNC_DBC_EVENT Можно использовать
SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE Либо [4]
SQL_ATTR_ASYNC_DBC_PCALLBACK Можно использовать
SQL_ATTR_ASYNC_DBC_PCONTEXT Можно использовать
SQL_ATTR_ASYNC_ENABLE Либо [2]
SQL_ATTR_AUTO_IPD Можно использовать
SQL_ATTR_AUTOCOMMIT Либо [5]
SQL_ATTR_CONNECTION_DEAD После
SQL_ATTR_CONNECTION_TIMEOUT Можно использовать
SQL_ATTR_CURRENT_CATALOG Либо [1]
SQL_ATTR_DBC_INFO_TOKEN После
SQL_ATTR_ENLIST_IN_DTC После
SQL_ATTR_LOGIN_TIMEOUT До
SQL_ATTR_METADATA_ID Можно использовать
SQL_ATTR_ODBC_CURSORS До
SQL_ATTR_PACKET_SIZE До
SQL_ATTR_QUIET_MODE Можно использовать
SQL_ATTR_TRACE Можно использовать
SQL_ATTR_TRACEFILE Можно использовать
SQL_ATTR_TRANSLATE_LIB После
SQL_ATTR_TRANSLATE_OPTION После
SQL_ATTR_TXN_ISOLATION Либо [3]

[1] SQL_ATTR_ACCESS_MODE и SQL_ATTR_CURRENT_CATALOG можно задать до или после подключения, в зависимости от драйвера. Однако взаимодействующие приложения устанавливают их перед подключением, так как некоторые драйверы не поддерживают их изменение после подключения.

[2] SQL_ATTR_ASYNC_ENABLE необходимо задать перед выполнением активного оператора.

[3] SQL_ATTR_TXN_ISOLATION можно задать только в том случае, если в соединении нет открытых транзакций. Некоторые атрибуты соединения поддерживают подстановку аналогичного значения, если источник данных не поддерживает значение, указанное в * ValuePtr. В таких случаях драйвер возвращает SQL_SUCCESS_WITH_INFO и SQLSTATE 01S02 (значение параметра изменено). Например, если атрибут имеет значение SQL_ATTR_PACKET_SIZE и * ValuePtr превышает максимальный размер пакета, драйвер подставляет максимальный размер. Чтобы определить заменяющее значение, приложение вызывает SQLGetConnectAttr.

[4] Если SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE задан до открытия соединения, диспетчер драйверов установит атрибут драйвера при загрузке драйвера во время вызова SQLBrowseConnect, SQLConnect или SQLDriverConnect. Перед вызовом SQLBrowseConnect, SQLConnect или SQLDriverConnect диспетчер драйверов не знает, к какому драйверу подключаться, и не знает, поддерживает ли драйвер асинхронные операции подключения. Таким образом, диспетчер драйверов всегда возвращает SQL_SUCCESS. Но если драйвер не поддерживает асинхронные операции подключения, вызов SQLBrowseConnect, SQLConnect или SQLDriverConnect завершится ошибкой.

[5] Если SQL_ATTR_AUTOCOMMIT имеет значение FALSE, приложения должны вызывать SQLEndTran (SQL_ROLLBACK), если любой API возвращает SQL_ERROR для обеспечения согласованности транзакций.

Формат набора данных в * буфере ValuePtr зависит от указанного атрибута. SQLSetConnectAttr будет принимать сведения об атрибутах в одном из двух разных форматов: строку символов, завершающуюся нулем, или целочисленное значение. Формат каждого из них отмечен в описании атрибута. Символьные строки, на которые указывает аргумент ValuePtr параметра SQLSetConnectAttr , имеют длину StringLength байтов.

Аргумент StringLength игнорируется, если длина определяется атрибутом, как и в случае всех атрибутов, введенных в ODBC 2 . x или более ранней версии.

SQL_ASYNC_DBC_ENABLE_ON = включить асинхронную операцию для указанных функций, связанных с соединением.

SQL_ASYNC_DBC_ENABLE_OFF = (по умолчанию) отключить асинхронную операцию для указанных функций, связанных с соединением.

Параметр SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE всегда является синхронным (то есть он никогда не будет возвращать SQL_STILL_EXECUTING).

SQL_ASYNC_ENABLE_OFF = отключить поддержку асинхронного выполнения на уровне соединения для операций с инструкциями (по умолчанию).

SQL_ASYNC_ENABLE_ON = включить поддержку асинхронного выполнения на уровне соединения для операций с инструкциями.

SQL_TRUE = автоматическое заполнение IPD после вызова SQLPrepare поддерживается драйвером.

SQL_FALSE = автоматическое заполнение IPD после вызова SQLPrepare не поддерживается драйвером. Серверы, не поддерживающие подготовленные инструкции, не смогут автоматически заполнять IPD.

Если для атрибута соединения SQL_ATTR_AUTO_IPD возвращается SQL_TRUE, атрибут инструкции SQL_ATTR_ENABLE_AUTO_IPD можно задать, чтобы включить или отключить автоматическое заполнение IPD. Если SQL_ATTR_AUTO_IPD имеет SQL_FALSE, SQL_ATTR_ENABLE_AUTO_IPD нельзя установить в SQL_TRUE. Значение по умолчанию SQL_ATTR_ENABLE_AUTO_IPD равно значению SQL_ATTR_AUTO_IPD.

SQL_AUTOCOMMIT_OFF = драйвер использует режим фиксации вручную, и приложение должно явно зафиксировать или откатить транзакции с помощью SQLEndTran.

SQL_AUTOCOMMIT_ON = драйвер использует режим автоматической фиксации. Каждый оператор фиксируется сразу же после выполнения. Это значение по умолчанию. Все открытые транзакции в соединении фиксируются, когда SQL_ATTR_AUTOCOMMIT имеет значение SQL_AUTOCOMMIT_ON, чтобы переходить от режима ручной фиксации к режиму автоматической фиксации.

Дополнительные сведения см. в разделе режим фиксации. Важно. Некоторые источники данных удаляют планы доступа и закрывают курсоры для всех инструкций в соединении каждый раз при фиксации инструкции; режим автоматической фиксации может привести к тому, что это произойдет после выполнения каждой незапросной инструкции или закрытия курсора для запроса. Дополнительные сведения см. в статьях типы сведений SQL_CURSOR_COMMIT_BEHAVIOR и SQL_CURSOR_ROLLBACK_BEHAVIOR в SQLGetInfo и воздействие транзакций на курсоры и подготовленные инструкции.

SQL_ATTR_DBC_INFO_TOKEN только задано. Невозможно использовать SQLGetConnectAttr или SQLGetConnectOption для получения этого значения. SQLSetConnectAttr диспетчера драйверов не будет принимать SQL_ATTR_DBC_INFO_TOKEN, так как приложение не должно устанавливать этот атрибут.

передайте объект транзакции DTC OLE, указывающий транзакцию для экспорта в SQL Server, или SQL_DTC_DONE для завершения связи DTC подключения.

Если SQL_TRUE, строковый аргумент функций каталога рассматривается как идентификаторы. Регистр не имеет значения. Для строк без разделителей драйвер удаляет все конечные пробелы, а строка выводится в верхний регистр. Для строк с разделителями драйвер удаляет все начальные или конечные пробелы и принимает буквальное значение между разделителями. Если для одного из этих аргументов задан пустой указатель, функция возвращает SQL_ERROR и SQLSTATE HY009 (недопустимое использование пустого указателя).

Если SQL_FALSE, строковые аргументы функций каталога не рассматриваются как идентификаторы. Регистр важен. Они могут содержать шаблон поиска строки или нет, в зависимости от аргумента.

Значение по умолчанию — SQL_FALSE.

Аргумент TableType объекта SQLTables, который принимает список значений, не затрагивается этим атрибутом.

SQL_ATTR_METADATA_ID также можно задать на уровне инструкции. (Это единственный атрибут соединения, который также является атрибутом инструкции.)

SQL_CUR_USE_IF_NEEDED = диспетчер драйверов использует библиотеку курсоров ODBC, только если это необходимо. Если драйвер поддерживает параметр SQL_FETCH_PRIOR в SQLFetchScroll, диспетчер драйверов использует возможности прокрутки драйвера. В противном случае используется библиотека курсоров ODBC.

SQL_CUR_USE_ODBC = диспетчер драйверов использует библиотеку курсоров ODBC.

SQL_CUR_USE_DRIVER = диспетчер драйверов использует возможности прокрутки драйвера. Это параметр по умолчанию.

Если указанный размер превышает максимальный размер пакета или меньше, чем минимальный размер пакета, драйвер подставляет это значение и возвращает значение SQLSTATE 01S02 (изменение значения параметра).

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

SQL_OPT_TRACE_OFF = трассировка отключена (по умолчанию)

SQL_OPT_TRACE_ON = трассировка вкл.

Когда трассировка включена, диспетчер драйверов записывает каждый вызов функции ODBC в файл трассировки. Примечание. Когда трассировка включена, диспетчер драйверов может возвращать значение SQLSTATE IM013 (ошибка файла трассировки) из любой функции.

Приложение задает файл трассировки с параметром SQL_ATTR_TRACEFILE. Если файл уже существует, диспетчер драйверов добавляет его к файлу. В противном случае он создает файл. Если трассировка включена и файл трассировки не указан, диспетчер драйверов записывает данные в файл SQL. Войдите в корневой каталог.

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

Если ключевое слово Trace в сведениях о системе имеет значение 1, когда приложение вызывает функцию sqlallochandle с параметром handletype SQL_HANDLE_ENV, трассировка включается для всех дескрипторов. Он включен только для приложения, которое вызвало функцию SQLAllocHandle.

Значение по умолчанию атрибута SQL_ATTR_TRACEFILE указывается с помощью ключевого слова TRACEFILE в сведениях о системе. Дополнительные сведения см. в разделе подраздела ODBC.

Допустимые значения для ValuePtr можно определить с помощью вызова SQLGetInfo с инфотипе , равным SQL_TXN_ISOLATION_OPTIONS.

[1] эти функции можно вызывать асинхронно, только если дескриптор является дескриптором реализации, а не дескриптором приложения.

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