FIX: ODBC Driver manajer salah laporan SQL_NO_DATA_FOUND ANSI driver

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

Pada Halaman ini

Gejala

Bila Anda menggunakan driver ANSI ODBC, pengelola Driver ODBC mungkin salah kembali SQL_NO_DATA_FOUND untuk kolom yang didefinisikan sebagai VARCHAR atau CHAR dan yang memiliki string kosong di dalamnya. Masalah tidak terjadi Jika kolom ini berisi beberapa data atau nilai "NULL". Masalah ini hanya terjadi jika data adalah string kosong dan Anda mengikatnya dari sisi klien dengan SQL_C_WCHAR.

Penyebab

Pengelola Driver ODBC salah mengasumsikan bahwa sopir tidak memiliki data ketika mencoba untuk mengkonversi string kosong dari ANSI untuk UNICODE.

Pemecahan masalah

Untuk mengatasi masalah ini, mendapatkan terbaru Service Pack untuk Microsoft SQL Server 2000. Untuk informasi tambahan, klik nomor artikel berikut ini untuk melihat artikel di Microsoft Knowledge Base:
290211 INF: Cara mendapatkan Service Pack SQL Server 2000

Teknik pemecahan masalah

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

Status

Microsoft telah mengkonfirmasi bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana didaftar di awal artikel ini. Masalah ini pertama kali dikoreksi di Microsoft SQL Server 2000 Service Pack 3.

Informasi lebih lanjut

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

Langkah-langkah mereproduksi perilaku

Asli contoh berikut menunjukkan masalah:
  1. Menggunakan script berikut untuk membuat Daftar Tabel dan masukkan salah satu Catatan:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Jalankan program C 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:
    SQL_NO_DATA_FOUND telah kembali.
    Tekan tombol tekan Enter untuk melanjutkan...

Properti

ID Artikel: 319243 - Kajian Terakhir: 28 Juni 2013 - Revisi: 3.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 oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.
Klik disini untuk melihat versi Inggris dari artikel ini: 319243

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