首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.Net应用程序中使用/显示Oracle数据库中的特殊字符时出现问题

在.Net应用程序中使用/显示Oracle数据库中的特殊字符时出现问题
EN

Stack Overflow用户
提问于 2009-08-03 14:01:47
回答 2查看 7.8K关注 0票数 4

我有一个C#.Net应用程序,它从Oracle10db支持的商业应用程序访问数据。商业应用程序数据库中的几个字段(声明为varchar2(n))包含特殊字符。例如,“智能引号”撇号。商业客户端应用程序正确显示这些字符,但我的应用程序将它们显示为反转问号。Oracle字符集是"WE8ISO8859P1“。

我的应用程序使用System.Data.OracleClient.OracleDataAdapter读取商业数据库,并通过DataSet.Tables将其转换为表。将表转换为对象,并将相关字段存储为字符串。

如果我在从数据库读取数据后立即检查(在调试器中) DataSet中的数据,并且特殊字符已经不正确地显示。我不知道如何以十六进制字节的形式检查数据以了解真正存在的内容,也不确定应该查找什么。

我还注意到,Toad还将字符显示为反转问号。

我们的应用程序的一个方面是将这些记录写入到我们自己的数据库中的一个单独的表中;当发生这种情况时,特殊字符将被修改,随后将显示为方框而不是倒置问号。

如果需要,我可以提供更多信息。感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-05 15:13:23

Postscript适用于浏览此帖子的任何人:

Bogdan在让我找到“答案”方面非常有帮助(尽管是这样),但正如他指出的那样,你可能会遇到不同的情况。

  1. 我们与负责使用商业软件的团队进行了沟通。他们一直在从Word和Excel中复制/粘贴,这就是插入特殊字符的方式。
  2. 在远程数据库和我们的数据库之间转换字符时出现问题。主机数据库使用字符集WE8ISO8859P1,而我们的数据库使用WE8MSWIN1252。出于公司层面的考虑,修改这两个字符集目前都不可行。
  3. I使用SYS.UTL_RAW.CAST_TO_RAW(字段名)将源字段转换为搜索'BF‘(字符集中倒置问号的十六进制代码)。这至少让我确定了问题的记录和特征。但是,远程记录上的许多不同的特殊字符将/可以转换为BF。例如,单词的连字符不是简单的“破折号”字符,还会被转换为反转问号。除非我在同一查询中也使用了SYS.UTL_RAW.CAST_TO_RAW,否则
  4. dump(fieldname)会在转换前以某种方式转换为十进制字符代码。这引起了惊人的头痛。dump()本身在识别源数据库中的特定预翻译字符时可能很有用。

最好的解决方案是在两个dbs上使用相同的字符集。由于这对我们来说是不可能的,我们已经手动地将源(远程)数据库中所有出现的特殊字符替换为非特殊的等价物(常规撇号或连字符)。但是,由于商业软件不能纠正或标记特殊字符,我们将来可能会遇到这个问题。因此,我们的更新应用程序将扫描反转的问号,并向系统所有者发送一个带有坏记录ID的通知。这一点,就像许多其他公司的情况一样,将不得不这样做。;-)

再次感谢你,博格丹!

票数 2
EN

Stack Overflow用户

发布于 2009-08-03 14:26:27

与UTF8中的相同字符相比,WE8ISO8859P1字符集中的某些字符具有不同的二进制表示形式。

我的建议是两种可能的方法

1)尝试使用Oracle providers for .NET (ODP.NET)。可能是微软的库System.Data.OracleClient中存在错误/功能,该适配器不自动支持将WE8ISO8859P1转换为unicode。Here is a link to ODP.NET

我希望在ODP中会有对这种编码的支持(但说真的,我从来没有检查过这一点,这只是一个建议)

2)解决方法:在Dataset中,您应该创建一个二进制字段(映射到原始表字段)和一个字符串字段(不映射到数据库)。将数据加载到dataset时,对每一行进行迭代,并执行从二进制数组到字符串的转换。

代码应该是这样的

代码语言:javascript
复制
Encoding e = Encoding.GetEncoding("iso-8859-1");
foreach(DataRow row in dataset.Tables["MyTable"])
{
    if (!row.IsNull("MyByteArrayField"))
        row["MyStringField"] = e.GetString((row["MyByteArrayField"] as byte[]));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1222529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档