文章作者:jhkdiy
發(fā)表日期:2009-10-11
程序架構(gòu):B/S
開發(fā)環(huán)境:Windows XP + IIS6 + VS2003
數(shù) 據(jù) 庫:SQL Server 2000
部分功能:從 SQL Server 中導出數(shù)據(jù)到 Access。
這套系統(tǒng)做了大半年,這個導入導出還是問題不斷,我負責的這塊導入導出就是夾在網(wǎng)
絡(luò)版和單機版系統(tǒng)之間,只要任何一邊對數(shù)據(jù)庫做了改動這個導入導出就會失敗。哎,煩心
的事不止這些,最近又遇到了一個非常奇怪的問題。
由于之前的導入導出使用SQL Server 支持的OpenDataSource()函數(shù)來做,而當遇到
64位系統(tǒng)時就會遇到不支持Microsoft.Jet.OLEDB.4.0 ,所以重新編碼,技術(shù)步驟是先從SQL Server 讀數(shù)據(jù)到DataTable,然后遍歷這個DataTable,對每一行,將里面的數(shù)據(jù)重新組合成一條Insert 語句,然后打開Access文件鏈接,執(zhí)行剛才生成的Insert語句,將數(shù)據(jù)插入到Access中。
我最終提交給Access執(zhí)行的語句是根據(jù)SQL Server中的數(shù)據(jù)拼出來,比如SQL Server :select a, b, c from tblTemp
提交給Access執(zhí)行的語句就是:
現(xiàn)在是時候看看這條記錄的物理數(shù)據(jù)了:
天啊,竟然是0,真不曉得是怎么存進去的。問題終于知道在那了,但是要如何解決呢?最簡單的方法就是將這個0替換掉,于是使用下列語句測試:
select replace(demc, char(0), '') as demc from tblgc_jc_de
但是不行,原因是replace函數(shù)找不到0這個字符,因為它查找是按兩個字節(jié)來找的,所以直接在SQL Server上找也找不到這個字符,替換也替換不了。但是,我又想了一下,能不能使用二進制來查找和替換?看了一下資料,使用下面的SQL語句能找出0在該字段的位置:
查是能查出來了,但是我發(fā)現(xiàn)replace函數(shù)還是不能用,除非是替換4位,也就是0x0038。
最后實在無奈,只能直接把有這個特殊字符的地段截掉一個文字,也就是連那個38也不要了:
select
case when charindex(convert(varbinary(1),0x00),convert(varbinary(200),demc)) > 0
then substring(demc,1,len(demc)-1)
else demc
end as DEMC
from tblgc_jc_de
這就是我現(xiàn)在用的最終解決方案,因為我查詢過,4萬多條記錄中只有8條有這個0在字段里面。所以就算截掉一個文字并影響程序的功能和顯示。
雖然我現(xiàn)在寫出來很多步驟看似走的很順,其實這個問題我用了幾天時間了,主要是找問題所在耗費了不少時間。現(xiàn)在給出此文希望廣大朋友在找這些問題時多個方向,因為存儲在字段中的特殊字符不一定就是常規(guī)的回車換行符,也有可能是其它字符,在此大家互相學習提高吧。