You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中为Oracle存储过程设置指定格式的DATE参数

解决C#调用Oracle存储过程DATE参数的问题

核心误区纠正

Oracle的DATE类型是二进制内部存储,并非字符串格式。PL/SQL中使用to_date()是为了将字符串字面量转换为DATE类型,但C#调用存储过程时,无需手动拼接格式字符串,直接传递DateTime对象即可,Oracle数据提供商会自动完成类型转换。

步骤1:正确绑定DATE参数

直接将处理后的DateTime对象赋值给OracleParameter,并指定参数类型为OracleDbType.Date:

cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "ifsapp.SHOP_OPER_CLOCKING_UTIL_API.Start_Operation";
cmd.CommandType = CommandType.StoredProcedure;

// 处理DateTime,去除秒数
DateTime startTime = DateTime.Now;
startTime = startTime.AddSeconds(-startTime.Second);

// 添加op_id_msg_参数(替换为实际业务值)
cmd.Parameters.Add("op_id_msg_", OracleDbType.Varchar2).Value = "你的操作ID";

// 添加start_time_ DATE类型参数
cmd.Parameters.Add("start_time_", OracleDbType.Date).Value = startTime;

// 执行存储过程
cmd.ExecuteNonQuery();

步骤2:设置NLS_CALENDAR=GREGORIAN

有两种方式确保会话使用公历:

方式1:在连接字符串中指定

在SQL连接字符串里直接添加NLS_CALENDAR=GREGORIAN,示例:

Data Source=你的Oracle数据源;User Id=用户名;Password=密码;NLS_CALENDAR=GREGORIAN;

方式2:会话级别动态设置

如果无法修改连接字符串,可在打开连接后、调用存储过程前执行会话配置:

// 打开连接后先执行会话设置
var sessionCmd = new OracleCommand("ALTER SESSION SET NLS_CALENDAR='GREGORIAN'", con);
sessionCmd.ExecuteNonQuery();

// 再执行目标存储过程(即上述绑定参数的cmd代码)

为什么无需手动拼接格式字符串?

Oracle数据提供程序(如Oracle.ManagedDataAccess.Client)会自动将C#的DateTime转换为Oracle的DATE类型,无需手动处理格式,既避免了字符串转换的格式错误,也规避了NLS兼容性问题。

内容的提问来源于stack exchange,提问作者Gokhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:13:11