使用c#,可以让System.Data.OleDb处理特殊字符吗?

本文关键字:处理 OleDb 特殊字符 Data System 使用 | 更新日期: 2023-09-27 18:08:35

我有一个现有的c#项目,读取文本文件,并使用System.Data.OleDb作为提供者将其加载到Oracle数据库中。问题是,如果文件有大写ascii字符(例如ÀÑÓ,非换行空格),它总是产生一个错误,当它试图加载到Oracle:

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

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

有人知道是否有一个设置来改变这个吗?真不敢相信那只接受az -0-9。查看了所有文档,但没有找到任何内容。

如果不能,您如何让OLEDB知道转义字符。累了把'放在文件的特殊字符前,但它仍然错误的消息相同。

使用c#,可以让System.Data.OleDb处理特殊字符吗?

通常这是可能的,没有任何问题…因为你没有提供太多的细节,只有一些一般的指针:

  • 数据库字符集应设置为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版本…

您可能必须使用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;
}

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