有时候没有使用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,这样再次执行,发现不再报错。