2011-09-12 38 views
4

我有一個現有的C#項目,它讀取文本文件並使用System.Data.OleDb作爲提供程序將其加載到Oracle數據庫中。問題是,如果文件具有較高的ascii字符(例如,非隔離空間),它會在嘗試將其加載到Oracle時產生錯誤:使用C#,是否有可能使System.Data.OleDb處理特殊字符?

錯誤是:OLEDBConnection命令參數數據值無法轉換除符號不匹配或數據溢出以外的其他原因

我們的Oracle可以接受高級ascii字符(通過SQL * PLUS插入工作正常),它是有問題的System.Data.OleDb。

任何人都知道是否有一個設置來改變這個?不能相信那隻能接受A-Z-0-9。看過通過一個文件,但找不到任何東西。

如果不行,你如何讓OLEDB知道逃離角色。在特殊字符之前將累\放在文件中,但它仍然具有相同消息的錯誤。

+5

快速注:這些不是「高級ASCII」字符 - ASCII不包含任何重音字符......這是一個簡單的7位編碼。 –

+2

您是否嘗試過使用內置的'System.Data.OracleClient'類,甚至是官方的ODP.NET(Oracle ADO.NET Provider)而不是OLEDB ADO.NET提供程序? –

+0

你的連接字符串是什麼樣的? –

回答

2

您可能必須使用HEX轉換。例如%c4是Ä。

試試這個,讓我知道如果這有效。以下是您可以使用的轉換功能。

internal String convertAsciiTextToHex(String asciiText) 
{ 
StringBuilder sBuffer = new StringBuilder(); 
for (int i = 0; i < asciiText.Length; i++) 
{ 
    sBuffer.Append(Convert.ToInt32(asciiText[i]).ToString("x")); 
} 
return sBuffer.ToString().ToUpper(); 
} 

internal String convertHexToAsciiText(String hexString) 
{ 
    StringBuilder sb = new StringBuilder(); 

for (int i = 0; i < hexString.Length; i += 2) 
{ 
    string hs = hexString.Substring(i, 2); 
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16))); 
} 
    String ascii = sb.ToString(); 
    return ascii; 
} 
+0

我不希望字符被轉換,我希望能夠從文件中讀取Ñ並通過OLEDB將其存儲在Oracle中。 Oracle可以存儲它們,並且這些文件提供它們。這些是西班牙語名稱,將Ñ換成其他名稱使其成爲不同的名稱。 – user722226

+0

您只將它們轉換爲十六進制,而不會改變實際值。我很好奇它是否會在Oracle數據庫中正確編碼它們。 – ApolloSoftware

+0

它將十六進制值存儲在數據庫中,因爲我在varchar2列中使用了標準插入。將一個Ñ轉換爲十六進制將存儲十六進制值。我需要使用特殊的oracle函數做十六進制轉換回ascii – user722226

1

是你的數據類型和參數類型nvarchar2?

3

通常這是可能的,沒有任何問題......因爲你沒有提供太多細節只是一些普通的指針:

  • 數據庫字符集應被設置爲AL32UTF8
    你可以通過執行SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';檢查此
  • 客戶端字符集應被設置爲AL32UTF8
    看到了這NLS_LANG註冊表設置
  • 列應VARCHAR2
  • 連接字符串應包括OLEDB.NET=True
    進一步參考見http://download.oracle.com/docs/cd/B28359_01/win.111/b28431/using.htm#i1017221

其他景點檢查可能是操作系統,客戶端和OLEDB版本......一些有錯誤或奇怪的行爲...