C#中往数据库插入/更新时候有关NUll空值的处理

 

本文转载:http://blog.csdn.net/chybaby/article/details/2338943

 

明日遇见个难点。。SqlCommand对传送的参数中一经字段的值是NULL具然不开始展览立异操作,也不提醒任何错误。。。百思不得其解。。。先作个记录,再查资料看看哪些来头。

暂且的消除情势:

一、Update不支持立异Null,先Delete后Insert来替换.
二、替代Null的章程,对于字符型,只倘使Null,改为空,语句中正是”.

找到了连带的缓解方法

ADO.Net的Command对象怎么着向数据库插入NULL值(原创)

诚如的话,在Asp.Net与数据库的竞相中,经常接纳Command对象,如:SqlCommand。通过Command对象对数据库操作是优异安全和有利的(相对于RecordSet方式)。但是,同时发现了贰个标题。像微微日子字段,假若用户没有选用日期,大家期待他保持NULL状态。小编写的主要代码如下:

SqlCommand sqlCmd = new SqlCommand(sqlStatment, dbConn);
sqlCmd.Parameters.AddWithValue(“@Name”, name);
sqlCmd.Parameters.AddWithValue(“@Surname”, surname);

此刻,虽未出错,但重临的熏陶行数告诉本身。更新未得逞。那是怎么回事呢?
本来ADO.Net为了防患某个不易于找出的失实,在Command操作时加了1些限量。我们亟须旗帜显著提示Command对象,大家要求插入NUll值。修改后的代码如下:

SqlCommand sqlCmd = new SqlCommand(sqlStatment, dbConn);
sqlCmd.Parameters.AddWithValue(“@Name”, name);
sqlCmd.Parameters.AddWithValue(“@Surname”, surname);
sqlCmd.Parameters[0].IsNullable = true;
sqlCmd.Parameters[1].IsNullable = true;

只是,还有一些要留意的正是,这里的IsNullable,不是说你能够插入null值,而是指DBNull.Value值。

瞩望那一点小经验会对我们有帮忙。

 

 

方法一、 

public int UpdateFeedBackStatus(int _feedBackID, int _status, object _RequestDateTime)
        {
            SqlParameter[] param = {
                                       new SqlParameter(“@FeedBackID”, _feedBackID),
                                       new SqlParameter(“@FeedBackStatusID”, _status),
                                       new SqlParameter(“@RequestDateTime”, _RequestDateTime)
                                    };
            StringBuilder strSql = new StringBuilder();
            strSql.Append(“UPDATE dbo.FeedBack “);
            strSql.Append(“SET FeedBackStatusID=@FeedBackStatusID,RequestDateTime=@RequestDateTime “);
            strSql.Append(“WHERE FeedBackID=@FeedBackID “);
            return DbHelper.ExecuteNonQuery(CommandType.Text,strSql.ToString(),param);
        }

调用:
 feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4, DBNull.Value);

 或者feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4,null);

 

方法二:

  public int UpdateFeedBackStatus(int _feedBackID, int _status, DateTime? _RequestDateTime)
        {
            SqlParameter[] param = {
                                       new SqlParameter(“@FeedBackID”, _feedBackID),
                                       new SqlParameter(“@FeedBackStatusID”, _status),
                                       new SqlParameter(“@RequestDateTime”, _RequestDateTime)
                                   };
            param[2].IsNullable = true;
            StringBuilder strSql = new StringBuilder();
            strSql.Append(“UPDATE dbo.FeedBack “);
            strSql.Append(“SET FeedBackStatusID=@FeedBackStatusID,RequestDateTime=@RequestDateTime “);
            strSql.Append(“WHERE FeedBackID=@FeedBackID “);

            return DbHelper.ExecuteNonQuery(CommandType.Text,strSql.ToString(),param);
        }

调用:
 feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4,null);

 

二、C#中往数据库插入空值的题材

在用C#往数据Curry面插入记录的时候, 大概有的字段你不赋值,那么这些字段的值就为null, 若是按1般想法的话,这一个值会被数据库接受, 然后在数
据表里面展现为NUll, 实际上那就推抢到1个项目标题材, C#中的NUll于SQL中的null是不雷同的, SQL中的null用C#代表出来正是DBNull.Value, 所以在实行Insert的时候要留意的地方.

Example:
       SqlCommand cmd=new  SqlCommand(“Insert into Student values(@StuName,@StuAge)” ,con);
       cmd.parameters.add(“@StuName” ,stuname);
       cmd.parameters.add(“@StuAge” ,stuage);
       cmd.ExecuteNonQuery();

这一个代码看似没至极, 其实当stuname于stuage中的任何一个值为null的时候, 那代码就会报错…汗!!!

化解办法:

        其实最简单易行的法子正是进展判断, 当stuname或stuage为空时, 插入DBNull.Value.
        但是那样当3个数据库有众多字段时还是是有众多张表时, 代码就会过多了,作者也从未找到特别方便的不二法门,作者的不二等秘书诀是:写2个静态的方式来对变量的值举办判断:

Example :     

        static  public  object  SqlNull(object  obj)
        {
            if  (obj == null )
                return  DBNull.Value;

            return  obj;
        }

       //用上边的主意对参数进行了判断 
       cmd.parameters.add(“@StuName” ,SqlNull(stuname));
       cmd.parameters.add(“@StuAge” ,SqlNull(stuage));
       cmd.ExecuteNonQuery();

相关文章