【ODP.NET 日期】 在使用Oracle ODP.NET执行Update时提示ORA-00932 和 ORA-01843

【问题】

底层数据库链接由Oracle.Client修改为ODP.NEt连接数据库,以提高执行效率。

执行语句时发现以下问题

cmd.CommandText = "update SYS_USER  set  LASTLOGIN=:LASTLOGIN, MOBILEPHONE='13000000000'  where USERID=:USERID11";

首先提示 ORA-01843 无效月份,发现ODP.NET 使用OracleDbtype.Date时,Dbparameter.value需要为System.DateTime类型

继续执行提示ORA-00932 “ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 DATE”

检查数据类型完全一致啊

 

 

【分析】

重新写代码调试如下

 

OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "update SYS_USER  set  LASTLOGIN=:LASTLOGIN, MOBILEPHONE='13000000000'  where USERID=:USERID11"; 
 OracleParameter p1 = new OracleParameter("LASTLOGIN", OracleDbType.Date);
p1.Value = Convert.ToDateTime(DateTime.Now.ToString()) ;
 cmd.Parameters.Add(p1);

 OracleParameter p2 = new OracleParameter("USERID11", OracleDbType.Int32);
p2.Value = int.Parse("1");
            cmd.Parameters.Add(p2);
            
           int i = cmd.ExecuteNonQuery();

执行成功

 

OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "update SYS_USER  set  LASTLOGIN=:LASTLOGIN, MOBILEPHONE='13000000000'  where USERID=:USERID11"; 
OracleParameter p2 = new OracleParameter("USERID11", OracleDbType.Int32);
p2.Value = int.Parse("1");
            cmd.Parameters.Add(p2);
            
           int i = cmd.ExecuteNonQuery();

 OracleParameter p1 = new OracleParameter("LASTLOGIN", OracleDbType.Date);
p1.Value = Convert.ToDateTime(DateTime.Now.ToString()) ;
 cmd.Parameters.Add(p1);

 


执行失败,报错:ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 DATE”

 

【结论】

通过搜索,发现ODP.NET的OracleCommand默认有一个属性BindByName是false,与Oracle.Client默认是不一样的。

需要默认启用 OracleCommand的BindByName

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值