ИСПРАВИТЬ: Диспетчер драйвера ODBC неправильно сообщает SQL_NO_DATA_FOUND драйвер ANSI

Переводы статьи Переводы статьи
Код статьи: 319243 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

При использовании драйвера ANSI ODBC, диспетчер драйверов ODBC для столбца, который определен как неправильно может вернуть SQL_NO_DATA_FOUND VARCHAR или CHAR и который содержит пустую строку. Проблема не возникает. Если столбец содержит некоторые данные, или значение «NULL». Проблема возникает, только если данные в пустую строку и связать его со стороны клиента с SQL_C_WCHAR.

Причина

Диспетчер драйверов ODBC ошибочно предполагает, что драйвер не имеет каких-либо данных, при попытке преобразования из ANSI в пустую строку ЗНАК ЮНИКОДА.

Решение

Чтобы устранить эту проблему, получить последние новости пакет обновления для Microsoft SQL Server 2000. Дополнительные сведения следующий номер статьи базы знаний Майкрософт Base:
290211 INF: Как получить последний Пакет обновления для SQL Server 2000

Временное решение

Простое решение этой проблемы является привязка столбца как SQL_C_CHAR вместо SQL_C_WCHAR.

Статус

Корпорация Майкрософт подтверждает, что это является проблемой в продуктах Майкрософт, перечисленных в начале этой статьи. Первое исправление этой проблемы появилось в Microsoft SQL Server 2000 Пакет обновления 3.

Дополнительная информация

Устаревшие приложения, использующие драйвер ANSI ODBC не может Эта проблема возникает в том случае, поскольку они не могут выполнить привязку столбца в виде SQL_C_WCHAR. Поскольку поставщик 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 была возвращена.
    Нажмите клавишу ВВОД для продолжения...

Свойства

Код статьи: 319243 - Последний отзыв: 28 июня 2013 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Data Access Components 2.7
Ключевые слова: 
kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 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