DBNull.Value 字段的用法

本文详细介绍了DBNull.Value的概念及其在.NET框架中的应用。DBNull.Value用于表示数据库字段中的NULL值,并解释了如何在代码中正确地使用DBNull.Value来处理空值的情况。

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

DBNull 是一个单独的类,这意味着该类只能存在此实例。它指数据库中数据为空(<NULL>)时,在.net中的值

如果数据库字段的数据缺失,则您可以使用 DBNull.Value 属性将 DBNull 对象值显式分配给该字段。然而,大部分数据提供程序会自动进行分配。

若要计算数据库字段以确定其值是否为 DBNull,则可以将字段值传递给 DBNull.Value.Equals 方法。但此方法不常用,因为有许多其他方式可计算数据库字段是否缺少数据。

例如:

if (! DBNull.Value.Equals(row[fieldName])) 
      return (string) row[fieldName] + " ";
   else
      return String.Empty;

DBNull.value==数据库中的null值...

DBNull.value是对datatable来说的,他就相当于DB中的null,datatable中的null值只有用DBNull.value才能比较,

例如:drow[0]==DBNull.value;

延伸阅读:

一、对表进行插入操作,如datetime和int类型的两个字段,都允许为null,
用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时。datetime类型时,tb12.Text为空,插入成功,不报错,查看该值,却为1900-01-01;int类型时,用同样语句,tb12.Text为空,插入成功,不报错,查看该值,却为0;用“sqlcmd.Parameters.Add(new SqlParameter("@t12",SqlDbType.DateTime));sqlcmd.Parameters["@t12"].Value=tb12.Text;”语句时,tb12.Text为空插入则报错。

sqlcmd.Parameters.Add(new SqlParameter("@t12",SqlDbType.DateTime));
if (tb12.Text.Length>0)
{
sqlcmd.Parameters["@t12"].Value=tb12.Text
}
else
{
sqlcmd.Parameters["@t12"].Value = System.DBNull.Value;
}

二、
以下是我测试的一个例子。
例:表tbl_Student
id    name    address
1      jim      <NULL>
将上述表数据填充到.net 的名为dt的DataTable中。
dt.Rows[0]["address"]不等于null但是等于DBNull.Value.
可见null表示一个对象的指向无效,即该对象为空对象。
DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。

另外注:对上述dt,如果有如下代码:dt.Rows[0][100]。结果如何?
并非想象中的null。而是出现异常:索引超出数组界限。
对于普通的引用类型变量,如果指向对象为null,则会提示:未将对象引用设置到对象实例。但对于使用dt.Rows[i][j]取值,如果第i行存在但i行没有j列,则直接出现异常,不会返回一个指向null的dt.Rows[i][j]。
所以:使用(dt.Rows[0][100]!=null)判断没有意义。为避免0行的100列不存在。可以判断(dt.Rows[0].ItemArray.Length>100).

转载于:https://www.cnblogs.com/wllzbky/p/3385662.html

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、付费专栏及课程。

余额充值