1. 程式人生 > >使用帶參數方式新增或修改可為空的非字符串類型數據到oralce數據庫

使用帶參數方式新增或修改可為空的非字符串類型數據到oralce數據庫

dbn AC .dsp dbnull 代碼生成器 出現 .exe CI rac

有時候沒有使用orm框架,手工編寫或者代碼生成器生成的帶參數的insert語句時,比如

/// <summary>
        /// 增加一條數據
        /// </summary>
        public static bool Add(Model.IMGINFO model)
        {
            StringBuilder strSql=new StringBuilder();
            strSql.Append("insert into IMGINFO(");
            strSql.Append("ID,RYCRJLXXID,DSP,XP,INSERTTIME,SCIP)
"); strSql.Append(" values ("); strSql.Append(":ID,:RYCRJLXXID,:DSP,:XP,:INSERTTIME,:SCIP)"); OracleParameter[] parameters = { new OracleParameter(":ID", OracleType.VarChar,32), new OracleParameter(":RYCRJLXXID", OracleType.VarChar,32
), new OracleParameter(":DSP", OracleType.Blob), new OracleParameter(":XP", OracleType.Blob), new OracleParameter(":INSERTTIME", OracleType.DateTime), new OracleParameter(":SCIP", OracleType.VarChar,32)}; parameters[
0].Value = model.ID; parameters[1].Value = model.RYCRJLXXID; parameters[2].Value = model.DSP; parameters[3].Value = model.XP; parameters[4].Value = model.INSERTTIME; parameters[5].Value = model.SCIP; return DBHelperTarget.ExecuteCommand(strSql.ToString(),parameters); }

初看這個代碼沒有任何問題,參數都有綁定,但是執行的時候卻報錯了,錯誤大概意思是部分參數沒有綁定數據,怎麽會出現這樣的情況?

因為這個例子中對象的DSP和XP以及INSERTTIME都是非必填項,問題就出在這了,有時候給對象賦值的時候這幾個字段沒有賦值,就是默認的null,但是oracle執行的時候會認為你沒有給參數綁定值。這裏給出個解決方案,將可為空的非字符串類型字段定義為object類型。

例如

[Serializable]
    public partial class IMGINFO
    {
        public IMGINFO()
        {}
        #region Model
        private string _id;
        private string _rycrjlxxid;
        private object _dsp;
        private object _xp;
        private object _inserttime;

        public string SCIP { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string ID
        {
            set{ _id=value;}
            get{return _id;}
        }

        public string RYCRJLXXID
        {
            set{ _rycrjlxxid=value;}
            get{return _rycrjlxxid;}
        }
 
        public object DSP
        {
            set{ _dsp=value;}
            get{return _dsp;}
        }

        public object XP
        {
            set{ _xp=value;}
            get{return _xp;}
        }
   
        public object INSERTTIME
        {
            set{ _inserttime=value;}
            get{return _inserttime;}
        }

在給對象賦值的時候這個幾個特殊字段不為空時賦值對應的類型數據,如果為空,賦值為DBNull.Value,這樣再次執行,發現不再報錯。

使用帶參數方式新增或修改可為空的非字符串類型數據到oralce數據庫