C# Table DBNull.Value

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

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

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

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

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

来看看返回的类型:

 

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

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

 

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

private async void QueryData() { string connectionString = "Server=10.50.32.244;Port=9080;Database=weiwantian_db;Uid=weiwantian;Pwd=weiwantian123...;CharSet=utf8mb4;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { try { await connection.OpenAsync(); DateTime dateStart = dateTimePicker2.Value.Date; DateTime dateEnd = dateTimePicker3.Value.Date.AddDays(1).AddTicks(-1); // 优化的查询语句 - 移除FORCE INDEX但保留其他优化 string query = @" SELECT b.ID_Card_Number, b.`Name`, a.data, a.chuqing, a.qingjia, a.tiaoxiu, a.jiaban, a.lizhi, a.qingjialeixing, a.qita, a.suoding, a.bumen_lock, a.firstshenpi, a.kezhang_shenpi, a.shenpi_time, a.update_user, a.genxinshenpi, a.genxinshijian, b.14ID, b.`Type`, b.Department, b.Section, b.Workshop, b.Large_Group, b.Team FROM ri_gongshi a INNER JOIN zsg_personnel_list b ON a.ID_Card_Number = b.ID_Card_Number WHERE a.data BETWEEN @DateStart AND @DateEnd AND (@Department IS NULL OR b.Department = @Department) AND (@Section IS NULL OR b.Section = @Section) AND (@Workshop IS NULL OR b.Workshop = @Workshop) AND (@LargeGroup IS NULL OR b.Large_Group = @LargeGroup) AND (@Team IS NULL OR b.Team = @Team) AND (@IDCardNumber IS NULL OR b.ID_Card_Number = @IDCardNumber) AND (@Name IS NULL OR b.Name = @Name) ORDER BY a.data DESC"; using (MySqlCommand command = new MySqlCommand(query, connection)) { // 设置所有参数,空值用DBNull.Value表示 command.Parameters.AddWithValue("@DateStart", dateStart); command.Parameters.AddWithValue("@DateEnd", dateEnd); // 处理可空查询参数 command.Parameters.AddWithValue("@Department", string.IsNullOrWhiteSpace(TextBoxBumenR.Text) ? (object)DBNull.Value : TextBoxBumenR.Text.Trim()); command.Parameters.AddWithValue("@Section", string.IsNullOrWhiteSpace(TextBoxKeshiR.Text) ? (object)DBNull.Value : TextBoxKeshiR.Text.Trim()); command.Parameters.AddWithValue("@Workshop", string.IsNullOrWhiteSpace(TextBoxChejianR.Text) ? (object)DBNull.Value : TextBoxChejianR.Text.Trim()); command.Parameters.AddWithValue("@LargeGroup", string.IsNullOrWhiteSpace(TextBoxDazuR.Text) ? (object)DBNull.Value : TextBoxDazuR.Text.Trim()); command.Parameters.AddWithValue("@Team", string.IsNullOrWhiteSpace(TextBoxBanzuR.Text) ? (object)DBNull.Value : TextBoxBanzuR.Text.Trim()); command.Parameters.AddWithValue("@IDCardNumber", string.IsNullOrWhiteSpace(textBoxIDR.Text) ? (object)DBNull.Value : textBoxIDR.Text.Trim()); command.Parameters.AddWithValue("@Name", string.IsNullOrWhiteSpace(textBoxnameR.Text) ? (object)DBNull.Value : textBoxnameR.Text.Trim()); command.CommandTimeout = 120; // 使用异步数据读取 using (MySqlDataReader reader = await command.ExecuteReaderAsync()) { DataTable dataTable = new DataTable(); dataTable.Load(reader); dataGridView2.DataSource = dataTable; // 数据加载完成后应用格式 } } } catch (Exception ex) { MessageBox.Show("数据库查询错误: " + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); System.Diagnostics.Debug.WriteLine($"数据库查询错误: {ex}"); } } }将进度显示到progressBar1
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值