全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6437
推到 Plurk!
推到 Facebook!

如何簡單的將UNICODE Insert 到 資料庫 ??

尚未結案
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-13 02:56:19 IP:61.64.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-13 11:39:04 IP:203.95.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-13 14:32:54 IP:61.220.xxx.xxx 未訂閱
引言: 若是可以經由自行利用 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;
多謝timhuang的意見, 但我實際測試了一下結果還是會有問號的情況產生 塞進去後 F3 欄位的值還是 幻?:?形金?-汽?也可以?? 還有其他要注意的地方沒注意到嗎? Nice to meet u
------
Nice to meet u
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-13 16:41:37 IP:203.95.xxx.xxx 未訂閱
請問你的資料庫是什麼呢? 若是 MSSQL 的話, 該欄位必須是 nchar 或是 nvarchar 才行哦!!
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-13 18:34:39 IP:61.220.xxx.xxx 未訂閱
引言: 請問你的資料庫是什麼呢? 若是 MSSQL 的話, 該欄位必須是 nchar 或是 nvarchar 才行哦!!
是MSSQL沒錯,且每個欄位都已是 nvarchar Nice to meet u
------
Nice to meet u
nox
一般會員


發表:0
回覆:2
積分:0
註冊:2003-10-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-13 20:35:12 IP:61.216.xxx.xxx 未訂閱
SQL 使用  
  INSERT INTO [user].[table] ( [col] ) VALUES ( N'UNICODE' )
 
而 [col] 型態為 NVARCHAR or NTEXT ...
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-13 21:05:36 IP:61.220.xxx.xxx 未訂閱
引言: SQL 使用
  INSERT INTO [user].[table] ( [col] ) VALUES ( N'UNICODE' )
 
而 [col] 型態為 NVARCHAR or NTEXT ...
嗯....這個方法我有試過 但塞進去還是會有問號的情況 主要是TAdoCommand 的 Commandtext or TAdoQuery 的 SQL.Text 直接Assign Unicode 值 都會照成失真,進資料庫後就變成 ?xx?xxx了 tmp := 'Insert Into test Values (' 'N' QuotedStr(<>)) ',' 'N' QuotedStr(<>) ',' 'N' QuotedStr(<>) ')'; adoCm.CommandText := tmp; Nice to meet u
------
Nice to meet u
nox
一般會員


發表:0
回覆:2
積分:0
註冊:2003-10-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-13 21:37:35 IP:61.216.xxx.xxx 未訂閱
問題不是在 SQL 上, 而是 Delphi 處理 UNICODE 的方法... 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28163
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-14 09:49:41 IP:203.95.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-14 23:35:09 IP:61.64.xxx.xxx 未訂閱
引言: 若沒有錯的話, 我們再來看是不是和資料庫這裡有關. 若是到這裡就顯示不正確的話, 就表示取出就有問題, 或是檔案的內容本來就有問題!!
我使用了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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-16 01:43:27 IP:61.64.xxx.xxx 未訂閱
裝了Unicode補完計劃 http://cpatch.org/unicode/ 所有問題都解決了.. 也不用使用Parameters 直接   Insert Into services Values (' + <> ',' <> ',' <> ')'; 再 Execute 中文 日文 檢體 都OK了 timhuang 不知道您是不是也有裝 補完計劃呢? Nice to meet u
------
Nice to meet u
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-16 09:17:52 IP:203.95.xxx.xxx 未訂閱
Hi, 我是沒有安裝過那個 package. 但是朋友在 delphi 6 的環境下確實會發生你說的狀況, 就是會變為 ftFixedChar 的問題, 我在 delphi 7 是正常的, 我自己還沒有測過 delphi 6, 有機會會再試看看. delphi 6 為什麼會有這個問題我不清楚. 但使用 widestring 來處理 unicode 是沒錯的, 不過為什麼你安裝完成 [補完計畫] 後就可以了, 是不是 DataType 還是 ftFixedChar 呢? 這些問題應該再進一步釐清, 否則是不是使用者的電腦都要裝一下呢?  有機會我再找找看有無相關的資料, 也謝謝你提供的資訊!!
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-04-18 22:57:25 IP:61.64.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-11-08 10:06:31 IP:61.219.xxx.xxx 訂閱

裝了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 ...







編輯記錄
shunchia63 重新編輯於 2007-11-08 12:13:59, 註解 無‧
shunchia63 重新編輯於 2008-07-01 19:20:33, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-10-22 21:36:36 IP:60.248.xxx.xxx 訂閱
我想應該有答案了,請參考如下資料。

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
系統時間:2024-04-29 20:07:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!