dapper 调用 存储过程返回值_.Net Core中使用oracle数据库并调用存储过程方法

本文分享了在.NET Core环境中调用Oracle存储过程时遇到的各种问题及解决方案,包括客户端驱动安装、参数设置、数据类型转换等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 前言

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

二 入坑

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

fdcf6c46f765234715b5c75c8e9edac9.png

  初始程序:

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:

8957e50d55b977b182293d6ef849c4af.png

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

  错误2:

749efd544101a6daf618e5c50583d582.png

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

  错误3:

b278f69bd6d4ad485ce28fceb1b64939.png

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

  错误4:

37ae0e5de680594e7711178ffdf239c2.png

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

  错误5:

adef38bdef8ee90cb38fb000b760a54d.png

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

b3b7ddce656aadfe871f432f22b8cd5f.png

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

23442a49473ecebfed79065f35c2f963.png

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

三 出坑

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

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());        }    }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值