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

本文转载:http://www.cnblogs.com/zfanlong1314/archive/2013/08/07/3243533.html

今天碰到个问题。。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();

C#中往数据库插入/更新时候关于NUll空值的处理的更多相关文章

  1. C#:往数据库插入/更新时候关于NUll空值的处理

    前几天遇到一个问题,找了好久才找到解决办法.不过也很开心,终于解决了. 问题:前端当我数据为空的时候不赋值,传到后台也为空的时候(注意:是Null不是""),SqlCommand对 ...

  2. 在function module 中向数据库插入数据

    http://www.sapjx.com/abap-function-module.html 1: 应该在function module 中向数据库插入数据

  3. Android中当数据库需要更新时我们该怎么办?

    问题:Android数据库更新并保留原来的数据如何实现 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我 ...

  4. C#中往数据库插入空值报错解决方法

    C#中的NUll于SQL中的null是不一样的, SQL中的null用C#表示出来就是DBNull.Value 在用C#往数据库里面插入记录的时候, 可能有的字段你不赋值,那么这个字段的值就为null ...

  5. DButils工具类能够用来获取数据库连接向数据库插入更新删除对象2

    package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import ja ...

  6. 41、Android中当数据库需要更新时我们该怎么办?

    转载  http://blog.csdn.net/jiangwei0910410003/article/details/39670813

  7. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  8. Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新

    需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...

  9. sqlserver 插入 更新 删除 语句中的 output子句

    官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...

随机推荐

  1. 【LeetCode】273. Integer to English Words

    Integer to English Words Convert a non-negative integer to its english words representation. Given i ...

  2. leveldb - menifest文件格式

    MANIFEST文件是Level DB的元信息文件,它里面的格式是leveldb的Log格式,一个menifest是一个record: void VersionEdit::EncodeTo(std:: ...

  3. Activity intent经常使用的 FLAG

    Intent.FLAG_ACTIVITY_NEW_TASK 默认的跳转类型,会重新创建一个新的Activity,不过与这种情况,比方说Task1中有A,B,C三个Activity,此时在C中启动D的话 ...

  4. A simple visualization of energy function and energy gap in hopfield nets

  5. apache工作模式:prefork和worker

    apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...

  6. [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式

        在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发.解决的方案是采用抽象后的BaseActi ...

  7. [原创]android自定义动画的一点感悟

    android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...

  8. Swift 自动布局框架-SnapKit

    官方网址:http://snapkit.io/ Github: https://github.com/SnapKit/SnapKit SnapKit is a DSL to make Auto Lay ...

  9. linux epoll 开发指南-【ffrpc源码解析】

    摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本文主要探讨服务器程序中epoll的使用技巧.Epoll一般 ...

  10. js最新手机号码、电话号码正则表达式

    原文链接:http://caibaojian.com/regexp-example.html 正则表达式(regular expression)是一个描述字符模式的对象.使用javascript正则表 ...