分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
220 字
1 分钟
[C#] 如何优雅的解决 DBNull 问题
- 什么是 DBNull 问题 指从数据库取出数据时, 数据为空, 表现为 DBNull 无法转换为其他类型
- 异常示例:
// reader 为 DbDataReader DateTime dt = reader.GetDateTime(0); // 在这里如果数据为空, 则会抛出异常
- 普通的解决方式:
DateTime dt = reader.IsDBNull(0) ? default(DateTime) : reader.GetDateTime(0);
- 优雅而又牛啤的解决方式:
然后在取值的时候这样做:// 新建一个文件, 写入以下内容 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace NullLib.DbHelper { public static class DbExt { public static T Cast<T>(this object obj) // 使用 default 默认值 { if (obj is T rst) return rst; return default; } public static T Cast<T>(this object obj, T dft) // 用户指定默认值 { if (obj is T rst) return rst; return dft; } public static object CastDb(this object obj) // 将CLR对象转换为数据库类型 { if (obj is null) return DBNull.Value; return obj; } } }
DateTime dt = reader[0].Cast<DateTime>(); // 如果取值失败则会返回 default(DateTime)
[C#] 如何优雅的解决 DBNull 问题
https://slimenull.com/posts/20210714233802/