如何从SQL中的整数列中读取空值



我正在尝试为我的学校做一个项目。我正在尝试读取一个表格中的一些空值的表。我已经使它成为整数,但我无法将无效的值纳入整数。

我已经在Stackoverflow中搜索过,但是我在项目中无法做出的答案。有人可以为我提供一些帮助,告诉我我必须将代码重新工作的地方。我刚刚开始担任程序员。

这是我的数据库conn字符串 读取器:

        public static List<Klant> GetAlleklanten()
        {
            var result = new List<Klant>();
            using (var conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                const string query = "select k.klantid, k.naam, k.adres, k.telefoonnummer, k.woonplaats, k.email, k.wachtwoord, kp.klantpasid from klant k left join klantpas kp on k.klantid = kp.klantid";
                SqlCommand selectKamers = new SqlCommand(query, conn);
                SqlDataReader reader = selectKamers.ExecuteReader();
                while (reader.Read())
                {
                    Klant klant = new Klant((int)reader["klantid"], (string)reader["naam"], (string)reader["adres"], (string)reader["telefoonnummer"], (string)reader["woonplaats"], (string)reader["email"], (string)reader["wachtwoord"], (int)reader["klantpasid"]);
                    result.Add(klant);
                }
                reader.Close();
            }
            return result;
        }

klantpasid是一个也可以返回空值而不是整数。这是klantpasid在约束中的类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FontysHotel
{
    public class Klant
    {
            // instantie variabelen
            private int klantid;
            private string naam;
            private string adres;
            private string telefoonnummer;
            private string woonplaats;
            private string email;
            private string wachtwoord;
            private int? klantpasid;
            // properties
            public int Klantid
            {
                get
                {
                    return klantid;
                }
                set
                {
                    klantid = value;
                }
            }
            public string Naam
            {
                get
                {
                    return naam;
                }
                set
                {
                    naam = value;
                }
            }
            public string Adres
            {
                get
                {
                    return adres;
                }
                set
                {
                    adres = value;
                }
            }
            public string Telefoonnummer
            {
                get
                {
                return telefoonnummer;
                }
                set
                {
                telefoonnummer = value;
                }
            }
            public string Woonplaats
            {
                get
                {
                    return woonplaats;
                }
                set
                {
                    woonplaats = value;
                }
            }
            public string Email
             {
                get
                {
                    return email;
                }
                set
                {
                    email = value;
                }
            }
            public string Wachtwoord
            {
                get
                {
                    return wachtwoord;
                }
                set
                {
                    wachtwoord = value;
                }
            }
            public int? Klantpasid
            {
                get
                {
                    return klantpasid;
                }
                set
                {
                    klantpasid = value;
                }
            }
            // Constructor
            public Klant(int klantid, string naam, string adres, string telefoonnummer, string woonplaats, string email, string wachtwoord, int klantpasid)
            {
                Klantid = klantid;
                Naam = naam;
                Adres = adres;
                Telefoonnummer = telefoonnummer;
                Woonplaats = woonplaats;
                Email = email;
                Wachtwoord = wachtwoord;
                Klantpasid = klantpasid;
            }
     }
}

请给我一些帮助,告诉我我必须在哪里放置正确的代码,以便我继续我的学校项目。我现在遇到的错误是''指定的转换无效'''

您可以检查 klantid是否 DBNull.Value,如果是,请分配相应的特殊int值;所以而不是

(int)reader["klantid"]

put

reader.IsDBNull(reader.GetOrdinal("klantid")) ? -1 : Conver.ToInt32(reader["klantid"])

更好的方法是将private int klantid;声明为private int? klantid;(nullable int(:

private int? klantid; // it can accept null now
public int? Klantid
{
    get
    {
        return klantid;
    }
    set
    {
        klantid = value;
    }
}

然后在reader阅读时,我们可以使用转盘运算符:

KlantId = !reader.IsDBNull(reader.GetOrdinal("klantid")) 
  ? Conver.ToInt32(reader["klantid"])
  : null;

我知道您的修复程序,您从int改变了klantpasid吗?到int如果klantpasid在您的数据库中为null,我们将值设置为0而不是null

            public int Klantpasid
            {
                get
                {
                    return klantpasid;
                }
                set
                {
                if( value == null){
                  klantpasid = 0;
                  }else {
                    klantpasid = value;
                  }
                }
            }

您可以将您的属性声明为nullable

public int? Klantid
{
    get
    {
        return klantid;
    }
    set
    {
        klantid = value;
     }
}

查看有关文档的更多信息。

使用DataReader读取数据时,它将返回DBNull.Value。当您要填充Klant.Klantpasid值(Nullable<int>类型(时,您必须自己将值转换为Nullable<int>。当ADO.NET首次实施时,没有可确定的值,因此他们推出了DBNull。诸如实体框架之类的更现代的方法改为使用无效类型。

您可以编写辅助方法,以帮助将您的读取值转换为无效类型:

static T? AsNullable<T>(object value) where T : struct {
    switch (value) {
        case T converted:
            return converted;
        case DBNull:
            return default(T?);
        default:
            throw new InvalidCastException();
    }
}

所以而不是...

(int)reader["klantpasid"]

...你写:

AsNullable<int>(reader["klantpasid"])

当然,您将构造函数参数的类型从int更改为int?

相关内容

  • 没有找到相关文章

最新更新