C#中往数据库插入/更新时候关于NUll空值的处理
本文转载: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,改为空,语句中就是''.
找到了相关的解决方法
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空值的处理的更多相关文章
- C#:往数据库插入/更新时候关于NUll空值的处理
前几天遇到一个问题,找了好久才找到解决办法.不过也很开心,终于解决了. 问题:前端当我数据为空的时候不赋值,传到后台也为空的时候(注意:是Null不是""),SqlCommand对 ...
- 在function module 中向数据库插入数据
http://www.sapjx.com/abap-function-module.html 1: 应该在function module 中向数据库插入数据
- Android中当数据库需要更新时我们该怎么办?
问题:Android数据库更新并保留原来的数据如何实现 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我 ...
- C#中往数据库插入空值报错解决方法
C#中的NUll于SQL中的null是不一样的, SQL中的null用C#表示出来就是DBNull.Value 在用C#往数据库里面插入记录的时候, 可能有的字段你不赋值,那么这个字段的值就为null ...
- DButils工具类能够用来获取数据库连接向数据库插入更新删除对象2
package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import ja ...
- 41、Android中当数据库需要更新时我们该怎么办?
转载 http://blog.csdn.net/jiangwei0910410003/article/details/39670813
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新
需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...
- sqlserver 插入 更新 删除 语句中的 output子句
官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...
随机推荐
- 怎样用UltraISO制作U盘系统安装盘
http://jingyan.baidu.com/article/d169e186800f02436711d87b.html 如今用u盘装系统成为主流,如何不被社会淘汰.跟我往下边看吧~~ 工具/原料 ...
- ABAP报表中负值展示问题的处理方法
现象描述 在使用ABAP报表展示数据的时候会涉及到金额类字段,在手动计算金额的时候,有时会发生存在负值而无法正常展示的情况. 处理过程 ABAP报表的数据展示常用的方法有两种,分别是表控制和ALV ...
- 解决Windows Server2008 R2中IE开网页时弹出阻止框(Windows Server2008网页无法打开的问题)
相信使用Windows Server2008的朋友都遇到过这种情况,用IE打开网站时会弹出“Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容”的对话框.如下图所示 ...
- 【css】a:hover 设置上下边框在 ie6 和 ie7 下失效
前段时间在写样式的时候发现了这个问题,虽然当时就解决了这个 bug 不过还是记录下,以免再次出现这样的问题. demo 代码: <!doctype html> <html lang= ...
- 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
Linux 在Linux上自动调整屏幕亮度来保护眼睛 - 51CTO.COM -- 介绍了Camera和RedShift这两款工具 How to automatically dim your scre ...
- GPL与LGPL的区别
GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样.GPL的出发点 ...
- Ubuntu 14.04 安装nVidia驱动后不能进入图形界面的恢复过程
想要解决Ubuntu14.04的风扇不停的转的问题.由于ubuntu本身不支持双显卡切换,导致集显独显都处于开启状态,发热量和耗电量居高不下. 1. 安装驱动过程 参考[1]中的步骤,做了如下的操作. ...
- CLR via C#深解笔记四 - 方法、参数、属性
实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...
- centos下配置java环境变量
一. 需要配置的环境变量1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下的bin ...
- oracle 空间数据库说明
转:http://blog.csdn.net/jing_xin/article/details/4355642 由于最近弄一些空间数据,所以找了些oracle空间数据库的一些知识.下面是汇总: Ora ...