C# Table DBNull.Value

本文探讨了在C#中使用DBNull.Value进行数据库字段空值判断的重要性,避免因未正确判断null值而导致的程序异常。介绍了在.NET中如何区分null与DBNull.Value,以及在数据操作时的正确实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来建张表,某个字段为null,随便加了点数据

今天公司一个小朋友问我,我判断了为null的,怎么还报错呢?

通常在C#里面写代码判断值是否null,就是  obj == null

因为知道他写的是个控制台应用程序,估计多半返回的是table,就直接告诉他你如果用的是table就要判断dbnull。

来看看返回的类型:

 

所以问你必须要用 if (obj== DBNull.Value) 来判断。另外用table添加到表,字段为null的时候,也是需要赋值为DBNull.Value。

总之坑过几次的人都知道。。。。

 

这么多年来,数据库字段能给默认值就给默认值,能不为空就不为空,这样开发会省出好多意外错误。

using System; using System.Data; using System.Data.SQLite; using System.IO; namespace SqliteTimeFilter { internal class Program { private const string InputDb = @"input.db"; private const string OutputDb = @"output.db"; private static void Main() { if (File.Exists(OutputDb)) File.Delete(OutputDb); SQLiteConnection.CreateFile(OutputDb); using var srcConn = new SQLiteConnection($"Data Source={InputDb}"); using var dstConn = new SQLiteConnection($"Data Source={OutputDb}"); srcConn.Open(); dstConn.Open(); // 1. 仅创建 _3CH_12 表结构 const string getCreateSql = "SELECT sql FROM sqlite_master WHERE type='table' AND name='_3CH_12'"; string createTableSql; using (var cmdGet = new SQLiteCommand(getCreateSql, srcConn)) { createTableSql = cmdGet.ExecuteScalar() as string; } if (string.IsNullOrEmpty(createTableSql)) throw new Exception("源数据库里没有 _3CH_12 表!"); using (var cmdCreate = new SQLiteCommand(createTableSql, dstConn)) cmdCreate.ExecuteNonQuery(); // 2. 查询 18:30:50 – 18:10:00 之间的数据 const string sqlSelect = @" SELECT id, time, father, child, cycle, current_sys, master, data FROM _3CH_12 WHERE datetime(substr(replace(time, '\"', ''), 1, 19)) BETWEEN datetime('2025-07-12 17:30:00') AND datetime('2025-07-12 18:30:00'); "; using var cmdSelect = new SQLiteCommand(sqlSelect, srcConn); using var reader = cmdSelect.ExecuteReader(); // 3. 插入到新库 const string sqlInsert = "INSERT INTO `_3CH_12`(id, time, father, child, cycle, current_sys, master, data) " + "VALUES(@id, @time, @father, @child, @cycle, @current_sys, @master, @data)"; using var cmdInsert = new SQLiteCommand(sqlInsert, dstConn); cmdInsert.Parameters.Add("@id", DbType.Int64); cmdInsert.Parameters.Add("@time", DbType.String); cmdInsert.Parameters.Add("@father", DbType.String); cmdInsert.Parameters.Add("@child", DbType.String); cmdInsert.Parameters.Add("@cycle", DbType.String); cmdInsert.Parameters.Add("@current_sys", DbType.Int32); cmdInsert.Parameters.Add("@master", DbType.String); cmdInsert.Parameters.Add("@data", DbType.Binary); int count = 0; while (reader.Read()) { cmdInsert.Parameters["@id"].Value = reader["id"]; cmdInsert.Parameters["@time"].Value = reader["time"]; cmdInsert.Parameters["@father"].Value = reader["father"]; cmdInsert.Parameters["@child"].Value = reader["child"]; cmdInsert.Parameters["@cycle"].Value = reader["cycle"]; cmdInsert.Parameters["@current_sys"].Value = reader["current_sys"] == DBNull.Value ? DBNull.Value : reader["current_sys"]; cmdInsert.Parameters["@master"].Value = reader["master"]; cmdInsert.Parameters["@data"].Value = reader["data"]; cmdInsert.ExecuteNonQuery(); count++; } Console.WriteLine($"Finished. 共写入 {count} 条记录到 {OutputDb}"); } } }这是全部代码,怎么修改
最新发布
07-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值