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

4

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

错误为:OLEDBConnection命令参数数据值无法转换,原因不是符号不匹配或数据溢出。

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

有人知道是否有设置可更改此设置吗?无法相信只接受A-Z-0-9。查看了所有文档,但找不到任何内容。

如果不能,则如何让OLEDB知道如何转义字符。已尝试在特殊字符之前在文件中放置\,但仍会出现相同消息的错误。


5
快速说明:这些不是“扩展ASCII”字符—— ASCII码中没有包含任何带重音的字符...它只是一个简单的7位编码。 - Jon Skeet
2
你尝试过使用内置的 System.Data.OracleClient 类或者官方的 ODP.NET(Oracle ADO.NET Provider)而不是 OLEDB ADO.NET 提供程序吗? - Matthew Abbott
你的连接字符串是什么样子? - Jon Skeet
目前无法更改提供商为其他内容。 - user722226
3个回答

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版本...一些版本存在缺陷或奇怪的行为...


2

你可能需要使用十六进制转换。例如,%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;
}

我不想把字符转换,我想能够从文件中读取Ñ并通过OLEDB存储到Oracle中。Oracle可以存储它们,而文件提供它们。这些是西班牙名字,将Ñ转换为其他字符会使其成为不同的名称。 - user722226
你只是将它们转换为十六进制,而没有改变实际值。我很好奇它是否能在你的Oracle数据库中正确编码。 - apollosoftware.org
由于我正在使用标准的插入到varchar2列中,因此它将十六进制值存储在数据库中。将Ñ转换为十六进制将存储十六进制值。我需要使用特殊的Oracle函数来将十六进制转换回ASCII。 - user722226
varchar2?你不想要nvarchar2吗? - Nikki9696

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接