zoukankan      html  css  js  c++  java
  • 在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle数据库

    前言

    虽然一直在说“去IOE化”,但是在国企和政府,Oracle的历史包袱实在太重了,甚至很多业务逻辑都是写在Oracle的各种存储过程里面实现的……

    我们的系统主要的技术栈是Django / Spring / AspNetCore,Java的不必说对Oracle支持肯定没问题,关键在于Django对Oracle版本有要求,兼容性不是特别好,Oracle版本没办法随意升级的,所以我想到用.Net Core来写个中间层,让其他系统可以方便的使用Oracle的数据和存储过程…

    ODP.NET Core是一个ADO.NET驱动程序,提供从Microsoft .NET Core客户端到Oracle数据库的快速数据访问。它可以在Windows和Linux上运行。ODP.NET由一个100%托管代码动态链接库Oracle.ManagedDataAccess.dll组成,可通过NuGet安装获得。

    这个Oracle.ManagedDataAccess.Core是真的方便,不用安装Oracle客户端,兼容性、便捷性,反正就是开箱即用,一把梭就完事了

    简单使用

    首先用nuget安装这个Oracle.ManagedDataAccess.Core,之后就可以执各类操作了,不过从代码量上看还是比较繁琐的,上代码:

    var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
    using (var conn = new OracleConnection(connStr)) {
        using (var command = conn.CreateCommand()) {
            try {
                if (conn.State == ConnectionState.Closed) {
                    conn.Open();
                }
    
                command.BindByName = true;
                command.CommandText = $"select * from table_name";
    
                using (var reader = command.ExecuteReader()) {
                    while (reader.Read()) {
                        Console.WriteLine(reader.GetString("DEPART_NAME"));
                    }
                }
            }
            catch (Exception ex) {
                Console.WriteLine(ex.StackTrace);
                Console.WriteLine(ex.Source);
                Console.WriteLine(ex.Message);
            }
        }
    }
    

    这就是执行select * from table_name这条SQL语句的代码,有点长…… 吐了

    再看看执行存储过程的…

    var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
    using (var conn = new OracleConnection(connStr)) {
        conn.Open();
        var command = new OracleCommand("proc_name", conn) {
            CommandType = CommandType.StoredProcedure
        };
    
        // 输入参数
        command.Parameters.Add(new OracleParameter("id", "0001"));
    
        // 输出参数
        var vOut = new OracleParameter("v_out",
            OracleDbType.Varchar2,
            1000,
            "",
            ParameterDirection.InputOutput
        );
    
        command.Parameters.Add(vOut);
    
        var affectRows = command.ExecuteNonQuery();
    
        Console.WriteLine(vOut.Value);
    }
    

    这里去掉了错误处理,显得短一点,不过还是麻烦得不行……

    所以这里我们要用Dapper这个轻量级ORM来简化操作

    使用Dapper

    不多说,首先nuget安装是常规操作,包名就是简单的Dapper

    首先是增删改查这类普通的SQL语句:

    using Dapper;
    
    var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
    using var cn = new OracleConnection(connStr);
    
    var result = cn.Query("select * from table_name");
    
    foreach (var item in result) {
        Console.WriteLine(item);
    }
    

    可以看到引入Dapper之后只要使用OracleConnection的扩展方法Query来执行SQL就行了~ 返回的结果是IEnumerable<dynamic>类型,当然你也可以在Query方法的泛型参数里指定返回的类型,我这里为了通用就不指定了

    继续看存储过程的,很简单,更上面的差不多,就多一个参数告诉程序我们的SQL类型是啥而已

    var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
    using var cn = new OracleConnection(connStr);
    
    var result = cn.Query("proc_name", commandType: CommandType.StoredProcedure);
    
    foreach (var item in result) {
        Console.WriteLine(item);
    }
    

    如果是有带参数的存储过程咋办?

    很简单(代码来自官方例子)~

    var user = cnn.Query<User>("spGetUser", new {Id = 1},
            commandType: CommandType.StoredProcedure).SingleOrDefault();
    

    ok,很方便,更多操作看Dapper文档就完事了(我也是第一次接触Dapper,之前都用FreeSQL和EFCore),此文完结~

    Dapper项目主页:https://github.com/StackExchange/Dapper

    参考资料

    It never rains but it pours. 欢迎关注我的公众号:DealiAxy 提供更多技术文章
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/deali/p/14373329.html
Copyright © 2011-2022 走看看