線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4301
推到 Plurk!
推到 Facebook!

ODAC設定造成CLOB顯示變成亂碼,是否有解?

答題得分者是:GrandRURU
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-03-16 15:24:14 IP:118.163.xxx.xxx 訂閱
小弟最近終於買了ODAC,想使用ODAC來達到客戶端免安裝免設定BDE就能使用
就設定方面測試了兩種

第一種可以在客戶端電腦未安裝Oracle的情況下開啟使用
[code delphi]
OraSession1.Options.Net:=true;//開啟為客戶端不需安裝Oracle的連接方式
OraSession1.Options.Direct:=True;
OraSession1.LoginPrompt:=false;
OraSession1.ConnectString:= 'Direct=True;Server=’ ServerIP ’;Port=' PORT
';SID=' SID ';User ID=' UserID ';Password=' PWD ;
OraSession1.Server := ServerIP ':' PORT ':' SID ;
[/code]

第二種在客戶端電腦還是必須要安裝Oracle客戶端才可使用
[code delphi]
OraSession1.Options.Net:=true;//開啟為客戶端不需安裝Oracle的連接方式
OraSession1.Options.Direct:=True;
OraSession1.LoginPrompt:=false;
OraSession1.ConnectString:='Data Source=' SID
';User ID=' USERID
';Password=' PWD
';Use Unicode=0';
[/code]

兩種都能執行,但在第二種情況下讀取CLOB到Richedit沒有問題,第一種情況下則是變成亂碼
亂碼情況如附件圖檔,左方是直接讀取欄位資料,右方是經過程式碼轉換後



[code delphi]
//轉換CLOB內文程式碼
try
AStream := TMemoryStream.Create;
TBlobField(OraQuery1.FieldByName('A1')).SaveToStream(AStream );
AStream .Position := 0;
RichEdit1.Lines.LoadFromStream(AStream );
finally
AStream .Free;
end;
[/code]

相同設定之下,讀取BLOB中的圖檔則不會出現問題,其他欄位中文字也都不會有問題
所以判斷應該是只有CLOB受到OraSession設定不同而影響
本來以為是語系的問題
但是OraSession不論怎麼設定語系或將UseUnicode設為True都沒有用
請問有沒有前輩有遇過這個問題?
該如何設定才能解決亂碼問題?
------
永遠都是新手
附加檔案:56e90a1e90699_test.PNG
編輯記錄
Reiji 重新編輯於 2016-03-16 15:30:53, 註解 無‧
Reiji 重新編輯於 2016-03-16 15:32:33, 註解 更新圖檔‧
Reiji 重新編輯於 2016-03-16 15:34:32, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-03-21 09:39:11 IP:59.120.xxx.xxx 訂閱
1.TOraSession.UseUnicode 設為 True
2.寫入TField/TParam 時,使用 .AsCLOBLocator.IsUnicode := True

試試看
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-03-29 08:55:15 IP:118.163.xxx.xxx 訂閱

===================引 用 GrandRURU 文 章===================
1.TOraSession.UseUnicode 設為 True
2.寫入TField/TParam 時,使用 .AsCLOBLocator.IsUnicode := True

感謝回答
1.設為True仍無效
2.寫入是正常的,是讀取出來的時候亂碼,如果用PLSQL Developer看CLOB的內容,是正常顯示的,但在Delphi上用第一種連線方式就會亂碼,第二種則正常

不過我還是試著修改寫入時的方法
原本是
[code delphi]
ParamByName('A1').LoadFromStream(A1').ParamType := ptInput;
ParamByName('A1').AsCLOBLocator.LoadFromStream(AStream);
[/code]

結果出現Lob parameter should be Input or Output
------
永遠都是新手
編輯記錄
Reiji 重新編輯於 2016-03-29 09:32:00, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-03-29 09:15:08 IP:59.120.xxx.xxx 訂閱
請你再試一下:
方法1:
var
BlobStream: TStringStream;
begin
BlobStream := TStringStream.Create('', TEncoding.UTF8);


如果還不行,請你再詳述一下你的作業系統和開發環境
以上
===================引 用 Reiji 文 章===================
1.設為True仍無效
2.寫入是正常的,是讀取出來的時候亂碼,如果用PLSQL Developer看CLOB的內容,是正常顯示的,但在Delphi上用第一種連線方式就會亂碼,第二種則正常
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-03-29 09:42:42 IP:203.69.xxx.xxx 訂閱
不好意思,我沒有說清楚我的開發環境
目前是還在使用D5,OS是XP,ODAC是9.4.14 for Delphi 5

所以
方法一:CreateBlobStream呼叫不出來,應該是D5不支援
方法二:出現Too many actual parameters,應該也是D5不支援...
剛剛發現測試機是10g環境,中文顯示沒有問題
但是正式機是8i環境,結果中文顯示就亂碼了
不過兩台機器的語系設定是相同的
nls_language=AMERICAN
language=TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5

謝謝!

===================引 用 GrandRURU 文 章===================
請你再試一下:
方法1:
var
BlobStream: TStringStream;
begin
BlobStream := TStringStream.Create('', TEncoding.UTF8);


如果還不行,請你再詳述一下你的作業系統和開發環境
以上
------
永遠都是新手
編輯記錄
Reiji 重新編輯於 2016-03-29 09:55:11, 註解 無‧
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-03-29 15:43:18 IP:203.69.xxx.xxx 訂閱
我試著改了一下程式
解決了Lob parameter should be Input or Output的問題
原來起因是再另一個Blob的欄位上,因為測試的時候沒有傳圖片

首先TOraSession.UseUnicodeA1').ParamType := ptInput;
ParamByName('PLSQL Developer上就無法看見CLOB內容,相對於之前存入的資料,它會顯示
如圖標示:
和右邊的「...」按下都可以直接看到內容,只有的點選了毫無反應

在Toad時則是直接出現「ORA-03120:雙工轉換常式 : 發生整數上限溢位.」然後就要強制關閉Toad才能再使用了

不知道這是何解?
能正確用ODAC顯示了卻無法在資料庫工具中顯示,能在工具中顯示了又在ODAC會有問題
------
永遠都是新手
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-03-29 17:56:41 IP:59.120.xxx.xxx 訂閱
AsCLOBLocator 過時了,建議使用 AsOraClob 處理

寫入的部份請參閱:

===================引 用 Reiji 文 章===================
我試著改了一下程式
解決了Lob parameter should be Input or Output的問題
原來起因是再另一個Blob的欄位上,因為測試的時候沒有傳圖片

首先TOraSession.UseUnicodeA1').ParamType := ptInput;
ParamByName('PLSQL Developer上就無法看見CLOB內容,相對於之前存入的資料,它會顯示
如圖標示:
和右邊的「...」按下都可以直接看到內容,只有的點選了毫無反應

在Toad時則是直接出現「ORA-03120:雙工轉換常式 : 發生整數上限溢位.」然後就要強制關閉Toad才能再使用了

不知道這是何解?
能正確用ODAC顯示了卻無法在資料庫工具中顯示,能在工具中顯示了又在ODAC會有問題
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-03-30 08:42:26 IP:59.120.xxx.xxx 訂閱
Devart 官方針對這個問題有回覆了,說明如下:

「他們停止對 Delphi 5 支援已經有很久一段時間了,我們最後重現這個問題的版本是:Delphi 6 ODAC 9.6.22 。」

原文:
Unfortunately, we have discontinued support for Delphi 5 for a long time. The oldest supported IDE version is Delphi 6. Try to reproduce the issue on the latest ODAC version 9.6.22

不過好像沒有說是否解決了這個問題?

以上
編輯記錄
GrandRURU 重新編輯於 2016-03-30 08:43:29, 註解 無‧
GrandRURU 重新編輯於 2016-03-30 09:22:45, 註解 無‧
系統時間:2024-04-26 2:56:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!