我有一个C#.Net应用程序,它从Oracle10db支持的商业应用程序访问数据。商业应用程序数据库中的几个字段(声明为varchar2(n))包含特殊字符。例如,“智能引号”撇号。商业客户端应用程序正确显示这些字符,但我的应用程序将它们显示为反转问号。Oracle字符集是"WE8ISO8859P1“。
我的应用程序使用System.Data.OracleClient.OracleDataAdapter读取商业数据库,并通过DataSet.Tables将其转换为表。将表转换为对象,并将相关字段存储为字符串。
如果我在从数据库读取数据后立即检查(在调试器中) DataSet中的数据,并且特殊字符已经不正确地显示。我不知道如何以十六进制字节的形式检查数据以了解真正存在的内容,也不确定应该查找什么。
我还注意到,Toad还将字符显示为反转问号。
我们的应用程序的一个方面是将这些记录写入到我们自己的数据库中的一个单独的表中;当发生这种情况时,特殊字符将被修改,随后将显示为方框而不是倒置问号。
如果需要,我可以提供更多信息。感谢您的帮助!
发布于 2009-08-05 15:13:23
Postscript适用于浏览此帖子的任何人:
Bogdan在让我找到“答案”方面非常有帮助(尽管是这样),但正如他指出的那样,你可能会遇到不同的情况。
最好的解决方案是在两个dbs上使用相同的字符集。由于这对我们来说是不可能的,我们已经手动地将源(远程)数据库中所有出现的特殊字符替换为非特殊的等价物(常规撇号或连字符)。但是,由于商业软件不能纠正或标记特殊字符,我们将来可能会遇到这个问题。因此,我们的更新应用程序将扫描反转的问号,并向系统所有者发送一个带有坏记录ID的通知。这一点,就像许多其他公司的情况一样,将不得不这样做。;-)
再次感谢你,博格丹!
发布于 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时,对每一行进行迭代,并执行从二进制数组到字符串的转换。
代码应该是这样的
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[]));
}https://stackoverflow.com/questions/1222529
复制相似问题