การแก้ไข: ตัวจัดการโปรแกรมควบคุม ODBC ไม่ถูกต้องรายงาน SQL_NO_DATA_FOUND สำหรับโปรแกรมควบคุม ANSI

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 319243 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณใช้โปรแกรมควบคุม ANSI ODBC ตัวจัดการโปรแกรมควบคุม ODBC อาจไม่ถูกต้องส่งคืน SQL_NO_DATA_FOUND สำหรับคอลัมน์ที่ถูกกำหนดเป็น VARCHAR หรืออักขระ และที่มีสตริงว่างใน ปัญหาเกิดขึ้น ถ้าคอลัมน์ประกอบด้วยข้อมูลบางอย่างหรือค่า "NULL" ปัญหานี้เท่านั้นเกิดขึ้นเมื่อ ข้อมูลเป็นสตริงว่าง และผูกจากฝั่งไคลเอ็นต์ด้วย SQL_C_WCHAR

สาเหตุ

ตัวจัดการโปรแกรมควบคุม ODBC ที่ไม่ถูกต้องสันนิษฐานที่ไดรเวอร์ ไม่มีข้อมูลใด ๆ เมื่อพยายามแปลงสายอักขระว่างจาก ANSI ไป UNICODE

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ ขอรับล่าสุด เซอร์วิสแพ็คสำหรับ Microsoft SQL Server 2000 สำหรับข้อมูลเพิ่มเติม หมายเลขบทความต่อไปนี้เพื่อดูบทความในความรู้ของ Microsoft ฐาน:
290211 INF: วิธีการขอรับ Service Pack 2000 ของเซิร์ฟเวอร์ SQL ล่าสุด

การหลีกเลี่ยงปัญหา

วิธีแก้ปัญหาง่าย ๆ สำหรับปัญหานี้คือการ ผูกคอลัมน์ เป็น 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 .NET ผู้ให้บริการ ด้วยโปรแกรมควบคุม ANSI โปรดสังเกตว่า Microsoft ODBC .NET ผู้ให้บริการ ส่งกลับค่า "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 เพื่อดำเนินต่อ...

คุณสมบัติ

หมายเลขบทความ (Article ID): 319243 - รีวิวครั้งสุดท้าย: 28 มิถุนายน 2556 - Revision: 4.0
ใช้กับ
  • Microsoft Data Access Components 2.7
Keywords: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้: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