Požymiai
Kai bandote nustatyti ryšio atributas ODBC ryšio, kai ryšių buferizavimo įgalintas naudojant Microsoft SQL Server ODBC tvarkyklė ODBC tvarkyklė API, galite gauti tokį klaidos pranešimą:
IM006 [Microsoft] [ODBC tvarkyklės tvarkytuvo] tvarkyklės SQLSetConnectAttr nepavyko
Pastaba. ODBC tvarkyklė dokumentuose nurodo, kad pranešimas yra informacinis pranešimas. Tačiau, galite gauti pranešimą kaip klaidos pranešimą.
Ši problema gali kilti esant visoms šioms sąlygoms:-
Jums užmegzti ryšį su duomenų šaltinio pavadinimą (DSN) naudodami SQLConnect ODBC tvarkyklė API.
-
Vieną iš numatytųjų ypatybių DSN (pvz., naudokite ANSI neapibrėžtas reikšmes, lyginamus ir įspėjimai parinktis) yra išjungta.
-
Ryšio buferizavimas yra įjungtas aplinkoje rankenėlę.
-
Į operacijos izoliavimo lygio ryšio atributas atidarius ryšį naudodami SQLConnect.
-
Duomenų bazės operacijų atliekama.
Sprendimas
Norėdami išspręsti šią problemą, atlikite šiuos veiksmus:
-
Išjungti ryšio buferizavimo ODBC ryšio parinktis.
Pastaba. Išjungia ryšių buferizavimo gali turėti įtakos programos veikimą. -
Po to, kai jums įsipareigoja operaciją, pažymėkite parinktį Automatinis pradžios tašką.
-
Prieš atidarydami ODBC ryšys, nustatyti operacijų izoliavimo lygį.
-
Naudoti DSN mažiau ryšį vietoj gauti ODBC ryšio su DSN.
Sprendimas
„Microsoft“ pateikia palaikomas karštąsias pataisas. Tačiau šios karštosios pataisos skirtos tik šiame straipsnyje aprašytai problemai spręsti. Jas taikykite tik sistemoms, kuriose kyla ši konkreti problema.
Jeigu karštąsias pataisas galima atsisiųsti, šio žinių bazės straipsnio viršuje yra skyrius „Galima atsisiųsti karštąsias pataisas“. Jei šio skyriaus nėra, pateikite užklausą „Microsoft“ klientų aptarnavimo ir palaikymo tarnybai, kad gautumėte karštąsias pataisas. Pastaba. Jeigu kyla papildomų problemų arba jei reikia šalinti triktis, gali reikėti pateikti atskirą užklausą. Už papildomą pagalbą dėl problemų ir klausimų, nesusijusių su čia nurodytomis karštosiomis pataisomis, bus taikomi įprasti mokesčiai už pagalbos paslaugas. Sąrašą Microsoft klientų aptarnavimo ir palaikymo tarnybos telefonų numerių arba sukurti atskirą aptarnavimo užklausą, apsilankykite šioje "Microsoft" svetainėje:http://support.microsoft.com/contactus/?ws=supportPastaba. Formoje „Galima atsisiųsti karštąsias pataisas“ nurodomos kalbos, kurioms skirtos karštosios pataisos. Jei nematote savo kalbos, tai kalbai skirtų karštųjų pataisų nėra. Anglų šios pataisos versija turi failo atributus (arba vėlesnius), kurie išvardyti toliau esančioje lentelėje. Datos ir laikai šie failai yra išvardyti pagal universalųjį laiką (UTC). Kai peržiūrite failo informaciją, ši informacija konvertuojama į vietos laiką. Jei norite pamatyti skirtumą tarp UTC ir vietos laiko, naudokite su Valdymo skydo įrankio data ir laikas skirtuką laiko juosta . 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
Pastaba. Visos karštosios pataisos, skirtas MDAC 2.8 sąrašą, spustelėkite toliau straipsnio numerį ir peržiūrėkite straipsnį Microsoft žinių bazėje:
839801 FIX: karštosios pataisos, skirtos MDAC 2.8
Būsena
"Microsoft" patvirtino, kad tai yra problema Microsoft produktų, išvardytų skyriuje "Taikoma". Ši problema buvo ištaisyta Microsoft duomenų prieigos komponento 2.7 pakeitimų paketo 1 atnaujinti ir "Microsoft" duomenų prieigos komponentai 2.8.
Daugiau informacijos
Matote problemą, kuri nurodyta šio straipsnio skyriuje "Požymiai", tik jei turite su "Microsoft" duomenų prieigos komponentų (MDAC) 2.7 1 pakeitimų paketas įdiegtas jūsų kompiuteryje.
Veikimo atkūrimo veiksmai
Naudokite šį kodą problemos:
// 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); }