Triệu chứng

Khi bạn cố gắng đặt thuộc tính kết nối một ODBC kết nối khi kết nối tổng hợp được kích hoạt bằng cách sử dụng API trình điều khiển ODBC trình điều khiển ODBC Microsoft SQL Server, bạn nhận được thông báo lỗi sau:

IM006 SQLSetConnectAttr [Microsoft] [quản lý trình điều khiển ODBC] điều khiển không thành công

Lưu ý Tài liệu trình điều khiển ODBC đề cập đến thông báo là thông báo thông tin. Tuy nhiên, bạn nhận được thông báo là thông báo lỗi.Sự cố này có thể xảy ra khi tất cả các điều kiện sau là đúng:

  • Bạn thực hiện kết nối với tên nguồn dữ liệu (DSN) bằng cách sử dụng API trình điều khiển ODBC SQLConnect.

  • Một trong các thuộc tính mặc định của DSN (chẳng hạn như các tùy chọn nulls, Gioăng đệm và cảnh báo sử dụng ANSI ) bị vô hiệu hoá.

  • Kết nối tổng hợp được kích hoạt để xử lý môi trường.

  • Giao dịch tách biệt cấp thuộc tính của kết nối được thiết lập sau khi bạn mở kết nối bằng cách sử dụng SQLConnect.

  • Giao dịch cơ sở dữ liệu được thực hiện.

Giải pháp

Để khắc phục sự cố này, hãy làm theo các bước sau:

  1. Vô hiệu hoá kết nối tổng hợp các tùy chọn kết nối ODBC.Lưu ý Vô hiệu hoá kết nối tổng hợp có thể ảnh hưởng đến hiệu suất của ứng dụng của bạn.

  2. Sau khi bạn thực hiện giao dịch, không bật tuỳ chọn tự tự động.

  3. Đặt mức cô lập giao dịch trước khi mở kết nối ODBC.

  4. Sử dụng kết nối DSN ít thay vì lấy ODBC kết nối với một DSN.

Giải pháp

Cập nhật nóng được hỗ trợ do Microsoft cung cấp. Tuy nhiên, cập nhật nóng này chỉ được dùng để khắc phục sự cố được mô tả trong bài viết này. Chỉ áp dụng cập nhật nóng này cho hệ thống đang gặp sự cố cụ thể này.Nếu cập nhật nóng này sẵn có để tải xuống thì sẽ có phần "Cập nhật nóng có sẵn để tải xuống" ở đầu bài viết Cơ sở Kiến thức này. Nếu phần này không xuất hiện, hãy gửi một yêu cầu tới bộ phận Hỗ trợ và Dịch vụ Khách hàng của Microsoft để nhận hotfix.Lưu ý Nếu sự cố khác xảy ra hoặc nếu cần khắc phục sự cố, bạn có thể phải tạo một yêu cầu dịch vụ riêng. Chi phí hỗ trợ thông thường sẽ tính cho các câu hỏi hỗ trợ bổ sung và các sự cố không phù hợp với cập nhật nóng cụ thể này. Để có danh sách đầy đủ số điện thoại hỗ trợ và dịch vụ khách hàng của Microsoft hoặc để tạo yêu cầu dịch vụ riêng, hãy ghé thăm Web site sau của Microsoft:

http://support.microsoft.com/contactus/?ws=supportLưu ý Mẫu "Tải xuống cập nhật nóng sẵn có" hiển thị các ngôn ngữ mà cập nhật nóng này sẵn có. Nếu bạn không thấy ngôn ngữ của mình thì đó là do cập nhật nóng này hiện không có ngôn ngữ đó. Công Anh phiên bản vá này có các thuộc tính tệp (hoặc mới hơn) được liệt kê trong bảng sau. Ngày và giờ của các tệp này được liệt kê theo giờ chuẩn quốc tế (UTC). Khi bạn xem thông tin về tệp, ngày và giờ được chuyển đổi thành giờ địa phương. Để tìm sự khác nhau giữa UTC và giờ địa phương, sử dụng các Tab múi giờ cụ ngày và giờ trong Pa-nen điều khiển.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

Lưu ý Để có danh sách tất cả các hotfix có sẵn để MDAC 2.8, hãy bấm vào số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:

Khắc phục sự cố 839801 : hotfix có sẵn để MDAC 2.8

Trạng thái

Microsoft đã xác nhận rằng đây là sự cố trong sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho". Vấn đề này được khắc phục trong Microsoft Access phần 2,7 Service Pack 1 làm mới dữ liệu và Microsoft dữ liệu truy cập phần 2.8.

Thông tin

Bạn sẽ thấy vấn đề được đề cập trong phần "Triệu chứng" của bài viết này chỉ khi bạn có Microsoft dữ liệu truy cập thành phần (MDAC) 2,7 Service Pack 1 cài đặt trên máy tính của bạn.

Các bước để tái tạo hiện tượng

Sử dụng mã sau đây để tái tạo sự cố:

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

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.