標籤:
【問題】
底層資料庫連結由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