【問題】
底層數據庫鏈接由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