我正在尝试获取一些SQL中C#应用程序中null的日期时间值,但出现一些错误。错误之一是:
“无法将类型为“ System.DBNull”的对象转换为类型为“ System.String”
请,有人可以告诉我如何从SQL向我的C#应用程序设置空的DateTime值吗?
我已经尝试过将C#变量强制转换为datetime值和字符串,但是两者都不起作用。我已经在stackoverflow中进行搜索,但是没有找到适合我的解决方案。 我还尝试了另一种解决方案,但随后我检索了日期:“ 01/01/0001”作为值而不是“空”
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是日期值。
因此,我想在运行查询时显示日期为null的所有内容,这是针对酒店系统的,我想显示尚未签入或签出的预订。
答案 0 :(得分:2)
一种方法是将DateTime变量声明为Nullable类型,这是通过使用?完成的。在这样的结尾处签名。
private DateTime? incheck_datum;
private DateTime? uitcheck_datum;
但这可能是查找,捕获和处理DB Null,然后设置默认值或最小值的更好的方法
if (IsDBNullreader.IsDBNull(indexOfUitCheckDatum))
uitcheckdatum = DateTime.Minvalue;
else
uitcheckdatum = reader["uitcheckdatum"];
答案 1 :(得分:0)
我会避免在没有任何事先检查的情况下直接初始化对象。
如果要将数据库中的DBNull
值视为空DateTime
,除了使用可空版本Kamer
在DateTime?
类中声明两个字段外,没有其他选择。相反,由于单独的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?
,则只需将null
中的set
替换为您选择的 dummy 日期即可,例如DateTime.Now
。
此外,请确保从数据库接收的字符串是可转换的字符串,否则Convert
将引发异常。也许您想添加一个try-catch
来处理它。