码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2014-12-30 15:15:19      阅读:558      评论:0      收藏:0      [点我收藏+]

标签:

【问题】

底层数据库链接由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

 

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

标签:

原文地址:http://blog.csdn.net/onemetre/article/details/42266003

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!