2012-05-15 88 views
1

我已經在Delphi XE2中編寫了下面的代碼。TParam.LoadFromStream在Delphi XE2中不起作用?

var 
stream : TStringStream; 

begin 
stream := TStringStream.Create; 

//Some logic to populate stream from memo. 

ShowMessage(stream.datastring); //This line is showing correct data 

// some Insert query with below parameter setting 
ParamByName('Text').LoadFromStream(stream , ftMemo); 

但是,這是存儲文本爲?在桌子裏。

這種類型的代碼是在Delphi 4

工作正常,是否有TParam.LoadFromStream功能在Delphi XE2任何問題?

編輯: 表字段的類型是'文本'。

+0

這顯然是一個編碼問題,但我不確定不匹配的地方。這裏是候選人:1. TStringString有一個默認爲ANSI的Encoding屬性。調用LoadFromStream時,您可以使用ftMemo或ftWideMemo。數據庫字段有一個編碼。 –

+0

相同的代碼與Delphi 4一起正常工作。 – Dev

+0

Delphi 4使用ANSI。 XE2是Unicode。 –

回答

1

在做了一些試驗和錯誤的方法後,我找到了解決這個問題的辦法。 我們可以使用下面的代碼,

ParamByName('Text').AsMemo := SampleMemo.Text; 
1

您的問題的根源在於TStringStream不D2009 +的操作方式相同,因爲它在D4一樣。

在D4中,TStringStream是一個圍繞AnsiString變量的簡單包裝。 DataString屬性簡單地返回對該變量的直接引用,並且所有讀/寫操作都直接在變量的內容上進行操作。流的字節和字符串基本上是一回事。

在D2009 +中,TStringStream現在是一個TBytes編碼字節數組的封裝,而默認編碼是您的應用運行的操作系統的默認Ansi編碼。如果使用WriteString()向流寫入字符串,則它將使用流的編碼從Unicode編碼爲字節,然後存儲這些編碼的字節。如果使用ReadString()從流中讀取字符串,或者讀取DataString屬性,則存儲的字節將被解碼爲Unicode字符串。任何其他讀/寫操作都會對原始編碼字節進行操作,就像任何其他流類型一樣。所以當你撥打TParam.LoadFromStream()時,它讀取原始編碼字節,而不是Unicode字符串。流的原始字節和字符串字符是不是一個和同樣的事情了。因此,您在ShowMessage()中看到的數據與TParam看到的數據不同。