世界快看:数据库编程 NET和SQLServer中“空值”辨析
.NET和SQL Server中“空值”辨析
初学数据库编程我们可能会有一些对“空值”的疑问,比如通过编程新建的一个表中所有数据皆显示为,手动添加并删除文字后又变成了空白;一个字符串类型的字段,明明没有填值,却不等于"";用ADO.NET从数据库中取值,每遇到有的就出错……这需要我们正确认识.NET和SQL Server中几种不同的“空值”。
(资料图片仅供参考)
1、真正的空值,也就是“没有输入的值”,可以出现在大多数类型的字段中(如果没有别的约束条件),SQL server中表示为null,显示为,手工在SQL server企业管理器中输入的方法是按Ctrl+0。它在.NET中对应System.DBNull.Value。在T-SQL命令中,判断一个值是不是空值,要用“is null”而不是“= null”;处理空值有个ISNULL函数,它使用指定的值替换null。用ADO.NET从数据库得到的空值无法自动转化为空字符串或Nothing,须手动检测:如果得到System.DBNull.Value,则赋给数据对象Nothing或其它自定义的有意义的值。
2、空字符串(零长度字符串),只出现在字符串类型(如nvarchar)的字段中,SQL server中表示为"",显示为空白,手工在SQL server企业管理器中输入时清空一个单元格即可。它在.NET中对应System.String.Empty,也就是我们常用的""。在T-SQL命令中处理空字符串和处理一般的字符串没什么区别。用ADO.NET从数据库得到的空字符串也和一般的字符串没什么区别。
DBNull简介
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是 1select null 这样返回的是DBNull.Valueselect isnull(null,1) 返回的是 1select top 0 id from table1 这样返回的值是nullselect isnull(id,0) from table1 where 1=0 返回的值是null
这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果一行都没有,那么ExecuteScalar就返回null
规则就是这样的。这里容易犯的一个错误是,把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。
补充:DBNull指的是数据库中的“null”,而不是CLR中的“null”。
如很多初学者以为下面是一样的:
cmd.Parameters["@payment_type"].Value = "";
cmd.Parameters["@payment_type"].Value = System.DBNull.Value;
“”表示的是空字符串,而System.DBNull.Value代表的是数据库中的NULL,既没有数据。就象老师说“0”不是没有一样
标签:
相关推荐:
最新新闻:
- 如何把脑电信号转换成功率谱?matlab脑电信号特征提取程序|天天速讯
- 全球热文:如何把真实的文件隐藏到一张图背后?内涵图制作
- 【技术】基于SIP协议的语音通信技术
- 世界快看:数据库编程 NET和SQLServer中“空值”辨析
- 有没有MAC的WPS?金山公司明年将有全平台的WPS:全球热门
- 今日看点:安卓手机如何设置便携式WLAN热点?设置教程
- 利勃海尔冰箱怎么样?利勃海尔冰箱有哪些优势?_全球速看料
- Trinity是什么?AMDTrinityAPU最新发布
- 怎么把Word转PDF格式?转换方法步骤
- 三星S6358怎么刷机?三星S6358移动定制版完整刷机教程|实时焦点
- 华为g9怎么样?华为g9参数配置评测
- 渲染农场:分布式并行集群计算系统
- win10系统显示不了桌面怎么回事?解决步骤如下_今日精选
- excel/word如何快速输入当前的时间和日期?输入方法技巧
- SCM供应链管理系统为企业带来哪些益处?SCM供应链管理系统介绍
- office怎么卸载?office卸载步骤-天天时讯
- 微信聊天记录怎么导出?微信聊天记录导出方法 环球观天下
- 天天头条:dr.dre耳机怎么样?dr.dre耳机简介及价格
- 数据透视表是什么?excel中数据透视表的基本概念 世界今热点
- 全球消息!新倩女幽魂哪个区人最多?2020倩女幽魂哪个区人多?
- 电脑扫描文件怎么弄?微信一物一码怎么开通? 环球关注
- Word转PDF用什么软件?全能PDF转换助手-全球观点
- 热门看点:Win8如何开启802.1x网络认证?Win8设置和修改系统电源方案的方法
- 数控铣床法兰克系统代码完整版 数控铣床法兰克系统代码大全
- 每日精选:网盘哪个好?网盘性能推荐
- 环球观天下!华为P50有哪些配置?华为P50参数配置介绍
- 【全球报资讯】荣耀MagicBook14用什么处理器?MagicBook14处理器介绍
- 天天安卓模拟器是什么?安卓模拟器电脑版下载
- n95手机怎么样?n95手机详细测评:今日讯
- 即时焦点:一文读懂程序化交易、算法交易、量化投资、高频交易
- 重磅!2022年第四届全国高校计算机能力挑战赛决赛晋级公示:世界看热讯
- 魔兽世界怀旧服:炼金术(350)技术介绍
- 环球报道:java基础知识:标签和target的属性
- 焦点关注:编辑好正文和引用内容的文本如何添加?
- 什么是沙盒游戏?沙盒类游戏哪十大排行?
- C++/MFC串口通信——光源控制器控制
- Linux下常见的锁机制-自旋锁 自旋锁spinlock见解
- typec数据线是什么?Type-C数据线有哪些优势?:每日播报
- 奖学金名称都有哪些?奖学金名称中英文对照表:焦点短讯
- 世界观察:苹果care是什么意思?苹果care的含义
- 华为matebook和荣耀magicbook有什么区别?两者区别介绍
- 小米手机如何刷机?小米手机刷机教程步骤
- 打印机硒鼓的寿命一般多久?硒鼓多久换一次?
- 开机后桌面显示慢怎么办? 电脑桌面刷新很慢解决方法
- PSAM部分的硬件设计 PSAM部分的硬件设计图
- 双通道内存有什么好处?双通道内存好处介绍
- 天天滚动:梅西C罗姆巴佩等众星发文缅怀球王:安息吧!贝利
- 环球快看点丨什么是静电耳机? 静电耳机和普通耳机什么区别?
- 库尔勒经济开发区:电子政务“一站式”服务平台 焦点速看
- cmake-3.19.6-Linux自解压程序 简单的自解压程序|天天动态
- 双通道内存有什么好处?双通道内存好处介绍
- 图省事、紧裤腰,65亿用户规模,影视OST怎么失灵了?|全球观点
- 被覆盖的文件如何恢复?不小心把文件覆盖了怎么恢复?
- 防火墙ddos防御设置 windows防火墙ddos
- IE浏览器在电脑哪里?查找IE浏览器的方法
- 清空浏览器缓存怎么操作?清理浏览器历史浏览记录方法
- 两寸证件照尺寸是多少?二寸证件照快速制作步骤
- 如何设置开机u盘启动?开机优先启动u盘
- kdh是什么文件?kdh文件怎么转换成word文件
- 什么是dns服务器?设置DNS提升网速方法
- 云手机是什么东西?云手机用途
- 手机没有信号无服务是怎么回事?手机没信号解决思路
- 电脑虚拟内存不足怎么解决?教你彻底清理C盘垃圾
- 打印机墨水怎么加?佳能型号打印机加墨水教程
- 固态硬盘怎么安装?固态硬盘安装后需要怎么设置?
- 摄像机像素和分辨率区别是什么?摄像机像素和分辨率区别介绍
- 主板温度多少算正常? 主板温度高怎么办?
- 联想最新笔记本系统如何恢复?一键还原的使用方法
- 来了!《潜行者2:切尔诺贝利之心》首个实机演示公开 2023年发售-焦点速讯
- “球王”贝利去世 终年82岁 当前热闻
- Xbox金会员1月会免游戏公布 《彩虹坠入》等入库|今日观点
- 今日精选:疫情下的农村老人
- 傲意科技完成近亿元Pre-B轮融资,智慧互联产业基金、中原前海基金领投
- 封杀半年后 俄罗斯用户可以下载Windows 11了
- 前沿热点:三星Galaxy Book2 Pro 360发布 搭载高通骁龙 8cx Gen 3