דלג לתוכן הראשי
היכנס דרך Microsoft
היכנס או צור חשבון.
שלום,
בחר חשבון אחר.
יש לך חשבונות מרובים
בחר את החשבון שברצונך להיכנס באמצעותו.

מאפייני הבעיה

כאשר אתה מנסה להגדיר את תכונת החיבור של חיבור ODBC שבו חיבורים זמינה באמצעות מנהל התקן ODBC API עם התקן ODBC של שרת SQL של Microsoft, מתקבלת הודעת השגיאה הבאה:

IM006 SQLSetConnectAttr [Microsoft] [מנהל מנהלי ההתקנים של ODBC] מנהל ההתקן נכשל

הערה בתיעוד מנהל ההתקן של ODBC מציינת כי ההודעה היא הודעת מידע. עם זאת, תקבל את ההודעה כהודעת השגיאה.

בעיה זו עלולה להתעורר כאשר מתקיימים כל התנאים הבאים:

  • לבצע את החיבור עם שם מקור נתונים (DSN) באמצעות מנהל התקן ODBC API של SQLConnect.

  • לאחד ממאפייני ברירת המחדל של ה-DSN (כגון האפשרות ערכי null השתמש ANSI, ריווח ואזהרות ) אינה זמינה.

  • צירוף חיבורים זמינה עבור מזהה ייחודי של הסביבה.

  • התכונה רמת הבידוד של הטרנזקציה של ההתקשרות נקבעה לאחר שתפתח את החיבור על-ידי שימוש SQLConnect.

  • עסקת מסד הנתונים מתבצע.

פתרון הבעיה

כדי לעקוף בעיה זו, בצע את הפעולות הבאות:

  1. השבת את האפשרות עבור חיבור ODBC של צירוף חיבורים.

    הערה ביטול צירוף חיבורים עשוי להשפיע על הביצועים של היישום שלך.

  2. לאחר ביצוע פעולת commit של התנועה, לא להפעיל את האפשרות commit אוטומטית.

  3. הגדר את רמת הבידוד של הטרנזקציה לפני פתיחת חיבור ODBC.

  4. השתמש בחיבור ללא DSN מאשר להשיג חיבור ODBC עם DSN.

פתרון

תיקון חם נתמך זמין מ-Microsoft. עם זאת, תיקון חם זה מיועד לפתור רק את הבעיה המתוארת במאמר זה. יש להחיל תיקון חם זה רק במערכות שהתעוררה בהן בעיה ספציפית זו.

אם התיקון החם זמין להורדה, ישנו סעיף "הורדת תיקון חם זמינה" בראש מאמר Knowledge Base. אם מקטע זה אינו מופיע, שלח בקשה לשירות הלקוחות של 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.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, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:

תיקון 839801 : תיקונים חמים זמינים עבור MDAC 2.8

מצב

מיקרוסופט אישרה כי מדובר בבעיה במוצרי מיקרוסופט הרשומים בסעיף 'חל על'. בעיה זו תוקנה ב- Microsoft Access רכיב 2.7 Service Pack 1 רענון נתונים ו- 2.8 רכיבים של Access נתונים Microsoft.

מידע נוסף

אתה רואה את הבעיה המוזכרת בסעיף 'מאפייני הבעיה' של מאמר זה רק כאשר יש לך את Microsoft נתונים 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);
}

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×