Симптомы
При попытке установить атрибут подключение подключение ODBC, где пул соединений включен с помощью API-интерфейса ODBC драйвер драйвера ODBC для Microsoft SQL Server, появляется следующее сообщение об ошибке:
IM006 сбой SQLSetConnectAttr драйвер [Microsoft] [Диспетчер драйверов ODBC]
Примечание. В документации драйвера ODBC упоминания, что сообщение является информационное сообщение. Тем не менее сообщение как сообщение об ошибке.
Это может происходить, если выполняются все следующие условия:
-
С помощью API-интерфейса ODBC драйвер помощью SQLConnect создания подключения с именем источника данных (DSN).
-
Одно из свойств источника данных (например, вариант использования ANSI значения NULL, шаблоны и предупреждения ) по умолчанию отключено.
-
Пул соединений включен для дескриптора среды.
-
После открытия подключения с помощью помощью SQLConnect устанавливается атрибут уровня изоляции транзакции подключения.
-
Выполнить транзакцию базы данных.
Временное решение
Чтобы обойти эту проблему, выполните следующие действия.
-
Отключите параметр для подключения ODBC пула подключений.
Примечание. Отключение пула подключений может повлиять на производительность приложения.
-
После фиксации транзакции, не включить параметр auto commit.
-
Чтобы установите уровень изоляции транзакций перед открытием подключения ODBC.
-
Используйте соединения вместо получения подключения ODBC DSN.
Решение
Существует исправление от корпорации Майкрософт. Однако данное исправление предназначено для устранения только проблемы, описанной в этой статье. Применяйте данное исправление только в тех системах, которые имеют данную проблему.
Если исправление доступно для скачивания, имеется раздел «Пакет исправлений доступен для скачивания» в верхней части этой статьи базы знаний. Если этого раздела нет, отправьте запрос в службу технической поддержки для получения исправления.
Примечание. Если наблюдаются другие проблемы или необходимо устранить неполадки, вам может понадобиться создать отдельный запрос на обслуживание. Стандартная оплата за поддержку будет взиматься только за дополнительные вопросы и проблемы, которые не соответствуют требованиям конкретного исправления. Полный список телефонов поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос на обслуживание посетите следующий веб-узел корпорации Майкрософт:
http://support.microsoft.com/contactus/?ws=supportПримечание. В форме «Пакет исправлений доступен для скачивания» отображаются языки, для которых доступно исправление. Если нужный язык не отображается, значит исправление для данного языка отсутствует. Английская версия данного исправления содержит атрибуты файла (или более поздней версии), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, следует использовать
Часовой пояс вкладка «Дата и время» панели управления.
MDAC 2.7 SP1
Date Time Version Size File name
———————————————————
13-Oct-2002 19:24 90,112 Dahotfix.exe
03-Jul-2003 04:09 2000.81.9031.51 372,736 Sqlsrv32.dll
MDAC 2.8
Date Time Version Size File name
———————————————————
31-Mar-2004 16:44 2000.85.1040.0 24,576 Odbcbcp.dll
31-Mar-2004 16:43 2000.85.1040.0 401,408 Sqlsrv32.dll
Примечание. Список всех доступных исправлений для компонентов MDAC 2.8 щелкните следующий номер статьи базы знаний Майкрософт:
ИСПРАВИТЬ 839801 : исправления для компонентов MDAC 2.8
Статус
Корпорация Майкрософт подтвердила, что это является проблемой в продуктах Майкрософт, перечисленных в разделе «Относится к». Эта ошибка была исправлена в Microsoft Access компонент 2.7 Пакет обновления 1 обновление данных и компоненты доступа к данным MDAC 2.8.
Дополнительные сведения
Возникает проблема, описанное в разделе «Проблема» данной статьи, только при наличии доступа к данным компонента (MDAC) 2.7 на компьютере установлен Пакет обновления 1.
Действия по воспроизведению проблемы
Чтобы воспроизвести проблему, используйте следующий код:
// ODBCTestCase.cpp : Defines the entry point for the console application.//#include "stdafx.h"
#include "windows.h"
#include "sqlext.h"
#include "sql.h"
#include "stdlib.h"void GetSQLError();
long InitializeEnvironment();
long Connect(BOOL lbUseDSN);
long Disconnect();
int ExecuteProcedure();SQLHENV ghEnvironment = NULL;
SQLHDBC ghConnection = NULL;
HSTMT ghStatement = NULL;
/**********************************************
* main
**********************************************/
int main(int argc, char* argv[])
{
BOOL lbTransaction = TRUE;
BOOL lbUseDSN = FALSE;
long lValue =0;if(argc > 1)
{
if(strcmp(argv[1], "DSN") == 0)
lbUseDSN = TRUE;
if(argc > 2)
{
if(strcmp(argv[2], "TRAN") == 0)
lbTransaction = TRUE;
}
}if(InitializeEnvironment() == 0)
{
for(long llSub = 0; llSub < 2; llSub++)
{
if(Connect(lbUseDSN) == 0)
{if(lbTransaction)
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);
ExecuteProcedure();
if(lbTransaction)
{
SQLTransact(ghEnvironment, ghConnection, SQL_COMMIT);//If you do not call the following, the problem does not occur:
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON);//If you call the following the problem does not occur:
//SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);
}Disconnect();
}
}
SQLFreeHandle(SQL_HANDLE_ENV, ghEnvironment);
}return 0;
}/**********************************************
* InitializeEnvironment
**********************************************/
long InitializeEnvironment()
{
if (!SQL_SUCCEEDED(SQLSetEnvAttr(NULL,
SQL_ATTR_CONNECTION_POOLING,
(SQLPOINTER)SQL_CP_ONE_PER_DRIVER,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &ghEnvironment)))
{
GetSQLError();
return 8;
}
if(!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC2, SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
if (!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment,
SQL_ATTR_CP_MATCH,
(SQLPOINTER) SQL_CP_STRICT_MATCH ,
//(SQLPOINTER) SQL_CP_RELAXED_MATCH ,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}return 0;
}
/**********************************************
* Connect
**********************************************/
long Connect(BOOL lbUseDSN)
{
SQLCHAR lszOutConnectString[1024];
SQLSMALLINT llReturnLength;
SQLAllocHandle(SQL_HANDLE_DBC, ghEnvironment, &ghConnection);// If you set the isolation before opening the connection, no error reported.
// Customer cannot set this attribute before opening connection because the object
//is running under COM+, and under COM+ isolation levels automatically are set to serializable
//if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
//{
// GetSQLError();
// return 8;
//}if(lbUseDSN)
{
int iReturn = ::SQLConnect(ghConnection,
(SQLCHAR*)"LocalCPR",
SQL_NTS,
(SQLCHAR*)"sa",
SQL_NTS,
(SQLCHAR*)"password1",
SQL_NTS);
if(!SQL_SUCCEEDED(iReturn))
{
GetSQLError();
return 8;
}
}
else
{
if(!SQL_SUCCEEDED(SQLDriverConnect(ghConnection,
NULL,
(SQLCHAR*)"DSN=LocalCPR;UID=sa;PWD=password1;",
SQL_NTS,
lszOutConnectString,
1024,
&llReturnLength,
SQL_DRIVER_NOPROMPT)))
{
GetSQLError();
return 8;
}
}SQLAllocStmt(ghConnection, &ghStatement);
//If you set the isolation after you open the connection, you see the problem.
if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
return 0;
}
/**********************************************
* Disconnect
**********************************************/
long Disconnect()
{
if(ghStatement)
{
if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_STMT, ghStatement)))
{
GetSQLError();
return 8;
}
ghStatement = NULL;
}if(ghConnection)
{
::SQLDisconnect(ghConnection);if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_DBC, ghConnection)))
{
GetSQLError();
return 8;
}
ghConnection = NULL;
}
return 0;
}
/**********************************************
* ExecuteProcedure
**********************************************/
int ExecuteProcedure()
{
SQLINTEGER mlIndicator = 0;
SQLRETURN lnSqlRetCd = SQL_SUCCESS;
::SQLFreeStmt(ghStatement, SQL_CLOSE);
::SQLFreeStmt(ghStatement, SQL_UNBIND);/*****************************************************************/
/* Execute Procedure
/*****************************************************************/
RETCODE llDbRetCd = SQLExecDirect(ghStatement, (SQLCHAR*)"SELECT * From Table1", SQL_NTS);
if((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}/*****************************************************************/
/* Bind return Value
/*****************************************************************/
char lszReturnBuf[300];
SDWORD lSts;llDbRetCd = SQLBindCol(ghStatement, 1, SQL_C_TCHAR, &lszReturnBuf, 300, &lSts);
if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}/*****************************************************************/
/* Fetch Result
/*****************************************************************/
llDbRetCd = SQLFetch(ghStatement);
if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}printf("Output Value : %sn",lszReturnBuf);
return 0;
}/**********************************************
* GetSQLError
**********************************************/
void GetSQLError()
{
long llDbErrCd = 0;
short llRetMsgLen = 0;
char lszSqlErrMsg[255];
char lszSqlMsg[255];SQLError(ghEnvironment,
ghConnection,
ghStatement,
(SQLCHAR*) lszSqlErrMsg,
&llDbErrCd,
(SQLCHAR*) lszSqlMsg,
255,
&llRetMsgLen);
printf(lszSqlErrMsg);
printf(lszSqlMsg);
}
I’m trying to connect to an Access 2007 database (.accdb) with a .net console application. I setup a System DSN in ODBC Manager.
This is how I’m setting up the connection:
conn = new OdbcConnection();
conn.ConnectionString = "DSN=HU-FU";
conn.Open();
On my development machine it works perfectly, but today I tried to install it on a client machine and I’m getting the following error:
ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
Anyone has an idea what could be the problem?
Here is the ODBC trace source:
UPSShipmentServ 1454-6f0 ENTER SQLDriverConnectW
HDBC 0x00424070
HWND 0x00000000
WCHAR * 0x69938B34 [ -3] "****** 0"
SWORD -3
WCHAR * 0x69938B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
UPSShipmentServ 1454-6f0 EXIT SQLDriverConnectW with return code -1 (SQL_ERROR)
HDBC 0x00424070
HWND 0x00000000
WCHAR * 0x69938B34 [ -3] "****** 0"
SWORD -3
WCHAR * 0x69938B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed (0)
UPSShipmentServ is the name of my app. But this sadly does not mean anything to me…
One more addition to the question. I checked the Access driver’s (ACEODBC.DLL) version on both machines and mine is much newer than the client’s. Could it be the problem? Is there any way to update his driver?
Thanks.
- Remove From My Forums
-
Question
-
User-1613563713 posted
I am Building my first ASP.Net login page and I get the following error when I attemptto access a MS Access database file.
ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver’s SQLSetConnectAttr failed
Description:
An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.Exception Details: System.Data.Odbc.OdbcException: ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver’s SQLSetConnectAttr failed
Source Error:
Line 64: 'Calls Database Line 65: dbconn.ConnectionString = ("DSN=emp401k_dsn") Line 66: dbconn.Open() Line 67: dbcomm = New OdbcCommand(sql, dbconn) Line 68: dbcomm.CommandType = System.Data.CommandType.StoredProcedure
Source File: C:InetpubwwwrootNewEmployeeWebPagesLogin.aspx.vb Line:
66Stack Trace:
[OdbcException: ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed] System.Data.Odbc.OdbcConnection.Open() NewEmployeeWebPages.Login.ButSignOn_Click(Object sender, EventArgs e) in C:InetpubwwwrootNewEmployeeWebPagesLogin.aspx.vb:66 System.Web.UI.WebControls.Button.OnClick(EventArgs e) System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) System.Web.UI.Page.ProcessRequestMain()
Does anyone have any suggestions on how to correct this error.
Thank You, Rucadulu
Answers
-
User-116373494 posted
dbconn.ConnectionString = («DSN=emp401k_dsn») <— this doesn’t look right
I haven’t used DSN to connect — but I don’t think this is the way to declare it
Do some research on connectionstrings. try
www.connectionstrings.com-
Marked as answer by
Thursday, October 7, 2021 12:00 AM
-
Marked as answer by
I had this application source and I moved from w7 32 to w7 64. Code is in vb6. It was working well on 32 bit machine, but now get this error. [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
But strange thing is if I compile on 64 bit then .exe runs and connects to oracle with no problem. But if I try to debug it — it gives me error. I found odbc driver for 64bit but could not download it. Can someone give idea what to do? Odbc source is correct in C:WindowsSysWOW64odbcad32.exe
asked Jan 21, 2014 at 12:39
2
Try setting the ODBC up (on the 64bit pc)for 32 bit too. the one that you get too via: >contol panel >administrative tools >Data sources (ODBC) see if that works.
answered Jan 29, 2014 at 12:26
PHP Driver version or file name
5.8
,5.9
SQL Server version
2014
,2017
Client operating system
Microsoft Windows 10 20H2
PHP version
7.4
Microsoft ODBC Driver version
11
, 13
,17
Table schema
-
Problem description
PHP DB layer libs (example) as well as raw sqlsrv
/pdo_sqlsrv
can’t connect to the sql server due to Driver's SQLSetConnectAttr failed
, even when given a freshly installed sql server express 2017
Expected behavior and actual behavior
Expected: connection succeeds
Actual behavior, connection fails with Driver's SQLSetConnectAttr failed
Repro code or steps to reproduce
Check the sample library test suite above
Note: iirc, version 5.2
via php 7.2
worked correctly & eastablished connections just fine