使用带参数方式新增或修改可为空的非字符串类型数据到oralce数据库

Posted 清晨时光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带参数方式新增或修改可为空的非字符串类型数据到oralce数据库相关的知识,希望对你有一定的参考价值。

有时候没有使用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数据库的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 可为空的 uuid 类型 uuid 但表达式的类型为字符变化

输入数据集可为空的日期值存在问题

Typescript 映射类型,其中仅保留可为空的属性并转换为字符串类型

在表达式树中使用可为空的类型

堆栈溢出错误可为空的数字类型c#

如何使用 System.Text.Json 处理可为空的引用类型?