ADO.net 更新和插入数据 遇到null 执行不成功

首先交代下背景,遇到一个问题:SqlCommand新增记录时,参数为null时,运行并不报错,只是返回(0),也就是更新失败。

在用C#往数据库里面插入记录的时候, 可能有的字段我们并不赋值(有可能是无意识的情况,比如前面代码返回时间类型结果为NULL),那么这个字段的值就为null,一般情况下,参数会被数据库接受, 然后在数 据表的字段里面显示为NUll, 实际上这就牵扯到一个类型的

问题, C#中的NUll与SQL中的null是不一样的, SQL中的null用C#表示出来就 是DBNull.Value, 所以在进行Insert的时候要注意的地方。

摘引下MSDN:

在.NET中,DBNull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在的列的 DBNull 对象。此外,COM 互操作使用 DBNull 类来区分 VT_NULL 变量(指示不存在

的值)和 VT_EMPTY 变量(指示未指定的值)。

DBNull 类型是一个单独的类,这意味着只有一个 DBNull 对象存在。DBNull.Value 成员表示唯一的 DBNull 对象。DBNull.Value 可用于将不存在的值显式分配给数据库字段,但大多数 ADO.NET 数据提供程序在字段没有有效值时会自动分配 DBNull 值。您可以通

过将从数据库字段检索到的值传递给 DBNull.Value.Equals 方法,确定该字段值是否为 DBNull 值。然而,有些语言和数据库对象提供一些方法,可以更容易地确定数据库字段值是否为 DBNull.Value

举个例子:

SqlCommand cmd=new  SqlCommand("Insert into Student values(@name,@birth)" ,conn);
cmd.parameters.add("@name" ,name);
cmd.parameters.add("@birth" ,birth);
cmd.ExecuteNonQuery();

这段代码看着、编译都不会报错,但是如果是birth的值在.net中为null,则执行不成功。

解决办法一:

 public static object  SqParameterVlidatelNull(object  obj)
        {
            if  (obj == null )
                return  DBNull.Value;
            return  obj;
        }
cmd.parameters.add("@name" ,SqParameterVlidatelNull(name));cmd.parameters.add("@birth" ,SqParameterVlidatelNull(birth));cmd.ExecuteNonQuery();

直接对参数进行验null值,如果为null,则返回DBNull.Value(如msdn描述的那个,返回一个不存在的值)。

解决方法二:

代码方面:更新和插入时,以对象的形式操作(因为操作时必须先实例化,可以在类的构造函数中加入初始值);

数据表方面:在设计数据库时,加入默认约束(这样可以避免很多代码方面的低级错误)

时间: 2024-12-30 18:19:13

ADO.net 更新和插入数据 遇到null 执行不成功的相关文章

SQL必知必会 笔记 第十六章 更新和插入数据

16.1更新数据 为了更新(修改)表中的数据,可使用UPDATE语句.可采用两种方式使用UPDATE: (1)更新表中特定的行 (2)更新标红所有的行 不要省略WHERE子句:在使用UPDATE时一定要注意细心.因为稍不注意,就会更新表中所有行. 基本的UPDATE语句由3部分组成: (1)要更新的表 (2)列名和它们的新值 (3)确定要更新哪些行的过滤条件 不要省略WHERE子句 更新单个列 UPDATE Customers SET cust_email = '[email protected

当插入数据失败时,防止mysql自增长字段的自增长的方法

问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. 原因: 自增是缓存在内存字典中的,分配方式是先预留,然后再插入的.所以插入失败不会回滚内存字典. 解决方法: 在php程序中可以加一段代码,当插入数据失败时,执行sql语句重新设置auto_increment的值: $sql = alter table `tbname` auto_incremen

Ado.Net基础拾遗二:插入,更新,删除数据

插入数据 1 public void InsertDataToSQL() 2 { 3 string conStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 4 SqlConnection conn = new SqlConnection(conStr); 5 conn.Open(); 6 7 SqlCommand cmd = new SqlCommand

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

MySQL插入、更新、删除数据

1.插入数据:由于下表的id会自增,故赋值null. 注意:字符串用'   '单引号,不能双引号,英文状态下. 可以写上部分属性名进行插入操作,如bookTypeId没写,默认NULL. 也可以写上所有的属性名进行插入操作: 同时插入多条数据,重点是:VALUES(),(),(),.....(); ======================================================== 2.更新数据 单条更新前: 单条更新后:(属性名之间用英文的逗号隔开) 多条更新之前:

微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中的这种不规则文件,第一行,第二行 Header 部分,第三行的内容 Content 部分,最后一行的 Trailer 部分. 在前几个课程 微软BI SSIS 2012 ETL 控件与案例精讲 第43,44,45,46 课中,我分别讲解了如何使用 .Script Component Source 解

hibernate在Oracle中插入数据,默认字段被设置为null的问题解决

参考内容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在数据库中一个字段的默认值为1,但是在插入数据后,本来该字段为空,值应该为1,但是实际值为空. 查看了一下日志中输出的语句,在插入改条数据时,首先执行insert语句,然后执行update语句,在update的时候,将该值更新为null. 解决办法: 在*.hbm.xml添加参数: <*** dynamic-insert='true' dynamic-update=

mysql——插入、更新、删除数据(概念)

一.插入数据 1.为表的所有字段插入数据 -------------------------------------------------------------------------- (1)insert语句中不指定具体的字段名 语法格式:insert into 表名 values(值1,值2,……,值n); 表名指定记录插入到哪一个表中: 值等表示要插入的数据:值1到值n分别对应着表中的每一个字的:表中定义了几个字段,insert语句中就应该对应有几个值: 值插入的顺序与表中字段的顺序相

第七章 插入、更新与删除数据

插入数据 1.为表左右字段插入数据 insert into 表名 values (值1,值2,……) 或 insert into 表名 (属性1,属性2,……) values (值1,值2……) 2.为指定字段插入数据 insert into 表名 (属性1,属性2,……) values (值1,值2……) 3.同时插入多条记录 insert into 表名 [(属性列表)] values(取值列表),(取值列表2),……: 4.将查询结果插入到表中 insert into 表名1 (属性列表1