C#连接Oracle数据库的方法

C#连接Oracle数据库的方法(Oracle.DataAccess.Client也叫ODP.net)-CSDN博客

.NET连接Oracle数据库踩过的坑

1 常用数据库访问类

一般来说,C#连接Oracle数据库,我们通常会通过封装好的dll调用,目前常用的有三个:

(1)System.Data.OracleClient.dll(微软)

(2)Oracle.DataAccess.Client.dll(Oracle,也称ODP.NET

(3)Oracle.ManagedDataAccess.dll(Oracle)

1.1 System.Data.OracleClient.dll

首先需安装Oracle客户端,然后可直接直接引用微软的System.Data.OracleClient,但VS会提示"System.Data.OracleClient.OracleConnection"已过时。经测试虽然提示过时但仍可正常使用,微软已经很久没有更新过这个访问类了,安全性方面无保障。

1.2 Oracle.DataAccess.Client.dll

Oracle提供的数据库访问类库,简称ODP.NET,其功能和效率上都有所保证,访问效率和速度都要比微软的System.Data.OracleClient优秀。

优点:

(1)无需安装Oracle客户端,程序也能访问服务器上的Oracle

(2)不需要配置tnsnames.ora文件
缺点:

(1)要区分用区分x86/x64版本

1.3 Oracle.ManagedDataAccess.dll

推荐这一种,Oracle官方出品,日常更新维护,无需安装Oracle客户端,不用区分操作系统位数。

2 踩过的坑

2.1 从System.Data.OracleClient到Oracle.ManagedDataAccess

一般来讲,我们会把数据库的连接信息写在config文件中,通过System.Configuration.dll读取,然后执行操作。

复制代码
<!--tnsnames.ora中的服务名-->
xxx =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = x.xx.xx.xxx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

<!--System.Data.OracleClient的数据库链接-->
<connectionStrings>
    <add name="OracleConn" connectionString="Data Source=xxx(tnsnames.ora中配置的服务名);User ID=xxx;Password=xxx"/>
</connectionStrings>

/// <summary>
/// 获取Oracle连接字符串
/// </summary>
public class PubConstant
{
    public static string GetOracleConString(string conval)
    {
        string connectionString  = ConfigurationManager.ConnectionStrings[conval].ToString();
        return connectionString;
    }
}

//从config文件里面获取数据库连接信息
private static readonly string connectionString = PubConstant.GetOracleConString("OracleConn");

/// <summary>
/// 执行参数化查询语句,返回DataSet
/// </summary>
public DataSet QueryByCSH(string SQLString, string cphm, string dlyszh)
{
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        DataSet ds = new DataSet();
        try
        {
            connection.Open();
            OracleDataAdapter command = new OracleDataAdapter(SQLString, connection);
            command.SelectCommand.Parameters.Add(":cphm", cphm);
            command.SelectCommand.Parameters.Add(":dlyszh", dlyszh);
            command.Fill(ds, "ds");
        }
        catch (OracleException ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            connection.Close();
        }
        return ds;
    }
}

经过上面的一些列操作之后发现,每次在connection.Open()出都会报"无法识别连接字符串"的异常,已安装Oracle客户端,数据库服务器IP、端口、用户名、密码都正确,百度了好久没有结果。

2.2 从连接服务名到连接字符串

终于,无意间看见一篇名为"C#使用Oracle.ManagedDataAccess.dll"的文章,于是将连接服务名改为了连接字符串,结果成功打开数据库连接。

复制代码
<!--Oracle.ManagedDataAccess的数据库链接-->
<connectionStrings>
    <add name="OracleConn" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x.xx.xx.xxx)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=xxx;Password=xxx"/>
</connectionStrings>

至此,记录下了我使用Oracle.ManagedDataAccess.dll遇到的问题,希望能给小伙伴们提供一点帮助!

参考链接:点击前往

作者:我叫397

链接:https://www.jianshu.com/p/efaba51d1cb6

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
WeiQ_2 小时前
解决phpstudy 8.x软件中php8.2.9没有redis扩展的问题
数据库·redis·缓存
DashVector6 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
KYGALYX7 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
檀越剑指大厂7 小时前
金仓KReplay:定义数据库平滑迁移新标准
数据库
努力成为一个程序猿.8 小时前
【Flink】FlinkSQL-动态表和持续查询概念
大数据·数据库·flink
毕设十刻8 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liliangcsdn9 小时前
如何利用约束提示优化LLM在问题转sql的一致性
数据库·sql
Java爱好狂.10 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
Elastic 中国社区官方博客10 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头10611 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库·mysql·安全·金仓数据库