FIX: Pengaturan sambungan atribut gagal ketika Anda menggunakan sambungan penggabungan untuk koneksi SQL Server ODBC

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 822841
Perbesar semua | Perkecil semua

Pada Halaman ini

GEJALA

Ketika Anda mencoba untuk mengatur atribut koneksi ODBC sambungan di mana sambungan penggabungan diaktifkan dengan menggunakan ODBC Driver API dengan Microsoft SQL Server ODBC Driver, Anda menerima galat berikut pesan:
IM006 [Microsoft] [ODBC Driver Manager] Driver SQLSetConnectAttr gagal
Catatan Dokumentasi ODBC Driver menyebutkan bahwa pesan ini informasi pesan. Namun, Anda menerima pesan kesalahan kepada kami.

Masalah ini dapat terjadi ketika semua kondisi berikut benar:
  • Anda membuat koneksi dengan nama sumber data (DSN) oleh menggunakan ODBC SQLConnect Driver API.
  • Salah satu sifat-sifat default DSN (seperti Menggunakan ANSI nulls, paddings dan peringatan pilihan) dinonaktifkan.
  • Sambungan penggabungan diaktifkan untuk lingkungan menangani.
  • Atribut tingkat isolasi transaksi sambungan diatur setelah Anda membuka koneksi dengan menggunakan SQLConnect.
  • Database transaksi dilakukan.

TEKNIK PEMECAHAN MASALAH

Untuk mengatasi masalah ini, ikuti langkah berikut:
  1. Menonaktifkan koneksi penggabungan pilihan untuk ODBC sambungan.

    Catatan Menonaktifkan koneksi penggabungan dapat mempengaruhi kinerja Anda aplikasi.
  2. Setelah Anda melakukan transaksi, tidak mengaktifkan otomatis komit pilihan.
  3. Mengatur tingkat isolasi transaksi sebelum Anda membuka Koneksi ODBC.
  4. Menggunakan sambungan DSN-kurang daripada mendapatkan ODBC hubungan dengan DSN.

PEMECAHAN MASALAH

Tersedia hotfix yang didukung dari Microsoft. Namun, hotfix ini ditujukan hanya untuk memecahkan masalah yang dijelaskan di artikel ini. Gunakan hotfix ini hanya untuk sistem yang mengalami masalah khusus ini.

Apabila hotfix tersedia untuk diunduh, akan ada bagian "Tersedia unduhan hotfix" di bagian atas artikel Pangkalan Pengetahuan ini. Jika bagian ini tidak ditampilkan, kirimkan permintaan ke Layanan Pelanggan dan Dukungan Microsoft untuk mendapatkan hotfix.

Catatan Jika terjadi masalah tambahan atau jika pemecahan masalah apa pun diperlukan, Anda perlu membuat permintaan layanan tersendiri. Biaya dukungan biasa akan diterapkan pada pertanyaan dan masalah dukungan tambahan yang tidak termasuk di hotfix ini. Untuk daftar lengkap nomor telepon pelanggan layanan dan dukungan Microsoft atau untuk membuat permintaan layanan tersendiri, kunjungi Web site Microsoft berikut:
http://support.microsoft.com/contactus/?ws=support
Catatan Formulir "Tersedia download perbaikan terbaru" menampilkan bahasa untuk perbaikan terbaru tersedia. Jika tidak menemukan bahasa Anda, ini karena hotfix tidak tersedia untuk bahasa tersebut. Inggris Versi pembaruan ini memiliki atribut berkas (atau yang lebih baru) yang tercantum di dalam Tabel berikut. Tanggal dan waktu untuk berkas-berkas ini tercantum dalam dikoordinasikan Universal time (UTC). Ketika Anda melihat informasi berkas, waktunya akan diubah ke waktu setempat. Untuk menemukan perbedaan waktu UTC dan waktu lokal, gunakan Zona waktu tab pada alat tanggal dan waktu dalam Panel kontrol.
 
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     

				
Catatan Untuk daftar semua pembaruan yang tersedia untuk MDAC 2.8, klik nomor artikel di bawah ini untuk melihat artikel di Microsoft Basis Pengetahuan:
839801 FIX: Perbaikan terbaru tersedia untuk MDAC 2.8

STATUS

Microsoft telah mengkonfirmasi bahwa ini adalah masalah di dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk". Masalah ini diperbaiki di Microsoft Data akses komponen 2.7 Layanan paket 1 Refresh dan akses Microsoft Data komponen 2.8.

INFORMASI LEBIH LANJUT

Anda melihat masalah yang disebutkan di dalam "Gejala" bagian dari artikel ini hanya bila Anda memiliki komponen akses Data Microsoft (MDAC) 2.7 Paket Layanan 1 diinstal pada komputer Anda.

Langkah-langkah mereproduksi perilaku

Gunakan kode berikut untuk mereproduksi masalah:
// 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);
}

Properti

ID Artikel: 822841 - Kajian Terakhir: 07 Oktober 2011 - Revisi: 2.0
Kata kunci: 
kbautohotfix kbhotfixserver kbqfe kberrmsg kbdriver kbtransaction kbfix kbbug kbmt KB822841 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:822841

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com