ΕΠΙΔΙΌΡΘΩΣΗ: Διαχείριση προγραμμάτων οδήγησης ODBC αναφέρει εσφαλμένα SQL_NO_DATA_FOUND για το πρόγραμμα οδήγησης ANSI

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 319243 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν χρησιμοποιείτε ένα πρόγραμμα οδήγησης ANSI ODBC, η διαχείριση προγραμμάτων οδήγησης ODBC μπορεί να μην επιστρέψουν SQL_NO_DATA_FOUND για μια στήλη που έχει οριστεί ως VARCHAR ή CHAR και που έχει μια κενή συμβολοσειρά. Το πρόβλημα δεν παρουσιάζεται Εάν η στήλη περιέχει ορισμένα δεδομένα ή μια τιμή "NULL". Το ζήτημα παρουσιάζεται μόνο εάν τα δεδομένα είναι μια κενή συμβολοσειρά και συνδέετε από την πλευρά του υπολογιστή-πελάτη με SQL_C_WCHAR.

Αιτία

Η διαχείριση προγραμμάτων οδήγησης ODBC εσφαλμένα θεωρείται ότι το πρόγραμμα οδήγησης δεν περιέχει δεδομένα, όταν προσπαθεί να μετατρέψει την κενή συμβολοσειρά από ANSI σε UNICODE.

Προτεινόμενη αντιμετώπιση

Για να επιλύσετε αυτό το ζήτημα, αποκτήστε το πιο πρόσφατο Service pack για Microsoft SQL Server 2000. Για πρόσθετες πληροφορίες, κάντε κλικ στο κουμπί στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο στη Microsoft γνώσεων Βάση:
290211 INF: Τον τρόπο απόκτησης του τελευταίου Service Pack του SQL Server 2000

Εναλλακτικός τρόπος αντιμετώπισης

Μια απλή λύση για αυτό το πρόβλημα είναι η σύνδεση της στήλης ως SQL_C_CHAR αντί SQL_C_WCHAR.

Κατάσταση

Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα στα προϊόντα της Microsoft που παρατίθενται στην αρχή αυτού του άρθρου. Το ζήτημα αυτό διορθώθηκε αρχικά στο Microsoft SQL Server 2000 Service Pack 3.

Περισσότερες πληροφορίες

Παλαιού τύπου εφαρμογές που χρησιμοποιούν ένα πρόγραμμα οδήγησης ANSI ODBC δεν επιτρέπεται αντιμετωπίζετε αυτό το πρόβλημα, επειδή αυτές δεν μπορεί να συνδέσετε τη στήλη ως SQL_C_WCHAR. Επειδή η υπηρεσία παροχής Microsoft ODBC .NET συνδέει στήλες χαρακτήρων ως SQL_C_WCHAR από προεπιλογή, ενδέχεται να αντιμετωπίσετε αυτό το πρόβλημα εάν χρησιμοποιείτε το Microsoft ODBC. Η υπηρεσία παροχής με ένα πρόγραμμα οδήγησης ANSI. Σημειώστε ότι η υπηρεσία παροχής .NET Microsoft ODBC Επιστρέφει "NO_DATA", όταν παρουσιαστεί αυτό το ζήτημα.

Βήματα για την αναπαραγωγή συμπεριφοράς

Το ακόλουθο δείγμα εγγενή παρουσιάζει το πρόβλημα:
  1. Χρησιμοποιήστε την ακόλουθη δέσμη ενεργειών για να δημιουργήσετε έναν πίνακα και τοποθετήστε ένα δίσκο εγγραφή:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Εκτελέστε το παρακάτω πρόγραμμα C:
    #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;
    }
    					
    Λαμβάνετε το ακόλουθο μήνυμα:
    SQL_NO_DATA_FOUND έχει επιστραφεί.
    Πατήστε το πλήκτρο Enter για να συνεχίσετε...

Ιδιότητες

Αναγν. άρθρου: 319243 - Τελευταία αναθεώρηση: Παρασκευή, 28 Ιουνίου 2013 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Data Access Components 2.7
Λέξεις-κλειδιά: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο έχει μεταφραστεί χρησιμοποιώντας λογισμικό μηχανικής μετάφρασης της Microsoft και μπορείτε να το διορθώσετε χρησιμοποιώντας την τεχνολογία Community Translation Framework (CTF) (Πλαίσιο μετάφρασης κοινότητας). Η Microsoft παρέχει μηχανική μετάφραση, επεξεργασία μετά τη μηχανική μετάφραση από την κοινότητα και άρθρα μεταφρασμένα από επαγγελματίες προκειμένου να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής βάσης σε πολλές γλώσσες. Τα άρθρα μηχανικής μετάφρασης και αυτά που επεξεργάζονται ύστερα από μηχανική μετάφραση ενδέχεται να περιέχουν σφάλματα στο λεξιλόγιο, στη σύνταξη ή/και στη γραμματική. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες μας. Για περισσότερες πληροφορίες σχετικά με το CTF, μεταβείτε στην τοποθεσία http://support.microsoft.com/gp/machine-translation-corrections/el.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 319243

Αποστολή σχολίων

 

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