完美解决c# 连接oracle US7ASCII字符中文乱码 亲测

本文提供了一种在Windows 10使用Visual Studio 2017连接Linux Oracle数据库时,解决中文乱码问题的有效方案。通过下载并使用dotConnect for Oracle express版和ODAC112040 Xcopy_64bit的部分DLL文件,无需安装Oracle客户端即可实现中文正常显示。

客户端:win10 64位 vs2017,服务器端linux oracle US7ASCII字符。

因单位数据编码不能改变,故测试了很多办法,真是找了很多解决,最终找到了比较可以的一个。

1、下载dotConnect for Oracle 不需要专业版,仅需express版就行了,免费的。

专业版的功能更齐全自行百度。

2、下载ODAC112040Xcopy_64bit,只需要下图选中部分的dll即可。

3、引用

using Devart.Data.Oracle;

using Devart.Data;

4、核心代码:

 OracleConnection oc = new OracleConnection();
 oc.ConnectionString = "User ID=***;Password=**;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =***)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = DSJ****)))";
oc.Open();

完美解决中文乱码问题,且无需安装oracle客户端!!!

亲测有效,困扰了多年的问题。

附下载测试项目。

链接:https://pan.baidu.com/s/18dgPUg057-D3tyrgxwYNGg 
提取码:k8h4

### 问题分析 在C#读取Oracle数据库时,如果数据库使用的是 `US7ASCII` 字符集,而应用程序尝试读取简体中文字符,通常会出现乱码问题。`US7ASCII` 字符集仅支持基本的英文字符,无法直接支持中文字符的存储和传输。因此,当中文字符被存储到 `US7ASCII` 字符集的数据库时,会以某种编码方式(如 `GB2312` 或 `UTF-8`)进行编码,读取时需要进行相应的解码操作。 ### 解决方法 #### 方法一:在C#代码中进行字符编码转换 由于数据库使用 `US7ASCII` 字符集,而中文字符是以 `GB2312` 或 `UTF-8` 编码形式存储的,可以在C#代码中对读取的字符串进行解码操作。以下是一个示例方法,用于将从数据库读取的字节数组转换为正确的中文字符: ```csharp public string DecodeChinese(string input) { byte[] bytes = Encoding.Default.GetBytes(input); return Encoding.GetEncoding("gb2312").GetString(bytes); } ``` 上述代码中,首先将输入的字符串转换为字节数组,然后使用 `GB2312` 编码将字节数组转换为字符串。这样可以正确地将存储在 `US7ASCII` 字符集数据库中的中文字符解码为可读的中文文本[^2]。 #### 方法二:使用 `Oracle.DataAccess.Client` 进行数据库连接 由于 `System.Data.OracleClient.OracleConnection` 已经过时,建议使用 `Oracle.DataAccess.Client` 来连接 Oracle 数据库。在连接字符串中,可以指定字符集为 `AL32UTF8` 或 `ZHS16GBK`,以确保在读取中文字符时不会出现乱码问题。以下是一个示例连接字符串: ```csharp string connectionString = "Data Source=ORCL;User Id=test;Password=123456;Character Set=AL32UTF8;"; ``` 通过指定字符集为 `AL32UTF8`,可以确保在读取中文字符时使用 UTF-8 编码进行解码,从而避免乱码问题[^1]。 #### 方法三:在数据库端进行字符集转换 如果可能,建议将数据库的字符集从 `US7ASCII` 转换为支持中文字符字符集,如 `AL32UTF8` 或 `ZHS16GBK`。这样可以直接在数据库中存储和读取中文字符,而无需在应用程序端进行额外的编码和解码操作。字符集转换可以通过修改数据库的参数文件并重新启动数据库来完成。 ### 示例代码 以下是一个完整的示例代码,展示如何使用 `Oracle.DataAccess.Client` 连接 Oracle 数据库,并在读取中文字符时进行解码操作: ```csharp using System; using System.Text; using Oracle.DataAccess.Client; class Program { static void Main() { string connectionString = "Data Source=ORCL;User Id=test;Password=123456;Character Set=AL32UTF8;"; using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); OracleCommand command = new OracleCommand("SELECT chinese_column FROM chinese_table", connection); OracleDataReader reader = command.ExecuteReader(); while (reader.Read()) { string encodedString = reader.GetString(0); string decodedString = DecodeChinese(encodedString); Console.WriteLine(decodedString); } } } public static string DecodeChinese(string input) { byte[] bytes = Encoding.Default.GetBytes(input); return Encoding.GetEncoding("gb2312").GetString(bytes); } } ``` 在上述代码中,首先使用 `Oracle.DataAccess.Client` 连接 Oracle 数据库,并执行查询操作。读取到中文字符后,调用 `DecodeChinese` 方法对字符串进行解码,确保输出的中文字符不会出现乱码问题[^1]。 ###
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值