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

news2024/9/20 16:27:52

最近做项目,要跟对方系统的库进行读写,结果发现对方采用的是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();
        #endregion

        private 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文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1465360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

Android 广播的基本概念

一.广播简介 Broadcast是安卓四大组件之一。安卓为了方便进行系统级别的消息通知&#xff0c;引入了一套广播消息机制。打个比方&#xff0c;记得原来在上课的时候&#xff0c;每个班级的教室里都会装有一个喇叭&#xff0c;这些喇叭都是接入到学校的广播室的&#xff0c;一旦…

[DP学习] 期望DP

一般思路 注&#xff1a;可以用方差求平方的期望 例题一 思路 重点&#xff1a;如何设状态&#xff0c;如何转移。 设状态 f[i] i 张能买到不同卡片的种类数的期望值&#xff08;直接对问题设置状态&#xff09; 状态转移&#xff1a;由于从f[i1]转移到 f[i] 时&#xff0…

基于springboot+vue的中小型医院网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

学习 python的第四天,顺便分享两首歌:we don‘ talk anymore,You ‘re Still The One

诸君晚上好&#xff0c;现在是&#x1f303;晚上&#xff0c;今天是学习python的第四个学习日&#xff0c;不知不觉学了四天了&#xff0c;还是那句话&#xff1a;不积跬步无以至千里、不积小流无以成江海&#xff01; 暂时回顾下前面的学习日吧&#xff1a; 第一个学习日----…

Python和Jupyter简介

在本notebook中&#xff0c;你将&#xff1a; 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性&#xff0c;我们将在之后教程中使用。 这是什么&#xff1f; 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…

【计算机网络】数据链路层--以太网/MTU/ARP/RARP协议

文章目录 一、以太网1.以太网帧格式2.MAC地址3.局域网的转发原理 二、MTU1.什么是MTU2.MTU对IP协议的影响3.MTU对UDP影响4.MTU对于TCP协议的影响 三、ARP协议1.ARP协议的作用2.ARP数据报的格式3.ARP协议的工作流程 一、以太网 “以太网” 不是一种具体的网络, 而是一种技术标准…

【Jailhouse论文】Look Mum, no VM Exits! (Almost)

【Jailhouse论文】Look Mum, no VM Exits! (Almost) 主要为翻译 Jailhouse 的论文&#xff0c;为了方便理解个人补充了一些名词的理解 Abstract 多核 CPU 已成为许多现代嵌入式系统的标准组件。它们的虚拟化扩展使得可以隔离服务&#xff0c;并且在实现混合关键性或其他分割系…

深入理解 v-for 中 key 的重要性

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

Java中各种O(PO,BO,DTO,VO等) 是不是人为增加系统复杂度?

Java中各种O(PO,BO,DTO,VO等) 是不是人为增加系统复杂度&#xff1f; 在Java和其他编程语言的开发过程中&#xff0c;经常会用到几个以"O"结尾的缩写&#xff0c;比如PO,BO,DTO,VO等等&#xff0c;O在这里是Object的缩写&#xff0c;不同的O代表了不同的数据类型&am…

运维SRE-06 阶段性复习软件管理体系

那些年运维必会操作-第一弹 操作 文件&#xff1a;增删改查 增&#xff1a;touch,vim,>,>>,cp删除&#xff1a;rm修改&#xff1a;内容&#xff1a;vi/vim,>,>> 文件名&#xff1a;mv查看&#xff1a;内容&#xff1a;cat/vim/less/more/head/tail/sed/awk/…

紫光同创初使用

芯片PGC2KG-6LPG144 1、安装好软件接&#xff0c;加载license,有两个&#xff0c;与电脑MAC地址绑定的 2、正常使用后&#xff0c;新建个工程&#xff0c;配置管脚Tools→UCE 3、程序中有些信号被软件认为是时钟信号&#xff0c;会报错&#xff08;时钟输入I0约束在非专用时钟…

Java项目:25 基于JavaWeb的酒店管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于JavaWeb的酒店管理系统是为酒店打造的管理平台&#xff0c;其主要功能有管理员登陆、客房预订、客房入住、房间管理、数据查询(预订单查询…

The Grapes NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;The Potatoz NFT Collection Dashboard The Potatoz 是在以太坊链上铸造的 9,999 个 PFP NFT 系列。该系列是 Memeland 的延伸&#xff0c;也是其充满活力、快速发展的社…

9、使用 ChatGPT 的 GPT 制作自己的 GPT!

使用 ChatGPT 的 GPT 制作自己的 GPT! 想用自己的 GPT 超越 GPT ChatGPT 吗?那么让我们 GPT GPT 吧! 山姆 奥特曼利用这个机会在推特上宣传 GPTs 的同时还猛烈抨击了埃隆的格罗克。 GPTs概览 他们来了! 在上周刚刚宣布之后,OpenAI 现在推出了其雄心勃勃的新 ChatGPT…

ISO26262 --- FSC功能安全概念

一、目的 a)按照安全目标&#xff0c;定义相关项功能行为或降级的功能行为 b)按照安全目标&#xff0c;定义用于合理&#xff0c;及时地探测和控制相关故障的约束条件 c)定义相关项层面的策略或者措施&#xff0c;通过相关项自身&#xff0c;驾驶员或外部措施来实现要求的故…

WebService学习,wsdl文件详解

目录 第一章、起因1.1&#xff09;学习原因1.2&#xff09;提问的过程&#xff08;逐步提出问题&#xff09;1、&#xff1f;wsdl链接的含义&#xff0c;有什么作用&#xff1f;2、什么是wsdl文档&#xff1f;3、如何阅读wsdl文件&#xff1f;4、wsdl文件有什么作用&#xff1f…

掼蛋之还贡技巧

掼蛋游戏的规则之一就是进贡和还贡以及抗贡&#xff0c;只要末游没能抗贡&#xff0c;那么就必须把最大的那张牌贡给头游&#xff0c;头游也要选一张牌还给末游。那么我们该如何还贡呢&#xff1f; 一、忌单张 尽量不要还自己的单张&#xff0c;因为自己的数量少&#xff0c;有…

靡语IT:Vue精讲(一)

Vue简介 发端于2013年的个人项目&#xff0c;已然成为全世界三大前端框架之一&#xff0c;在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的启发&#xff0c;从中提取自…