select语句中的“字符串数据,右截断”警告

时间:2010-08-11 13:05:37

标签: sql-server ms-access mfc odbc

我正在将访问2003数据库扩展到SQL Server Express 2008.这些表似乎已创建正常,数据看起来还不错。

我有一个连接到此数据库的MFC应用程序。它可以很好地连接到访问,但是当我连接到SQL Server时,我在select语句中收到以下错误。

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 个答案:

答案 0 :(得分:2)

更改我的驱动程序     “Driver = {SQL Server};” 至     Driver = {SQL Native Client};

让问题消失了,但我不确定发生了什么。我要继续研究它

答案 1 :(得分:2)

我同意这与驱动程序有关。引入了{SQL Server}驱动程序以与SQL 2000一起使用。{SQL Native Client}与2005一起出现。理想情况下,对于2008数据库,您应该使用最新的{SQL Server Native Client 10.0}。较新的驱动程序向后兼容旧版本的SQL Server。

答案 2 :(得分:1)

从谷歌搜索中,我已经了解到,有时,特别是在MS SQL Server ODBC驱动程序DSN设置对话框中选中“使用区域设置”时,ODBC将处理由所有数字组成的字符串,作为一个数字,并返回它像“12345678.00”,它不适合你给它的空间。解决方案是在对话框中关闭该设置,或者更永久地在连接字符串中关闭该设置:

 CString sDsn = "Driver={SQL Server};Server=server\\db;Database=Boards;"
               +"Uid=uid;Pwd=pwd;Trusted_Connection=False;Regional=No;"

答案 3 :(得分:0)

如果你绝对需要深入研究,请制作一个最小的存储过程,将“选择”定义为varchar(17)的局部变量 - 任何大小超过原始大小的2倍。现在调用sproc而不是动态SQL,看看会发生什么。然后你可以用完全相同的大小重复它(nvarchar(8))。你的小sproc可以作为简单的数据适配器,如果老驱动程序容易混淆,可以稳定输入 - 比摆弄表定义容易得多。

另外,检查inreface / connection类中是否有任何param / property来指定字符编码并确保它是unicode(utf-16)。我假设你的代码是为unicode编译的。如果没有,你需要首先做出决定(Nvarchar中的N表示unicode,否则它只是varchar)。你肯定需要在两侧匹配字符编码,否则你会有其他虚假错误。