Düzeltme: ODBC Sürücü Yöneticisi hatalı SQL_NO_DATA_FOUND için ANSI sürücüsünün bildirir

Makale çevirileri Makale çevirileri
Makale numarası: 319243 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

ANSI ODBC sürücüsü, ODBC Sürücü Yöneticisi kullandığınızda SQL_NO_DATA_FOUND olarak tanımlanmış bir sütun için yanlış döndürebilir VARCHAR veya CHAR ve, sahip boş bir dize içinde. Sorun oluşmaz Bazı veriler veya "Boş" bir değer sütun içeriyorsa. Sorun yalnızca oluşur verileri boş bir dizedir ve istemci tarafındaki ile bağlayın SQL_C_WCHAR.

Neden

ODBC Sürücü Yöneticisi hatalı varsayar sürücü boş dize ANSI'ye dönüştürme çalıştığında herhangi bir veri yok. UNICODE.

Çözüm

Bu sorunu gidermek için en son elde edilir. Microsoft SQL Server 2000 hizmet paketi. Ek bilgi için tıklatın Microsoft Knowledge makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın Base:
290211 BİLGİ: en son SQL Server 2000 hizmet paketini edinme

Pratik Çözüm

Sütun bağlamak için basit bir çözüm bu sorunu olan bir SQL_C_CHAR SQL_C_WCHAR yerine.

Durum

Microsoft listelenen Microsoft ürünlerinde bir sorun olduğunu onaylamıştır Bu makalenin başında. Bu sorun ilk olarak Microsoft SQL Server'da giderilmiştir 2000 Service Pack 3.

Daha fazla bilgi

ANSI ODBC sürücüsü kullanan eski uygulamalar olabilir. Bunlar sütun SQL_C_WCHAR olarak bağlamak değil çünkü bu sorunla karşılaşırsınız. Microsoft ODBC .NET sağlayıcı SQL_C_WCHAR karakter sütunları bağlar çünkü Varsayılan olarak, Microsoft ODBC .NET kullanıyorsanız, bu sorunla karşılaşabilirsiniz Sağlayıcı ile bir ANSI sürücüsünün. Dikkat Microsoft ODBC .NET sağlayıcı Bu sorun oluştuğunda, "NO_DATA" döndürür.

Davranışı Yeniden Oluşturma Adımları

Aşağıdaki örnek yerel sorunu göstermektedir:
  1. Aşağıdaki komut dosyası bir disk takın ve bir tablo oluşturmak için kullanın kayıt:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Aşağıdaki C programı çalıştırın:
    #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;
    }
    					
    Aşağıdaki iletiyi alırsınız:
    SQL_NO_DATA_FOUND verdi.
    Devam etmek için Enter tuşuna basın...

Özellikler

Makale numarası: 319243 - Last Review: 28 Haziran 2013 Cuma - Gözden geçirme: 7.0
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Data Access Components 2.7
Anahtar Kelimeler: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 319243

Geri Bildirim Ver

 

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