我正在尝试将SQL中的一些日期时间值获取到我的C#应用程序中,但是我遇到了一些错误。其中一个错误是:
">无法将类型为"System.DBNull"的对象转换为类型"System.String">
拜托,有人可以告诉我如何将空日期时间值从SQL设置为我的c#应用程序吗?
我已经尝试将 C# 变量转换为日期时间值和字符串,但两者都不起作用。我已经在堆栈溢出中搜索过,但没有找到适合我的解决方案。 我也尝试了另一种解决方案,但后来我检索了日期:"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;
}
}
}
Uitcheck基准面和Incheck基准面是日期值。
所以我想,当我运行查询时,显示带有 null 的日期的所有内容,它适用于酒店系统,我想显示尚未入住或退房的预订。
一种方法是将 DateTime 变量声明为 Nullable 类型,这是通过在末尾使用 ? 符号完成,例如这样。
private DateTime? incheck_datum;
private DateTime? uitcheck_datum;
但是,查找、捕获和处理 DB Null,然后像这样设置默认值或最小值可能是一种更好的方法
if (IsDBNullreader.IsDBNull(indexOfUitCheckDatum))
uitcheckdatum = DateTime.Minvalue;
else
uitcheckdatum = reader["uitcheckdatum"];
我会避免在没有任何事先检查的情况下直接初始化对象。 如果要将数据库中的DBNull
值视为空值DateTime
,除了使用可为空的版本DateTime?
在Kamer
类中声明两个字段之外,没有其他选择,因为DateTime
本身就是一个struct
,一种值类型,不能null
。有了它,您可以执行以下操作:
set
{
uitcheck_datum = string.IsNullOrEmpty(value) ? null : Convert.ToDateTime(value);
}
在循环中:
while (reader.Read())
{
string incheckdatum = reader["incheckdatum"] as string;
string uitcheckdatum = reader["uitcheckdatum"] as string;
Kamer kamer = new Kamer((int)reader["boekingid"], (string)reader["naam"],
incheckdatum, uitcheckdatum, (int)reader["hotelid"],
(int)reader["aantal_gasten"], (int)reader["kamerid"]);
result.Add(kamer);
}
as
使您免于可能的转换异常。索引器返回object
的实例。如果不能将其转换为string
,则返回null
。
如果您不想将这些字段声明为DateTime?
,则只需将set
中的null
替换为您选择的虚拟日期,例如DateTime.Now
.
此外,请确保从数据库收到的字符串是可转换字符串,否则Convert
将引发异常。也许您想添加一个try-catch
来处理它。