c# - 如何将空值从 sql 转换为 C# 中的日期时间或字符串?
问题描述
我试图在我的 C# 应用程序中获取一些在 SQL 中为空的日期时间值,但我得到了一些错误。错误之一是:
'无法将'System.DBNull'类型的对象转换为'System.String'类型
拜托,有人能告诉我如何将 SQL 中的空 DateTime 值设置为我的 c# 应用程序吗?
我已经尝试将我的 C# 变量转换为日期时间值和字符串,但两者都不起作用。我在stackoverflow中搜索过,但没有找到适合我的解决方案。我也尝试了另一种解决方案,但后来我检索了日期:'01/01/0001' 作为值而不是 'null'
public static List<Kamer> GetOpenstaandeBoekingen()
{
var result = new List<Kamer>();
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
const string query = "select b.boekingid, k.naam, bk.incheckdatum, bk.uitcheckdatum, b.hotelid, b.aantal_gasten, bk.kamerid from boeking b join klant k on k.klantid = b.boekingid join boekingkamer bk on b.boekingid = bk.boekingid where bk.incheckdatum is null and bk.uitcheckdatum is null";
SqlCommand selectKamers = new SqlCommand(query, conn);
SqlDataReader reader = selectKamers.ExecuteReader();
while (reader.Read())
{
Kamer kamer = new Kamer((int)reader["boekingid"], (string)reader["naam"], (string)reader["incheckdatum"], (string)reader["uitcheckdatum"], (int)reader["hotelid"], (int)reader["aantal_gasten"], (int)reader["kamerid"]);
result.Add(kamer);
}
reader.Close();
}
return result;
}
这是我的构造函数类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FontysHotel
{
public class Kamer
{
// instantie variabelen
private int id;
private string naam;
private DateTime incheck_datum;
private DateTime uitcheck_datum;
private int hotel;
private int aantal_personen;
private int kamernr;
// properties
public int Id
{
get
{
return id;
}
set
{
id = value;
}
}
public string Naam
{
get
{
return naam;
}
set
{
naam = value;
}
}
public string Incheck_datum
{
get
{
return incheck_datum.ToShortDateString();
}
set
{
incheck_datum = Convert.ToDateTime(value);
}
}
public string Uitcheck_datum
{
get
{
return uitcheck_datum.ToShortDateString();
}
set
{
uitcheck_datum = Convert.ToDateTime(value);
}
}
public int Hotel
{
get
{
return hotel;
}
set
{
hotel = value;
}
}
public int Aantal_personen
{
get
{
return aantal_personen;
}
set
{
aantal_personen = value;
}
}
public int Kamernr
{
get
{
return kamernr;
}
set
{
kamernr = value;
}
}
public Kamer(int id, string naam, string incheck_datum, string uitcheck_datum, int hotel, int aantal_personen, int kamernr)
{
Id = id;
Naam = naam;
Incheck_datum = incheck_datum;
Uitcheck_datum = uitcheck_datum;
Hotel = hotel;
Aantal_personen = aantal_personen;
Kamernr = kamernr;
}
}
}
Uitcheckdatum 和 incheckdatum 是日期值。
所以我想,当我运行查询时,它会显示所有日期都在哪里,它是针对酒店系统的,我想显示哪些预订尚未签入或签出。
解决方案
一种方法是将您的 DateTime 变量声明为 Nullable 类型,这是通过使用 ? 像这样在最后签名。
private DateTime? incheck_datum;
private DateTime? uitcheck_datum;
但它可能是一种更好的方法来查找、捕获和处理 DB Null,然后像这样设置默认值或最小值
if (IsDBNullreader.IsDBNull(indexOfUitCheckDatum))
uitcheckdatum = DateTime.Minvalue;
else
uitcheckdatum = reader["uitcheckdatum"];
推荐阅读
- python - 试图理解python中二叉树(递归函数)中存在的节点
- python - 消息:Python Selenium 中的元素不可交互
- c++ - 按第一个值对c ++中的二维数组进行排序
- python - 如何在python中使用带有2个数据框的函数
- html - 验证码解决服务如何将我的验证码加载给他们的工作人员
- react-redux - react-redux 钩子中的顺序调度操作
- flutter - Flutter:如何在 Wrap 小部件中将容器大小设置为 wrap_content
- swiftui - SwiftUI 更改显示在操作表中的状态
- flutter - RenderView 中的 Window 参数所需的值是多少
- reactjs - Reactjs:FirebaseError:消息:我们无法注册默认服务工作者