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描述的那个,返回一个不存在的值)。
解决方法二:
代码方面:更新和插入时,以对象的形式操作(因为操作时必须先实例化,可以在类的构造函数中加入初始值);
数据表方面:在设计数据库时,加入默认约束(这样可以避免很多代码方面的低级错误)
ADO.net 更新和插入数据 遇到null 执行不成功的更多相关文章
- oracle使用 merge 更新或插入数据
OracleCC++C# 总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...
- 在oracle中使用merge into实现更新和插入数据
目录 oracle中使用merge into DUAL表解释 使用场景 用法 单表 多表 oracle中使用merge into DUAL表解释 在Oracle数据库中,dual是Oracle中的一个 ...
- Excel 提供数据 更新或者插入数据 通过函数 自动生成SQL语句
excel 更新数据 ="UPDATE dbo.yt_vehicleExtensionBase SET yt_purchase_date='"&B2&"' ...
- python mysql 更新和插入数据无效
注意,在删除和增加后必须执行conn.commit()才有效,否则操作无效.
- MySQL高级知识(十)——批量插入数据脚本
前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...
- 当插入数据失败时,防止mysql自增长字段的自增长的方法
问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. ...
- MySQL如何快速插入数据
前言: 日常学习和工作中,经常会遇到导数据的需求.比如数据迁移.数据恢复.新建从库等,这些操作可能都会涉及大量数据的导入.有时候导入进度慢,电脑风扇狂转真的很让人崩溃,其实有些小技巧是可以让导入更快速 ...
- Ado.Net基础拾遗二:插入,更新,删除数据
插入数据 public void InsertDataToSQL() { string conStr = ConfigurationManager.ConnectionStrings["No ...
- 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据
第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...
随机推荐
- Des与3Des加密解密
/// <summary> /// Des和3Des算法 /// </summary> public class Des { /// <summary> /// D ...
- RemoteIE 开发者可跨平台使用IE测试网页
RemoteIE,这是一个基于微软Azure的服务,它允许开发者在最新版本的IE(Windows 10技术预览版)中测试他们的网页,而不需要安装或在虚拟机中设置对应的系统.要想使用这项服务,开发者需要 ...
- Edge.js:让.NET和Node.js代码比翼齐飞
通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...
- ABP理论学习之Web API控制器(新增)
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...
- mysql字符串处理例子
项目中用到的,要判断表中某个字段的某几位,若为某个值则替换,用到了几个典型的字符串操作,记录备注实现方案如下: 备注:如果替代字符串是唯一的话,可以用replace,这里用的是concat拼接. DE ...
- EMC学习之电磁辐射
我们在接触新鲜事物的时候,通常习惯用自己熟悉的知识去解释自己不熟悉的事物.EMC知识更多的涉及到微波和射频,对于像我这种专注于信号完整性而 对EMC知识知之甚少的菜鸟来说,最初也只能用SI的一些基础知 ...
- 剖析twemproxy前言
又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...
- sizzle分析记录:分解流程
<form> <label>Name:</label> <input name="name" /> <fieldset> ...
- python3 字符串与列表常用功能
一.字符串常用功能 1. capitalize(),将字符串的首字母变成大写,其余全部置为小写:如果字符串中有多个单词,也只是将第一个单词的首字母置为大写:例: >>> name = ...
- 【转】WPF DataGrid 获取选中的当前行某列值
方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...