Labojums: Atribūta savienojuma iestatījumu neizdošanās, ja lietojat savienojuma pūlošanas SQL servera ODBC savienojumu

Pazīmes

Mēģinot iestatīt savienojumu atribūtu ODBC savienojuma ja savienojuma pūlošanas aktivizēta, izmantojot Microsoft SQL Server ODBC draiveris ODBC draiveris API, tiek parādīts šāds kļūdas ziņojums:

IM006 [Microsoft] [ODBC Driver Manager] draiveris SQLSetConnectAttr neizdevās

Piezīme. ODBC draiveris dokumentāciju minēts, ka ziņojums ir informācija par ziņojumu. Tomēr kā kļūdas ziņojums tiek parādīts ziņojums.

Šī problēma var rasties, ja ir spēkā visi šeit minētie nosacījumi:

  • Esat izveidojis savienojumu ar datu avota nosaukumu (DSN) API SQLConnect ODBC draiveri.

  • Viens no noklusējuma rekvizītus DSN (piemēram, iespēju izmantot ANSI nulles paddings un brīdinājumi ) ir atspējota.

  • Savienojuma pūlošanas vides turi ir iespējots.

  • Savienojuma darbību izolācijas līmeni atribūts ir iestatīts atverot savienojumu, izmantojot SQLConnect.

  • Datu bāzes darbība tiek veikta.

Risinājums

Lai novērstu šo problēmu, rīkojieties šādi:

  1. Atspējot savienojuma pūlošanas ODBC savienojuma iespējas.

    Piezīme. Atspējot savienojuma pūlošanas var ietekmēt programmu veiktspēju.

  2. Kad veicat darbības, ieslēgt opciju Automātiskā izpilde.

  3. Noteikt darbības atsevišķi pirms atvēršanas ODBC savienojumu.

  4. Lietojiet DSN mazāk savienojumu, nevis iegūstot ODBC savienojumu ar DSN.

Risinājums

Korporācija Microsoft piedāvā atbalstītu labojumfailu. Tomēr šis labojumfails ir paredzēts tikai šajā rakstā aprakstītās problēmas novēršanai. Lai lietotu šo labojumfailu tikai tām sistēmām, kurām ir radusies tieši šī problēma.

Ja labojumfails ir pieejams lejupielādei, sadaļa "Pieejama labojumfaila lejupielāde" ir pieejama šī zināšanu bāzes raksta augšpusē. Ja šādas sadaļas nav, pieprasiet, lai iegūtu labojumfailu Microsoft klientu apkalpošanas un atbalsta.

Piezīme. Ja rodas papildu problēmas vai nepieciešama problēmu novēršana, iespējams, būs jāizveido atsevišķs pakalpojuma pieprasījums. Parasti atbalsta izmaksas tiek piemērotas jautājumiem par papildu atbalstu un problēmām, kas neattiecas uz šo konkrēto labojumfailu. Lai iegūtu pilnīgu sarakstu ar Microsoft klientu apkalpošanas un atbalsta centra tālruņa numuru vai izveidotu atsevišķu pakalpojuma pieprasījumu, apmeklējiet šo Microsoft Web vietu:

http://support.microsoft.com/contactus/?ws=supportPiezīme. Veidlapā "Pieejama labojumfaila lejupielāde" norādītas valodas, kurām ir pieejams labojumfails. Ja tajā nav vajadzīgās valodas, tas nozīmē, ka šai valodai labojumfails nav pieejams. Šī labojuma versijai angļu ir faila atribūti (vai jaunāki) Šajā tabulā sniegtie. Šo failu datumi un laiki ir norādīti atbilstoši universālajam koordinētajam laikam (UTC). Skatot faila informāciju, tā tiek pārvērsta atbilstoši vietējam laikam. Lai noskaidrotu atšķirību starp UTC un vietējo laiku, izmantojiet
Vadības paneļa rīka datums un laiks cilni laika josla .


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

Piezīme. Visas pieejamās MDAC 2.8 labojumfailus sarakstu, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:

839801 FIX: labojumfaili ir pieejami MDAC 2.8

Statuss

Korporācija Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir minēti sadaļā "Attiecas uz". Šī problēma tika novērsta Microsoft datu piekļuves komponentu 2.7 servisa pakotnes 1 atsvaidzināt un Microsoft datu piekļuves komponenti 2.8.

Papildinformācija

Tika konstatēta problēma, kas norādīts šī raksta sadaļā "Simptomi" tikai, ja Microsoft datu piekļuves komponentu (MDAC) 2.7 1. servisa pakotne ir instalēta jūsu datorā.

Šādas darbības radīšana

Problēmas atveidošanas izmantot šādu kodu:

// 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);
}

Vai nepieciešama papildu palīdzība?

Paplašiniet savas prasmes
Iepazīties ar apmācību
Esiet pirmais, kas saņem jaunās iespējas
Pievienoties Microsoft Insider

Vai šī informācija bija noderīga?

Cik lielā mērā esat apmierināts ar tulkojuma kvalitāti?

Kas ietekmēja jūsu pieredzi?

Vai vēlaties sniegt papildu atsauksmes? (Neobligāti)

Paldies par jūsu atsauksmēm!

×