FIX: Manajer pengemudi ODBC salah laporan SQL_NO_DATA_FOUND untuk ANSI Driver

ID Artikel: 319243 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

GEJALA

Ketika Anda menggunakan ANSI ODBC sopir, manajer pengemudi ODBC mungkin salah kembali SQL_NO_DATA_FOUND untuk kolom yang didefinisikan sebagai VARCHAR atau CHAR dan yang memiliki string kosong di dalamnya. Tidak ada masalah Jika kolom berisi beberapa data atau nilai "NOL". Masalah hanya terjadi jika data adalah string kosong dan Anda mengikat dari sisi klien dengan SQL_C_WCHAR.

PENYEBAB

Manajer pengemudi ODBC salah menganggap bahwa pengandar tidak memiliki data ketika mencoba untuk mengkonversi string kosong dari ANSI untuk UNICODE.

PEMECAHAN MASALAH

Untuk memecahkan masalah ini, Dapatkan terbaru paket layanan Microsoft SQL Server 2000. Untuk informasi tambahan, klik nomor artikel berikut ini untuk melihat artikel dalam Pengetahuan Microsoft Base:
290211 INF: Cara mendapatkan SQL Server 2000 paket layanan
Untuk mengatasi masalah ini, download Q319243_MDAC27_x86.exe patch. Berkas berikut tersedia untuk di-download dari Microsoft Download Pusat:
Perkecil gambar iniPerbesar gambar ini
Unduh
Download Q319243_MDAC27_x86.exe sekarang
Tanggal rilis: 12 Juli 2002

Untuk informasi tambahan tentang cara men-download Microsoft Mendukung file, klik nomor artikel di bawah ini untuk melihat artikel di Basis Pengetahuan Microsoft:
119591 Cara mendapatkan berkas Dukungan Microsoft dari Layanan Online
Microsoft telah memindai berkas ini dari virus. Microsoft digunakan paling lunak pendeteksi virus terbaru yang tersedia pada tanggal yang file telah diposting. Berkas tersebut disimpan pada server aman yang membantu mencegah segala perubahan tidak sah terhadap berkas. Untuk informasi lebih lanjut tentang patch ini, kunjungi Web site Microsoft berikut:
http://www.Microsoft.com/downloads/details.aspx?DisplayLang=en&FamilyID=6263FCF4-A2AD-4690-8F6D-3341C16B31E6

TEKNIK PEMECAHAN MASALAH

Solusi sederhana untuk masalah ini adalah untuk mengikat kolom sebagai SQL_C_CHAR bukannya SQL_C_WCHAR.

STATUS

Microsoft telah mengkonfirmasi bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana didaftar pada awal artikel ini. Masalah ini diperbaiki pertama kali pada Microsoft SQL Server 2000 Paket Layanan 3.

INFORMASI LEBIH LANJUT

Legacy aplikasi yang menggunakan ANSI ODBC driver mungkin tidak mengalami masalah ini, karena mereka tidak dapat mengikat kolom sebagai SQL_C_WCHAR. Karena Microsoft ODBC.NET penyedia mengikat karakter kolom sebagai SQL_C_WCHAR secara default, Anda mungkin mengalami masalah ini jika Anda menggunakan Microsoft ODBC.NET Penyedia dengan driver ANSI. Perhatikan bahwa Microsoft ODBC.NET penyedia kembali "NO_DATA" ketika masalah ini terjadi.

Langkah-langkah untuk mereproduksi perilaku

Asli contoh berikut menunjukkan masalah:
  1. Menggunakan script berikut untuk membuat tabel dan masukkan salah satu Catatan:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Jalankan program c yang berikut:
    #include <windows.h>
    #include <stdio.h>
    #include <sql.h>
    #include <sqlext.h>
    
    int main(int argc, char* argv[])
    {
    	SQLCHAR*	theDiagState = new SQLCHAR[50];
    	SQLINTEGER	theNativeState;
    	SQLCHAR*	theMessageText  = new SQLCHAR[255];
    	SQLSMALLINT	iOutputNo;
    	SQLHENV		m_SQLEnvironment;
    	SQLHDBC		m_SQLConnection;
    	SQLHSTMT	m_SQLStatement;
    	SQLRETURN	iReturn;
    	long		lStrLen;
    	char		theData[1000];
    
    	//Connect.
    	iReturn = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_SQLEnvironment);
    	iReturn = SQLSetEnvAttr(m_SQLEnvironment,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,0);
    	iReturn = SQLAllocHandle(SQL_HANDLE_DBC,m_SQLEnvironment,&m_SQLConnection);
    
    	//CHANGE THE DSN NAME HERE.
    	char	szConnBuffer[1024];
    	short   cbOutConn;
    	char    szConnStr[255];
    
             strcpy(szConnStr,"DSN=YourANSIDSN;UID=YorUid;Pwd=YourPassword");
    	
    	iReturn= SQLDriverConnect(m_SQLConnection, NULL,
    (SQLTCHAR*) szConnStr,strlen(szConnStr), 
    (SQLCHAR*) szConnBuffer,1024, &cbOutConn, SQL_DRIVER_NOPROMPT);
    
    	if (iReturn != SQL_SUCCESS)
    	{
    		SQLGetDiagRec(SQL_HANDLE_DBC,m_SQLConnection,1,theDiagState,
    &theNativeState,theMessageText,100,&iOutputNo);
    	}
    
    	//Run query.
    	iReturn = SQLAllocHandle(SQL_HANDLE_STMT,m_SQLConnection,&m_SQLStatement);
    
    	//The Test table contains COL1 column which is set to empty for the first record.
    
    	iReturn = SQLExecDirect(m_SQLStatement, (SQLCHAR*) "Select ID,COL1 FROM Test",SQL_NTS);
    	iReturn = SQLFetch(m_SQLStatement);
    
    	iReturn = SQLGetData(m_SQLStatement,2,SQL_C_WCHAR,theData,100,&lStrLen);
    
    	//The problem does not occur if you bind the same column to SQL_C_CHAR.
    	//iReturn = SQLGetData(m_SQLStatement,2,SQL_C_CHAR,theData,100,&lStrLen);
    
    	if (iReturn != SQL_SUCCESS)
    	{
    		//iReturn will be 100 SQL_NO_DATA_FOUND here with NO other message.
    		int CheckHere;
    		CheckHere = 0;  //It will come here.
    		if (iReturn == SQL_NO_DATA_FOUND)
    		{
    			printf("SQL_NO_DATA_FOUND has been returned.\n Press Enter key to continue...\n");
    			getchar();
    		}
    		
    	}
    
    	//DISCONNECT.
    	iReturn = SQLFreeHandle(SQL_HANDLE_STMT,m_SQLStatement);
    	iReturn = SQLDisconnect(m_SQLConnection);
    	iReturn = SQLFreeHandle(SQL_HANDLE_DBC,m_SQLConnection);
    	iReturn = SQLFreeHandle(SQL_HANDLE_ENV,m_SQLEnvironment);
    
    	m_SQLStatement = NULL;
    	m_SQLConnection = NULL;
    	m_SQLEnvironment = NULL;
    
    	delete theMessageText; 
    	delete theDiagState;
    
    	return 1;
    }
    					
    Anda menerima pesan berikut ini:
    SQL_NO_DATA_FOUND telah kembali.
    Tekan tombol Enter untuk melanjutkan...

Properti

ID Artikel: 319243 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Data Access Components 2.7
Kata kunci: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 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:319243

Berikan Masukan