【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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章