如何簡單的將UNICODE Insert 到 資料庫 ?? |
尚未結案
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
INI檔內容為 [MY Section]
A1=ENGLISH ABCDEFG
A2=反清復明救中國
A3=幻灯:变形金刚-汽车也可以这样 利用 TntIniFile 可以將 A1 A2 A3 讀出來
但問題是將A1, A2 ,A3 存入資料庫 再繁體的環境下 A3 會有問題 EX: 利用AdoCommand CommandText 為 Insert Into test (F1, F2, F3) Values
(QuotedStr(A1) ',' QuotedStr(A2) ',' QuotedStr(A3)) Execute 後 F3欄位的 的值會是 ==> 幻?:?形金?-汽?也可以?? 曾經嘗試過 用 ADOQuery append/post 的方式是可行沒錯
不過對整個Project 的異動過大 所以想請問有沒有比較好的方法 或有Support Unicode 的ado 元件 Nice to meet u
------
Nice to meet u |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
hi, TIniFile 本身就不 support unicode 了, 所以你在讀出來的時候應該就已經不是原來的 unicode 簡體字, 所以沒有辦法去處理. 若是可以經由自行利用 GetPrivateProfileStringW api 來讀取 unicode 的 ini file, 然後再利用 ADOQuery 存入即可, ADO 本身是 support unicode 的, 利用 parameters 來設定 type 即可順利存入, 參考範例如下:
procedure TForm1.Button4Click(Sender: TObject); var wstr: Array[0..2048] of WideChar; ws: Widestring; begin GetPrivateProfileStringW('MY Section', 'A3', '', PWideChar(@wstr), 2048, 'c:\1.ini'); ws := wstr; ADOQuery1.SQL.Text := 'Insert Into test (F1, F2, F3) Values (:v1, :v2, :v3)'; ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true); //... assign v1, v2 .. ADOQuery1.Parameters.ParamByName('v3').DataType := ftWideString; ADOQuery1.Parameters.ParamByName('v3').Value := ws; ADOQuery1.ExecSQL; end; |
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: 若是可以經由自行利用 GetPrivateProfileStringW api 來讀取 unicode 的 ini file, 然後再利用 ADOQuery 存入即可, ADO 本身是 support unicode 的, 利用 parameters 來設定 type 即可順利存入, 參考範例如下:多謝timhuang的意見, 但我實際測試了一下結果還是會有問號的情況產生 塞進去後 F3 欄位的值還是 幻?:?形金?-汽?也可以?? 還有其他要注意的地方沒注意到嗎? Nice to meet uprocedure TForm1.Button4Click(Sender: TObject); var wstr: Array[0..2048] of WideChar; ws: Widestring; begin GetPrivateProfileStringW('MY Section', 'A3', '', PWideChar(@wstr), 2048, 'c:\1.ini'); ws := wstr; ADOQuery1.SQL.Text := 'Insert Into test (F1, F2, F3) Values (:v1, :v2, :v3)'; ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true); //... assign v1, v2 .. ADOQuery1.Parameters.ParamByName('v3').DataType := ftWideString; ADOQuery1.Parameters.ParamByName('v3').Value := ws; ADOQuery1.ExecSQL; end;
------
Nice to meet u |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
|
nox
一般會員 發表:0 回覆:2 積分:0 註冊:2003-10-20 發送簡訊給我 |
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: SQL 使用嗯....這個方法我有試過 但塞進去還是會有問號的情況 主要是TAdoCommand 的 Commandtext or TAdoQuery 的 SQL.Text 直接Assign Unicode 值 都會照成失真,進資料庫後就變成 ?xx?xxx了 tmp := 'Insert Into test Values (' 'N' QuotedStr(<INSERT INTO [user].[table] ( [col] ) VALUES ( N'UNICODE' )而 [col] 型態為 NVARCHAR or NTEXT ...
------
Nice to meet u |
nox
一般會員 發表:0 回覆:2 積分:0 註冊:2003-10-20 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 基本上, 弟貼上來的程式碼是已經測試無誤的, 而且是可以工作, 寫入是正常的, 利用參數法可以很確實的將 unicode 寫入 mssql 資料庫中, 而且從資料庫也可以正確的看到寫入的 unicode 簡體字無誤. 請先確認 ini 檔內容原本就無誤的狀況下再執行一次, 若還是不行, 請你試著在 ws:=wstr 這行後面加上 MessageBoxW(Handle, PWideChar(ws), 'read WideString', MB_OK); 看執行到這裡時, 是不是可以正常地顯示出來, 也就是確認取出值無誤! (ShowMessage 一樣是不 support unicode 的, 所以也必須使用 MessageBoxW 這個 api 來進行顯示 widestring 的字元) 若沒有錯的話, 我們再來看是不是和資料庫這裡有關. 若是到這裡就顯示不正確的話, 就表示取出就有問題, 或是檔案的內容本來就有問題!!
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: 若沒有錯的話, 我們再來看是不是和資料庫這裡有關. 若是到這裡就顯示不正確的話, 就表示取出就有問題, 或是檔案的內容本來就有問題!!我使用了MessageBoxW(Handle, PWideChar(ws), 'read WideString', MB_OK); Show出來的值是 幻灯:变形金刚-汽车也可以这样 沒有錯 繼續往下RUN 後 ADOQuery1.Parameters.ParamByName('v3').DataType := ftWideString; ADOQuery1.Parameters.ParamByName('v3').Value := ws; 中斷點設在 ADOQuery1.Parameters.ParamByName('v3').Value := ws; 結果剛剛Assign 的DataType := ftWideString; 變成 ftFixedChar; 而且屢是不爽,真是太神奇啦 我在研究看看~^@! Nice to meet u
------
Nice to meet u |
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 我是沒有安裝過那個 package. 但是朋友在 delphi 6 的環境下確實會發生你說的狀況, 就是會變為 ftFixedChar 的問題, 我在 delphi 7 是正常的, 我自己還沒有測過 delphi 6, 有機會會再試看看. delphi 6 為什麼會有這個問題我不清楚. 但使用 widestring 來處理 unicode 是沒錯的, 不過為什麼你安裝完成 [補完計畫] 後就可以了, 是不是 DataType 還是 ftFixedChar 呢? 這些問題應該再進一步釐清, 否則是不是使用者的電腦都要裝一下呢?
有機會我再找找看有無相關的資料, 也謝謝你提供的資訊!!
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: Hi, 我是沒有安裝過那個 package. 但是朋友在 delphi 6 的環境下確實會發生你說的狀況, 就是會變為 ftFixedChar 的問題, 我在 delphi 7 是正常的, 我自己還沒有測過 delphi 6, 有機會會再試看看. delphi 6 為什麼會有這個問題我不清楚. 但使用 widestring 來處理 unicode 是沒錯的, 不過為什麼你安裝完成 [補完計畫] 後就可以了, 是不是 DataType 還是 ftFixedChar 呢? 這些問題應該再進一步釐清, 否則是不是使用者的電腦都要裝一下呢? 有機會我再找找看有無相關的資料, 也謝謝你提供的資訊!! >>< face="Verdana, Arial, Helvetica"> timhuang 您好 我裝了Delphi 7 & Try 後發現型態 還是assign 不了 ftWideString but 我的系統是安裝了d6 後 再裝d7 的 不知道這點有沒有差 至於安裝補完計劃後 DataType 還是維持 ftFixedChar but 就是可以Insert 正確(無問號)的情況 關於這個問題 Project應用到的部分主要是在Server端,若補完計劃可support 安裝的部分不至於造成太大的effort ftWideString 的部分真是太奇怪了 不曉得其他人是否有同樣的情況 Nice to meet u
------
Nice to meet u |
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
裝了Unicode補完計劃 可以嗎? <--測了一樣'?'號 存取 (CRUD) 不行 在來的話就是UI 跟commandText 關係 故UI 要支援Unicode 可以用TNT套件 SQL Table 要開NChar or NVChar Client SQL 語法 CAST NCHAR or NVarChr 轉型即可 存取UniCode Field 實際驗測後 delphi 6 ado XP SQL2K 經本人驗測後 存取 (CRUD) 皆OK .不用外掛其它特別的Unicode ADO ...
編輯記錄
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我想應該有答案了,請參考如下資料。
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=95613 個人覺得tadoquery裡的text是 AnsiString,若是把 unicode的資料"加"入,在unicode轉anistring的過程就完蛋了。 所以若是一開始把變數設成anistring或是直接把常數字串直接加好,然後由compiler自己轉型成widestring這就有問題。 故一開始就該設定一個變數為 widestring,然後把insert into 等常數字串設進去。接下來再把unicode的值加入…這樣就沒有轉換問題,然後配合 TAdocommand裡的text,這個text是widestring,與TADoQuery.SQL.Text的型別是不一樣的! 加上注意N的使用與nvarchar的配合就一定搞定!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |