DBNull与Null的区别

深入理解C#中的DBNull 而在C#中,空值通常用null表示,但是在与数据库交互时,使用DBNull来表示数据库中的空值是更为合适的选择。在C#中,DBNull是一个特殊的类,用于表示数据库中的空值。通过使用DBNull.Value属性,我们可以检查数据库字段是否为空值,并使用DBNull.Value来插入和读取空值。在C#中,DBNull是一个特殊的类,用于表示数据库中的空值。DBNull提供了一种标准化的方式来表示数据库字段中的缺失值,它是一个单例类,意味着在整个应用程序中只存在一个DBNull实例。如有任何疑问,请随时提问! 阅读详情

在其他网站上看见的,感觉讲的不错,链接地址:http://www.cnblogs.com/muou/archive/2010/03/23/1692391.html

Null是.net中无效的对象引用。

DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(<NULL>)时,在.net中的值。

null表示一个对象的指向无效,即该对象为空对象。

DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException,但有可能抛下标越界的异常。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand(OleDbCommand,SqlCommand...) 的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1
select null 这样返回的是DBNull.Value
select isnull(null,1) 返回的是 1
select top 0 id from table1 这样返回的值是null
select isnull(id,0) from table1 where 1=0 返回的值是null

这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果一行都没有,那么ExecuteScalar就返回null。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=cmd.ExecuteScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name 这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=Convert.ToInt32(cmd.ExecuteScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where username=@name

但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为DBNull.Value,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有默认参数 @val nvarchar(20)="AABB" ,
那么cmd.Parameters["@val"].Value=null 代表使用这个默认的 "AABB"
而cmd.Parameters["@val"].Value=DBNull.Value 代表使用NULL来传给 @val

你可以用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false,也就是说null跟DBNull.Value是不等的。

asp.net中对数据库表插入null空值的问题 立即下载

相关推荐

凌欧通用FOC框架解析(5.程序环流程)

结构体:电流内环.这是一个结构体函数占空比13.

weixin_43756295的博客 2934

C#中DBNull和NULL区别

**1、**DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空()时,在.net中的值。null表示一个对象的指向无效,即该对象为空对象。 对数据库中的数据进行判断时,用if (!(sdrCT[0] is DBNull)),而不是用!=代替is。null 是c#中的null,dbnull是数据库中的null类型。两个是不等的。 所以在往数据库里面存储null类型的时...

qq_37271216的博客 1787

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 471

[C#] 如何优雅的解决 DBNull 问题

什么是 DBNull 问题 指从数据库取出数据时, 数据为空, 表现为 DBNull 无法转换为其他类型 异常示例:// reader 为 DbDataReader DateTime value = reader.GetDateTime(0); // 在这里如果数据为空, 则会抛出异常 普通的解决方式:DateTime value = reader.IsDBNull(0) ? default(DateTime) : reader.GetDateTime(0); 优雅而又牛啤的解决方式:// 新建.

诺尔的博客 5159

[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析

本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。

weixin_29211309的博客 350

ESP32蓝牙配网实战:微信小程序中的blufi协议实现与优化

本文详细介绍了在微信小程序中实现ESP32蓝牙配网的实战经验,重点解析了blufi协议的应用与优化。内容涵盖从开发环境配置、协议帧格式解析,到小程序端蓝牙通信、数据转换的核心步骤,并提供了配网状态机设计、错误处理及性能调优等进阶方案,旨在帮助开发者高效、稳定地完成物联网设备配网功能开发。

weixin_29159613的博客 456

C#中的DBNull、Null、String.Empty和“”

null可赋值任何变量,将变量置为空  DBNull只用于DataRow对象,表示数据库中的空值  String.Empty是0长度字串  Convert.IsDBNull判断是否为DBNull   DBNull.Value与Null的区别 Null是.net中无效的对象引用。 DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空()时,

Wanda && Aidem 1461

28、基准剂量法:原理、应用与计算详解

本文详细介绍了基准剂量法(BMD)的原理、在监管机构中的应用以及具体的计算方法。内容涵盖样本量与BMD的关系、主要监管机构如EPA对BMD的应用、BMD的模型选择与数据拟合过程、拟合优度评估、下置信限(BMDL)计算,以及实验设计对BMD结果的影响。同时,还讨论了剂量指标和响应选择的关键问题,为理解和应用基准剂量法提供了全面的参考。

info6的博客 280

DBNull与null

coding过程中遇到的问题,找到了一个比较好的解释,留下记录: Null是.net中无效的对象引用。DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空()时,在.net中的值。null表示一个对象的指向无效,即该对象为空对象。DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。

liugy1126的专栏 1478

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4497

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2474

dbnull和null_DBNull Null等区别

1.对DBNull的解释:该类用于指示不存在某个已知值(通常在数据库应用程序中)。在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(DBNull.Value 实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有 DBNull 值。该类还可以用于在 COM Interop 中区分 VT_NULL 变量(与空对象关联)和 VT_EMPTY 变量(...

weixin_36467048的博客 2437

工业-实时数据采集

在主节点使用Flume采集/data_log目录下实时日志文件中的数据,将数据存入到Kafka的Topic 中(Topic名称分别为ChangeRecord、ProduceRecord和EnvironmentData,分区数为4),Flume 采集ChangeRecord。

dafsq的博客 590

.net中DBNull与Null的区别

引用自:http://www.cnblogs.com/muou/archive/2010/03/23/1692391.html DBNull与Null的区别 Null是.net中无效的对象引用。 DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(&lt;NULL&gt;)时,在.net中的值。 null表示一个对象的指向无效,即该对象为空对象。 DBNu...

badaaasss的专栏 1111

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

dbnull和null_NULL和DBNull的区别分析

测试准备:1.新建一个表CREATE TABLE `cacb` (`CA` varchar(255) DEFAULT NULL,`CB` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;2.新建一个控制台项目,主函数实现如下:#region Mysql DBNull测试string con = "server=localh...

weixin_42397141的博客 726

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

DBnull和null的区别有哪些

 一、DBNull   1、DBNull 从不等于任何值。DBNull是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是 DBNull.Value。 2、DBNull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在的列的 DBNull 对象。 3、在数据库应用程序中,空

whazhl的专栏 773

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

dbnull和null_DBNull和null的区别

参考资料:http://stackoverflow.com/questions/4958379/what-is-the-difference-between-null-and-system-dbnull-valuehttp://www.cnblogs.com/muou/archive/2010/03/23/1692391.html区别:1:DBNull 是一个系统数据类中的静态实例null该值表示...

weixin_39842611的博客 288

dbnull mysql_DBNull和Null的区别

DBNull 类 表示不存在的值。无法继承此类。 命名空间: System 程序集: mscorlib(在 mscorlib.dll 中) DBNull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在DBNull 类表示不存在的值。无法继承此类。命名空间: System程序集: mscorlib(在 mscor...

weixin_32563411的博客 511

dbnull mysql_C# DBNULL与NULL之间的区别【转】

null是.net中无效的对象引用。DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空()时,在.net中的值。null表示一个对象的指向无效,即该对象为空对象。DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。DBNull在DotNet是单独的一个类型System.DBNull。它只有一个值...

weixin_36433524的博客 277

dbnull和null_DBNull与Null的区别

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式...

weixin_31367439的博客 222

Null,DBNULL等的区别?

<br />1.对DBNull的解释:<br />    <br />    该类用于指示不存在某个已知值(通常在数据库应用程序中)。<br />    在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(DBNull.Value实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有DBNull值。<br />    该类还可以用于在COM Interop中区分 VT_NULL 变量(与空对象关联)和 VT_EMPTY  变量(与DBNull.Value实

weijungao的专栏 478
上一篇: datatable相关增、删、改、查处理
下一篇: DotfuscatorPro_4.9的使用
勤学者闯天涯
博客等级 码龄10年 25粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值