美文网首页
.NET连接Oracle数据库踩过的坑

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

作者: 我叫397 | 来源:发表于2020-01-19 14:46 被阅读0次

    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遇到的问题,希望能给小伙伴们提供一点帮助!
    参考链接:点击前往

    相关文章

      网友评论

          本文标题:.NET连接Oracle数据库踩过的坑

          本文链接:https://www.haomeiwen.com/subject/tjprzctx.html