Симптоми
Когато се опитвате да зададете атрибут на връзката на ODBC връзка при обединяване на връзка е разрешено чрез ODBC драйвер API с Microsoft SQL Server ODBC драйвер, получавате следното съобщение за грешка:
IM006 [Microsoft] [диспечера на ODBC драйвери] драйвер SQLSetConnectAttr е неуспешно
Забележка: Документацията на ODBC драйвер се споменава, че съобщението е информационно съобщение. Въпреки това получавате съобщение като съобщение за грешка.Този проблем може да възникне, когато са налице следните условия:
-
Направи връзка с името на източник на данни (DSN) с помощта на SQLConnect API ODBC драйвер.
-
Едно от свойствата по подразбиране на DSN (например опцията Използвай ANSI nulls, резервни части и предупреждения ) е забранена.
-
Обединяване на връзката е разрешено за манипулатора среда.
-
Изолиране на ниво транзакция атрибут на връзката е разположен след като отворите връзката с помощта на SQLConnect.
-
База данни на транзакция се изпълнява.
Заобикаляне на проблема
За да заобиколите този проблем, изпълнете следните стъпки:
-
Забраняване на обединяване на опция за връзка с ODBC връзката.Забележка: Забраняването на групиране на връзка може да влияе на работата на вашето приложение.
-
След като се извърши транзакцията, не се включва опцията за автоматично изпълнение.
-
Задайте ниво на транзакцията изолиране, преди да отворите ODBC връзка.
-
Използвайте връзката DSN-малко вместо получаване ODBC връзка с DSN.
Решение
Поддържана актуална корекция се предлага от Microsoft. Тази актуална корекция обаче е предназначена да коригира само проблема, описан в тази статия. Прилагайте тази корекция само към системи, изпитващи този конкретен проблем.Ако актуалната корекция е налична за изтегляне, има секция "Налично изтегляне предлага" в горната част на тази статия от базата знания. Ако тази секция не се появи, изпратете заявка за обслужване на клиенти на Microsoft и поддръжка, за да получите актуалната корекция.Забележка: Ако възникнат допълнителни проблеми или проблеми, трябва да създадете отделна заявка за поддръжка. Обичайните такси за поддръжката ще важат за допълнителни въпроси и проблеми, които не спадат към конкретната актуална корекция. За пълен списък на телефонните номера на Microsoft за обслужване на клиенти и поддръжка или да създадете отделна заявка за поддръжка посетете следния уеб сайт на Microsoft:
http://support.microsoft.com/contactus/?ws=supportЗабележка: Формулярът "Налична актуална корекция изтегляне" показва езиците, за които е налична актуалната корекция. Ако не виждате вашия език, това е защото актуалната корекция не е налична за този език. Английската версия на тази корекция притежава файловите атрибути (или по-късно), изброени в следващата таблица. Датите и часовете за тези файлове са изброени в координирано световно време (UTC). При преглед на информацията за файла, преобразувана в местно време. За да намерите разликата между 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.dllMDAC 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 щракнете върху следния номер на статия в базата знания на Microsoft:
839801 решение: актуални корекции са достъпни за MDAC 2.8
Статус
Microsoft потвърждава, че това е проблем в продуктите на Microsoft, изброени в раздела "Важи за". Този проблем е коригиран в Microsoft Access компонент 2.7 Service Pack 1 обновяване на данни и Microsoft Data Access компоненти 2.8.
Допълнителна информация
Виждате проблема, описан в раздела "Симптоми" на тази статия само когато имате Microsoft Data Access компонент (MDAC) 2.7 Service Pack 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 : %s\n",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);}