【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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。