今天抓了一個小問題,又是因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

Post a comment