Предупреждение «Строковые данные, правое усечение» в операторе выбора - PullRequest
5 голосов
/ 11 августа 2010

Я масштабирую базу данных Access 2003 до SQL Server Express 2008. Кажется, что таблицы созданы нормально, а данные выглядят нормально.

У меня есть приложение MFC, которое подключается к этой базе данных. Соединение с доступом работало нормально, но при подключении к SQL Server я получаю следующую ошибку в операторе выбора.

DBMS: Microsoft SQL Server
Version: 10.50.1600
ODBC Driver Manager Version: 03.80.0000
Warning: ODBC Success With Info on field 0.
String data, right truncation

State:01004,Native:0,Origin:[Microsoft][ODBC SQL Server Driver]

Возвращаемые данные должны содержать 8 символов, но только 7 с урезанием самого правого символа.

Интерфейс доступа может правильно считывать данные с SQL Server.

Поле в таблице SQL Server определяется как nvarchar длиной 8.

Код для чтения поля выглядит примерно так:

CDatabase Database;
CString sSerialNumber = "00000000";
CString SqlString;

CString sDsn = "Driver={SQL Server};Server=server\\db;Database=Boards;Uid=uid;Pwd=pwd;Trusted_Connection=False";
Database.Open(NULL,false,false,sDsn);

CRecordset recset( &Database );
SqlString.Format("Select SerialNumber from boards where MACAddress = '%s'",mac);
recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
recset.GetFieldValue("SerialNumber",sSerialNumber);

После этого sSerialNumber должен быть 12345678, но его 1234567

Спасибо за помощь

Ответы [ 4 ]

2 голосов
/ 23 августа 2010

Я бы согласился, что это связано с драйвером.Драйвер {SQL Server} был введен для использования с SQL 2000. {Собственный клиент SQL} вышел вместе с 2005 годом. В идеале, для вашей базы данных 2008 года вы должны использовать самый новый {Собственный клиент SQL Server 10.0}.Новые драйверы обратно совместимы с более старыми версиями SQL Server.

2 голосов
/ 13 августа 2010

Смена драйвера с "Driver = {SQL Server};" в Driver = {собственный клиент SQL};

устраняет проблему, но я не уверен, что происходит. Я буду продолжать смотреть на это

1 голос
/ 25 августа 2010

Из небольшого количества Google я узнал, что, по-видимому, иногда, особенно когда в диалоговом окне настройки DSN драйвера MS SQL Server установлен флажок «Использовать региональные настройки», ODBC будет обрабатывать строку, состоящую из всех цифр,как число, и верните его как «12345678.00», который не помещается в пространство, которое вы ему дали.Решение состоит в том, чтобы отключить эту настройку либо в диалоговом окне, либо, более постоянно, в строке подключения:

 CString sDsn = "Driver={SQL Server};Server=server\\db;Database=Boards;"
               +"Uid=uid;Pwd=pwd;Trusted_Connection=False;Regional=No;"
0 голосов
/ 26 августа 2010

Если вам абсолютно необходимо докопаться до сути, создайте минимальную хранимую процедуру, которая «выберет» локальную переменную, определенную как varchar (17) - подойдет любой размер, более чем в 2 раза превышающий ваш первоначальный размер. Теперь вызовите sproc вместо динамического SQL и посмотрите, что получится. Затем вы можете повторить его с точно таким же размером (nvarchar (8)). Ваш маленький подручный служит в качестве простого адаптера данных и стабилизирует набор текста, если старый драйвер может запутаться - гораздо проще, чем возиться с определением таблицы.

Кроме того, проверьте, есть ли параметр / свойство в классах inreface / connection для указания кодировки символов и убедитесь, что это Unicode (utf-16). Я предполагаю, что ваш код скомпилирован для Unicode. Если нет, вам нужно сначала принять решение об этом (N в Nvarchar означает Unicode, иначе это будет просто VARCHAR). Вам определенно нужно сопоставить кодировку символов с обеих сторон, иначе у вас будут другие ложные ошибки.

...