C#中为数据库插入/更新上有关NUll空值的处理

 

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

 

今天赶上个问题。。SqlCommand对传送的参数中设字段的价值是NULL具然不开展翻新操作,也未提拔任何错误。。。百思不得其解。。。先作个记录,再翻资料看啊由。

暂行的缓解方式:

1、Update不支持创新Null,先Delete后Insert来为换.
2、替代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操作时加了有限量。我们要明确指示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#望数据库里插入记录之时光, 可能有些字段你无赋值,那么这字段的值就也null, 如果按一般想法的话,这个值会被数据库接受, 然后当屡次
据表里面显示也NUll, 实际上就即拉到一个品种的题材, 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.
        但是如此当一个数据库有成百上千许段时还是是发生为数不少张表时, 代码就会见成千上万了,我也从来不找到特别好的艺术,我的艺术是:写一个静态的不二法门来针对变量的值进行判定:

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();

相关文章