我有一个C#.Net 应用程序访问数据从一个商业应用程序支持通过一个Oracle10分贝。几个领域的商业应用程序的数据库(宣布为varchar2(n))的含有特殊字符。该"智能报价"撇号,例如。商业客户应用程序显示这些符正确的,但是我的应用正在显示它们作为一个倒置问题的标志。Oracle字符集"WE8ISO8859P1".

我的申请读的商业数据库利用系统。数据。OracleClient.OracleDataAdapter,转换成一个表通过数据集。表。该tablerows转换为对象,该领域中的问题存储为串。

如果我检查(在调试器)的数据集中的数据之后立即读取它的数据库,并特别字已经显示不正确。我可不想出如何审查的数据为六个字节来看看什么是真的没有,我也不是一定有什么我应该寻找。

我们还注意到,蟾蜍显示的字符,因为倒转的问号。

一方面我们用写这些记录以一个单独的表在我们自己的数据库;当那发生的特殊人物得到修改,并随后显示如盒子,而不是颠倒的问号。

我可以提供进一步的信息,如果需要的。谢谢你的任何和所有帮助!

有帮助吗?

解决方案 2

Postscript的人浏览这个主线:

波格丹是非常有益的,在得到我要的"答案"(比如它是)但是,如他所指出的,你可能不具有相同的情况。

  1. 我们传达的团队负责利用商业软件。他们已经被复制或粘贴从Word和Excel,这是如何的特殊的人物已经越来越插入。

  2. 问题发生在翻译的角色之间的远程数据库和我们的数据库。主机数据库使用的字符组WE8ISO8859P1,在那里我们使用WE8MSWIN1252.由于公司一级的关注问题,修改或符设置是不可行的现在。

  3. 我用SYS.UTL_RAW.CAST_TO_RAW(fieldname)转换源领域搜索'F'(hex码倒置问题的标记在我们的字符组)。这至少让我鉴定问题记录的人。然而,许多不同的特殊字符的远程的记录将会/可能是翻译,以BF。例如,文字的连字符的不是简单的"冲"的字符,并且也得到翻译的倒置问题的标志。

  4. dump(fieldname)以某种方式转换到小数字符编码之前翻译,除非我还用SYS.UTL_RAW.CAST_TO_RAW在同样的查询。这种引起惊人头痛的问题。dump()通过本身可能有助于识别特定的pretranslated的人物从源数据库。

最好的解决办法是使用相同的字符组的两dbs。因为那是不可能的,用于我们,我们必须手动代替出现的所有特殊性质源(远程)db与非特殊的等同(定期或撇连字符).然而,由于商业软件没有正确或标志的特殊人物,我们可能会遇到这个问题的未来。因此,我们的更新应用程序将扫描的倒置问题的标记和通知发送到该系统的拥有者与ID的不良记录。这个,像许多其他企业的情况下,将不得不这样做。;-)

再次感谢,丹!

其他提示

某些人物在WE8ISO8859P1字符集具有不同的二进制代表于同一性质在UTF8.

我的建议是可能的方式2

1)尽量使用Oracle本地数据提供商。网(ODP.NET).可能有一个错误/功能在微软的图书馆系统。数据。OracleClient,这种转接器不会自动支持转换WE8ISO8859P1以unicode。 这里是一个链接到ODP.NET

我希望将有一个支持这一编码的耗氧潜能(但说真的我从来没有检查这个,它只是一个建议)

2)解决办法:在数据集,应创建一个二元域(映的原始表的领域)和一串场(不映射数据库)。当你装载数据的数据集,迭代,每个行和执行会议,从二元的阵列的串。

代码应该是这样的

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[]));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top