2012-05-24 37 views
1

我在C#中創建了一個Windows窗體GUI,它可以在DataGridView中顯示錶格數據(針對Oracle Server DB的SQL查詢的結果)。 其中一個字段是一個XML,可能相當大,作爲CLOB存儲(字符大的對象,如果我是對的)。 當然,用戶不會直接查看單元格,他寧願雙擊單元格以查看該文件的漂亮打印。 問題是我需要將文件(這是一個CLOB)轉換爲.NET字符串,否則它會生成一個異常。 作爲解決方法,我試過使用Oracle to_char過程,但限制爲4000個字符。所以,我把文件的一個是這樣的:將大型CLOB對象轉換爲.NET字符串以放入DataGridView單元

select to_char(dbms_lob.substr(column_name, 4000, 1)) 

的問題是,它沒有,如果它包含超過4000個字符顯示整個文件。 我怎麼能繞過這個限制?

回答

1

我用簡單:

if (reader.IsDBNull(i)) 
{ 
    cellValue = "NULL"; 
} 
else 
{ 
    OracleLob clob = reader.GetOracleLob(i); 
    cellValue = (string) clob.Value; 
} 
+0

它太慢了......是否可以將它轉換爲服務器端的字符串? –

3

不要將CLOB或結果字符串存儲在DataGridView中。

取而代之,捕獲DataGridView中的click事件,然後將CLOB轉換爲字符串以供查看。使用System.Text.Encoding的適當編碼。

我假設你的DataReader或DataAdapter(無論你填充DataSet的方式)都會將你的CLOB存儲在一個字節數組中。 (就像使用SQLServer和Informix驅動程序一樣)。

byte[] clob; 
// get it from your datarow/datagridview bound item 
string thexml = System.Text.Encoding.UTF8.GetString(theclob) 
+0

你如何填充從OracleDataReader對象的字節數組?有一個getOracleLob()方法,但沒有getOracleClob()... –

+0

對不起 - 我不能特定於Oracle驅動程序,因爲我從來沒有使用它。 – hometoast

+1

由於clon最有可能是UCS2而不是UTF8編碼,所以不起作用... –