2010-08-11 202 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)。你肯定需要在兩邊匹配的字符編碼,否則你將會有其他的虛假錯誤。