Как я могу преобразовать нулевое значение из sql в datetime или строку в C #? - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь получить некоторые значения datetime, которые являются нулевыми в SQL для моего приложения C #, но я получаю некоторые ошибки.Одна из ошибок:

'Невозможно привести объект типа' System.DBNull 'к типу' System.String '

Пожалуйста, кто-нибудь может сказать мне, какустановить нулевое значение DateTime из SQL для моего приложения на c #?

Я уже пытался привести мои переменные C # к значению datetime и строке, но оба не работают.Я искал в 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 являются значениями даты.

Итак, я хочу, чтобы при запуске запроса отображалось все, где указаны даты с нулем, это для системы отелей, и я хочу показать, какие бронированияеще не зарегистрировался.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Один из способов - объявить переменные DateTime как Nullable-тип, это делается с помощью?знак в конце, такой как этот.

private DateTime? incheck_datum;
private DateTime? uitcheck_datum;

Но это может быть лучшим подходом для поиска, перехвата и обработки пустых значений БД, а затем установки значений по умолчанию или минимальных значений, таких как

if (IsDBNullreader.IsDBNull(indexOfUitCheckDatum))
    uitcheckdatum = DateTime.Minvalue;
else
    uitcheckdatum = reader["uitcheckdatum"];
0 голосов
/ 23 мая 2019

Я бы избегал прямой инициализации объекта без какой-либо предварительной проверки. Если вы хотите обработать значение 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 на фиктивную дату по вашему выбору, например. DateTime.Now.

Кроме того, убедитесь, что строка, которую вы получаете из базы данных, является конвертируемой строкой, или Convert выдаст исключение. Может быть, вы захотите добавить try-catch для обработки.

...