2010-08-11 97 views
5

我正在将访问2003数据库升级到SQL Server Express 2008.这些表似乎已创建好,数据看起来没问题。select语句中的“字符串数据,右截断”警告

我有一个连接到这个数据库的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

感谢您的帮助

+0

我们可以推测在数据库中,SerialNumber被存储为底层数据库中的12345678吗? – BIBD 2010-08-19 21:27:27

+0

什么是赏金?让它在没有新驱动的情况下工作?为什么有人想要这样做? – 2010-08-23 19:48:37

回答

2

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

2

从 更改我的司机 “驱动程序= {SQL服务器};” 至 Driver = {SQL Native Client};

已使问题消失,但我不确定发生了什么事情。我会继续研究它

+0

最可能的是它会是驱动程序,我之前也有与CSV相同的问题。我有一个数据例如192.168.1.1当它被迁移到SQL它变成192.1681,但是当更新使用不同的驱动程序它的工作。 – Raymund 2010-08-23 03:24:57

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;" 
+0

OP是否检查这是否纠正了非本地驱动程序的问题? – 2010-08-27 03:04:50

0

如果你绝对要挖的这条底线,做一个最小的存储过程将“选择”定义为varchar(17)的本地变量 - 任何大小超过原始大小的2倍。现在调用sproc而不是动态SQL并查看返回的内容。然后你可以用相同的大小重复它(nvarchar(8))。如果旧驱动程序容易混淆,那么你的小存储就可以作为简单的数据适配器,并且可以稳定打字 - 比摆脱表格定义更容易。

此外,检查inreface /连接类上是否有任何参数/属性指定字符编码并确保它是unicode(utf-16)。我假设你的代码是为unicode编译的。如果不是,你需要首先做出决定(Nvarchar中的N表示unicode,否则就是varchar)。你肯定需要在两边匹配的字符编码,否则你将会有其他的虚假错误。

相关问题