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();
        #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文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络知识

目录 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 网关 路由 DNS&#xff08;Domain Name Server&#xff09; —— 域名服务器 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 作用&#xff1a;划分网段 网络部分相同的IP地址&a…

简介高效的 CV 入门指南: 100 行实现 InceptionResNet 图像分类

简介高效的 CV 入门指南: 100 行实现 InceptionResNet 图像分类 概述InceptionResNetInception 网络基本原理关键特征 ResNet 网络深度学习早期问题残差学习 InceptionResNet 网络InceptionResNet v1InceptionResNet v2改进的 Inception 模块更有效的残差连接设计 100 行实现 I…

C 标准库 - <errno.h>

在C语言编程中&#xff0c;<errno.h> 头文件扮演着至关重要的角色&#xff0c;它提供了一个全局变量 errno 以及一系列预定义宏&#xff0c;用于指示系统调用或库函数执行过程中发生的错误。这些宏有助于程序员诊断和处理运行时错误。 errno 变量 extern int errno;err…

【软芯民用】基于数字孪生平台的智慧灌区信息化管理系统

本文介绍了一种基于数字孪生平台的智慧综合管理系统&#xff0c;旨在实现数字化转型和精细化管理。该系统以提高用水效率为核心&#xff0c;以严格的水资源管理制度为保障&#xff0c;通过数据汇集平台监控分析数据、精准测算&#xff0c;为水量调度、精准灌溉、水权交易提供科…

时域系统到频域响应的直观解析及数学推导

课本里经常有已知系统时域的差分方程&#xff0c;求系统的频率响应这样的题&#xff0c;老师会讲怎么带公式进去解决&#xff0c;怎么查表解决&#xff0c;但我们总时无法直观地理解这两种转换的特殊关联在哪里&#xff0c;这篇文章以FIR滤波器为例&#xff0c;不仅列出了课本里…

2024年高项第4版之成本管理(附思维导图)

文章目录 简介一、成本失控原因二、相关术语三、成本类型四、项目成本管理过程1.规划成本管理2.估算成本3.制定预算4.控制成本挣值计算公式 附思维导图 简介 项目成本管理师为了项目在批准的预算内完成&#xff0c;对成本进行规划、估算、预算、融资、筹资、管理和控制的过程。…

yolov9来了,附官方源码地址,蓝奏云国内下载代码

不得不说&#xff0c;yolo的更新是真TMD的勤&#xff0c;v8还没熟悉透&#xff0c;结果V9就来了。 官方地址&#xff1a;https://github.com/WongKinYiu/yolov9/ 如果访问不了github的朋友们&#xff0c;可以下载微智启软件工作室准备好的国内蓝奏云网盘&#xff0c;内容是一样…

代码随想录算法训练营第四十天 | 整数拆分、不同的二叉搜索树

目录 整数拆分不同的二叉搜索树 LeetCode 343. 整数拆分 LeetCode 96.不同的二叉搜索树 整数拆分 dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)); j是从1开始遍历j * (i - j) 是单纯的把整数拆分为…

UE5 骨骼重定向

1.通过 VRoidStudio 1.26.0 软件创建模型 导出 2.下载ue插件 https://github.com/ruyo/VRM4U/releases 安装 重启 3.拖入创建的模型 到指定文件夹 4.为模型创建 IK绑定&#xff0c;重定向骨骼根 新增链条 5.创建IK 重定向&#xff0c;指定源 和 目标 IK绑定 6.

子查询

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 子查询 前面我们学过了利用 group by子句可以实现分组的操作&#xff0c;主要的统计函数有&#xff1a;COUNT()、AVG()、SUM()、MAX()、MIN() 并且介绍了分组统计查询的若干限制以及在…

ElementUI组件的安装和使用

Element UI 是一款基于 Vue 2.0 的桌面端组件库&#xff0c;主要用于快速构建网站的前端部分。它提供了丰富的组件&#xff0c;如按钮、输入框、表格、标签页等&#xff0c;以及一些布局元素&#xff0c;如布局容器、分割线等。Element UI 的设计风格简洁&#xff0c;易于上手&…

Three.js加载PLY文件

这是官方的例子 three.js webgl - PLY 我在Vue3中使用&#xff0c;测试了好久始终不显示点云数据。在网上查询后发现ply文件要放置在public目录下才行 <el-row><el-button type"primary" class"el-btn" click"IniThree1">PLY</…

Go 如何按行读取(大)文件?尝试 bufio 包提供的几种方式

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十七篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 本文将介绍 Go 如何按行读取文件&#xff0c;基于此会逐步延伸到如何按块读取文件。 引言 我们将要介绍的按行读取文件的方式其实是非常适合…

每日OJ题_二叉树dfs⑥_力扣257. 二叉树的所有路径

目录 力扣257. 二叉树的所有路径 解析代码 力扣257. 二叉树的所有路径 257. 二叉树的所有路径 难度 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输…

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

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

go-zero微服务入门教程

go-zero微服务入门教程 本教程主要模拟实现用户注册和用户信息查询两个接口。 准备工作 安装基础环境 安装etcd&#xff0c; mysql&#xff0c;redis&#xff0c;建议采用docker安装。 MySQL安装好之后&#xff0c;新建数据库dsms_admin&#xff0c;并新建表sys_user&#…

Springboot--整合定时任务quartz--集群篇

文章目录 前言一、quartz 的集群&#xff1a;1.1 服务集群带来的定时任务问题&#xff1a;1.2 服务集群定时任务解决思路&#xff1a; 二、quartz 集群实现&#xff1a;2.1 引入jar2.2 配置文件&#xff1a;2.3 定义quartz 数据源&#xff1a;2.4 集群测试&#xff1a;2.4.1 定…

介绍 CI / CD

目录 一、介绍 CI / CD 1、为什么要 CI / CD 方法简介 1、持续集成 2、持续交付 3、持续部署 2、GitLab CI / CD简介 3、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 GitLab CI / CD 6、GitLab CI / CD功能集 一、介绍 CI / CD 在本文档中&#x…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture07多维输入

lecture07多维输入 课程网址 Pytorch深度学习实践 部分课件内容&#xff1a; import torch import numpy as npxy np.loadtxt(diabetes.csv.gz, delimiter,, dtypenp.float32) x_data torch.from_numpy(xy[:,:-1]) #第一列开始最后一列不要 y_data torch.from_numpy(…

【Python_Zebra斑马打印机编程学习笔记(一)】实现标贴预览的两种方式

实现标贴预览的两种方式 实现标贴预览的两种方式前言一、调用 Labelary Online ZPL Viewer API 方法实现标贴预览功能1、Labelary Online ZPL Viewer API 案例介绍2、生成 PNG 格式3、Parameters 二、通过 zpl 的 label.preview() 方法实现标贴预览功能1、实现步骤2、代码示例 …