c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题

本文主要是介绍c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近做项目,要跟对方系统的库进行读写,结果发现对方采用的是oracle的us7ascii编码,我们系统默认采用的是ZHS16GBK,导致我们客户端读取和写入对方库的数据都是乱码,搜索网上,发现需要采用独立的oracle驱动去处理,最后采用Devart驱动,可以指定字符集编码

添加引用2个DLL:

数据库操作代码如下:(查询)

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;using Devart.Data.Oracle;namespace WindowsOrcleDevart
{/// <summary>/// 使用OracleDevart驱动/// </summary>public class ProviderDevart{private OracleConnection dbConnection;private OracleTransaction dbTransaction;private string _strConn = "";private string path = AppDomain.CurrentDomain.BaseDirectory + "logs\\调用数据库";public string Err = "";public string StrConn { get => _strConn; set => _strConn = value; }public int BeginTransaction(){//this.Err = "";int result = -1;try{GetSingerConnection();this.dbTransaction = this.dbConnection.BeginTransaction();result = 1;}catch (Exception message){this.dbTransaction.Dispose();this.dbTransaction = null;Err = "开始事务异常," + message.Message;WriteLog(path, Err);}return result;}// 定义一个静态变量来保存类的实例private static ProviderDevart s_instance;/// <summary>/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点/// </summary>/// <returns></returns>public static ProviderDevart Instance{ // 当第一个线程运行到这里时,此时会对locker对象 "加锁",// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"// 双重锁定只需要一句判断就可以了get{if (s_instance == null){lock (locker){if (s_instance == null){s_instance = new ProviderDevart();}}}return s_instance;}}#region 单例锁  定义一个标识确保线程同步private static readonly object locker = new object();#endregionprivate void GetSingerConnection(){if (this.dbConnection != null){if (dbConnection.State != ConnectionState.Open){dbConnection.Open();}}else{this.dbConnection = new OracleConnection(_strConn);this.dbConnection.Open();}}public int TransactionCommit(){//this.Err = "";int result = -1;try{GetSingerConnection();if (this.dbTransaction != null){this.dbTransaction.Commit();this.dbTransaction.Dispose();this.dbTransaction = null;}result = 1;}catch (Exception message){if (this.dbTransaction != null){this.dbTransaction.Dispose();this.dbTransaction = null;}Err = "提交事务异常," + message.Message;WriteLog(path, Err);}return result;}public int TransactionRollBack(){//this.Err = "";int result = -1;try{GetSingerConnection();if (this.dbTransaction != null){this.dbTransaction.Rollback();this.dbTransaction.Dispose();this.dbTransaction = null;}result = 1;}catch (Exception message){if (this.dbTransaction != null){this.dbTransaction.Dispose();this.dbTransaction = null;}Err = "回滚事务异常," + message.Message;WriteLog(path, Err);}return result;}/// <summary>/// 插入/更新/删除表数据/// </summary>/// <param name="strSql"></param>/// <returns>返回SQL执行的影响行数,返回-1表示出现了内部错误</returns>public int ExecuteNonQuery(string strSql){//this.Err = "";OracleGlobalization applicationInfo = OracleGlobalization.GetApplicationInfo();applicationInfo.ClientCharacterSet = "us7ascii";OracleGlobalization.SetApplicationInfo(applicationInfo);int result = -1;try{GetSingerConnection();WriteLog(path, " 开始");WriteLog(path, "strConn:" + _strConn);WriteLog(path, "strSql:" + strSql);if (_strConn == "" || strSql == ""){Err = "strConn 或 strSql 为空,无法执行!";}else{OracleCommand cmd = dbConnection.CreateCommand();if (this.dbTransaction != null){cmd.Transaction = this.dbTransaction;}cmd.CommandText = strSql;result = cmd.ExecuteNonQuery();}}catch (Exception ex){Err = "插入更新数据异常," + ex.Message;WriteLog(path, Err);}WriteLog(path, " 结束");return result;}/// <summary>/// 查询表数据/// </summary>/// <param name="strSql">SQL语句</param>/// <param name="data">返回数据为DataTable</param>/// <returns></returns>public int FillDataTable(string strSql, out DataTable data){//this.Err = "";data = new DataTable();OracleGlobalization applicationInfo = OracleGlobalization.GetApplicationInfo();applicationInfo.ClientCharacterSet = "us7ascii";OracleGlobalization.SetApplicationInfo(applicationInfo);int result = -1;OracleCommand oleDbCommand = null;try{GetSingerConnection();WriteLog(path, " 开始");WriteLog(path, "strConn:" + _strConn);WriteLog(path, "strSql:" + strSql);oleDbCommand = new OracleCommand(strSql, dbConnection);oleDbCommand.CommandType = CommandType.Text;using (OracleDataAdapter oleDbDataAdapter = new OracleDataAdapter(oleDbCommand)){DataSet ds = new DataSet();oleDbDataAdapter.Fill(ds, "ReturnTable");if (ds != null && ds.Tables.Count > 0){data = ds.Tables[0];}}result = 1;}catch (Exception ex){Err = "查询数据异常," + ex.Message;WriteLog(path, Err);}WriteLog(path, " 结束");return result;}private bool dbClose(OracleConnection conn, OracleCommand cmd, OracleTransaction tran){bool result;if (cmd != null){cmd.Dispose();GC.Collect();result = false;}else if (conn != null){if (conn.State == ConnectionState.Open){conn.Close();}conn.Dispose();GC.Collect();result = true;}else{GC.Collect();result = false;}return result;}public void WriteLog(string filePath, string message){try{if (!Directory.Exists(filePath)){Directory.CreateDirectory(filePath);}string fileName = filePath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";string msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:") + DateTime.Now.Millisecond + "  " + message;System.IO.StreamWriter sw = System.IO.File.AppendText(fileName);sw.WriteLine(msg);sw.Close();}catch{}}}
}

客户端访问示例:

private void button1_Click(object sender, EventArgs e)
{ProviderDevart providerDevart = ProviderDevart.Instance;providerDevart.StrConn = "data source=XXX.XX.8.X:1521/orcl;user id=#####;password=######;";providerDevart.FillDataTable("SELECT '测试数据' as T1 FROM DUAL  ",out DataTable dt);MessageBox.Show(dt.Rows[0]["T1"].ToString());
}

源码,压缩包见地址:

c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题资源-CSDN文库

这篇关于c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741370

相关文章

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.