使用C#,是否可以使System.Data.OleDb处理特殊字符?

时间:2011-09-12 17:53:49

标签: c# oracle

我有一个现有的C#项目,它使用System.Data.OleDb作为提供程序读取文本文件并将其加载到Oracle DB中。问题是,如果文件具有上部ascii字符(例如ÀÑÓ,非中断空格),它在尝试将其加载到Oracle时总是会生成错误:

错误是: OLEDBConnection命令由于符号不匹配或数据溢出以外的原因,无法转换参数数据值

我们的Oracle可以接受上面的ascii字符(通过SQL * PLUS插入工作正常),它是有问题的System.Data.OleDb。

有人知道是否有更改此设置?不敢相信那只接受A-Z-0-9。通过ll文档查看但找不到任何内容。

如果不能,你怎么让OLEDB知道逃避这个角色。在特殊字符之前将文件放在文件中,但它仍然存在相同消息的错误。

3 个答案:

答案 0 :(得分: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版本......有些还有错误或奇怪的行为......

答案 1 :(得分: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;
}

答案 2 :(得分:1)

您的数据类型和参数类型是nvarchar2吗?