Unassigned Parameter in ODP.NET and System.Data.OracleClient
0 |
今天抓了一個小問題,又是因System.Data.OracleClient與ODP.NET行為不同所致:
using (OracleConnection cn = new OracleConnection(
"Data Source=MyOracle;User Id=myUser;Password=myPass;"))
{
OracleCommand cmd = new OracleCommand(
"SELECT * FROM UserTable WHERE UserId = :userId", cn);
cmd.Parameters.Add("userId", OracleType.VarChar);
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataTable dt = new DataTable();
if (bMode == "Add")
{
da.Fill(dt);
DataRow row = dt.NewRow();
row["UserId"] = "AAA";
row["UserName"] = "UserAAA";
dt.Rows.Add(row);
da.Update(dt);
}
else if (bMode == "Update")
{
//...略...
}
}
有一段類似以上的程式邏輯,用DataAdapter來做資料Insert或Update,程式寫法本身有點疑問,但用ODP.NET跑了好幾年相安無事,最近把類似的邏輯翻到MS的OracleClient卻出了問題。
程式本身的瑕疵在於宣告了Parameter["userId"]卻沒有指定值。經測試驗證,同樣的程式寫法用配合ODP.NET可以過關,但跑MS OracleClient或SqlClient時會傳出Parameterized Query '(@userId varchar(16)' expects parameter @userId, which was not supplied的錯誤訊息。
換句話說,ODP.NET在OracleCommand.Parameter未指定時應會給予預設空值,而OracleClient則是直接觸發例外! 這點經驗跟大家分享一下。
Comments
Be the first to post a comment