如何在SQL中将空值从sql转换为datetime或C#中的字符串?

时间:2019-05-23 08:10:49

标签: c# sql datetime null

我正在尝试获取一些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的所有内容,这是针对酒店系统的,我想显示尚未签入或签出的预订。

2 个答案:

答案 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,除了使用可空版本KamerDateTime?类中声明两个字段外,没有其他选择。相反,由于单独的DateTimestruct,所以不能是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来处理它。