• .Net Core调用oracle存储过程


    一 前言

      实战踩坑系列,调用第三方Oracle存储,各种血泪史,现记录如下。

    二 入坑

      首先,调用Oracle需要安装客户端驱动才行,但是在程序开发中下载客户端驱动是一个不明智的选择。于是,不管是微软,还是oracle,都提供了方便我们程序开发的插件(dll/nuget),如System.Data.Oracle,Oracle.ManagedDataAccess。下图搜索结果中Oracle.ManagedDataAccess.EntityFramework包含Oracle.ManagedDataAccess,适用于.net framework,如果你想要使用EF的话。因为这里是NetCore程序,所以我选择了Oracle.ManagedDataAccess.Core包。

      初始程序:

    private static void Remote()
    {
        // 创建Oracle连接
        var connString = "User Id=user;Password=password;Data Source=ip:port/service_name;";
    
        // 存储过程名称
        var storedProcName = "SetTemperatureData";
    
        // 参数设置
        IDataParameter[] parameters = new IDataParameter[2];
        parameters[0] = new OracleParameter("@id", 1);
       parameters[1] = new OracleParameter("@date", DateTime.Now); parameters[
    2] = new OracleParameter("@result", OracleDbType.Decimal, ParameterDirection.Output); using (OracleConnection conn = new OracleConnection(connString)) using (OracleCommand command = BuildQueryCommand(conn, storedProcName, parameters)) { try { conn.Open(); var isSuccess = command.ExecuteNonQuery(); var result = (int)command.Parameters["@result"]; } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters) { OracleCommand command = new OracleCommand(storedProcName, connection); command.CommandType = CommandType.StoredProcedure; foreach (OracleParameter parameter in parameters) { command.Parameters.Add(parameter); } return command; }

      运行程序报错:

      错误1:

        产生原因:对接方提供的链接是从库地址,只有读权限。

      错误2:

        产生原因:存储过程名称问题,缺少了表空间,大概的意思是test.SetTemperatureData。

      错误3:

        产生原因:入参格式问题,字符串类型和时间类型不统一导致。

      错误4:

        产生原因:(int)command.Parameters["@result"]不能直接转换,需要进行多次转换Convert.ToDecimal(((OracleDecimal)command.Parameters["@result"].Value).Value);

      错误5:

        产生原因:了解到第三方oracle采用的是分布式负载均衡的方式,提供了多个ip地址,那原有的链接方式就不适用了,需要采用tsname.oa的方式链接。

      错误6:若你由于粗心大意,也会有所收获

        产生原因:链接字符错误,请仔细检查

    三 出坑

       简直是错误大全,哈哈!最后代码粘贴如下:

    private static void Remote()
    {
        // 创建Oracle连接
        var connString = "User ID=uer;Password=password;Data Source=test";
        if (string.IsNullOrWhiteSpace(OracleConfiguration.OracleDataSources["test"]))
        {
            OracleConfiguration.OracleDataSources.Add("test",
                "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=[ip1])(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=[ip2])" +
                "(PORT=1521))(LOAD_BALANCE=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service_name))))");
        }
    
        // 存储过程名称
        var storedProcName = "test.StoredProcName";
    
        // 参数设置
        IDataParameter[] parameters = new IDataParameter[3];
        parameters[0] = new OracleParameter("@id", 1);
        parameters[1] = new OracleParameter("@date", DateTime.Now);
        parameters[2] = new OracleParameter("@result", OracleDbType.Decimal, ParameterDirection.Output);
    
        using (OracleConnection conn = new OracleConnection(connString))
        using (OracleCommand command = BuildQueryCommand(conn, storedProcName, parameters))
        {
            try
            {
                conn.Open();
                var isSuccess = command.ExecuteNonQuery();
                var result = Convert.ToDecimal(((OracleDecimal)command.Parameters["@result"].Value).Value);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
  • 相关阅读:
    el-select 和 el-checkbox
    element-ui : <el-table> 按钮点击操作阻止@row-click
    vue 点击按钮几种总结
    div内元素右对齐 && 文字对齐
    父元素高度为 0, 导致元素错位
    从后端传过来的数据,明明是换行,却都替换成空格了。
    Spoken English
    C++ ofstream和ifstream
    C++ 文件操作实例
    matlab
  • 原文地址:https://www.cnblogs.com/az4215/p/12408500.html
Copyright © 2020-2023  润新知