Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从sql中的整型列读取空值到C#?_C#_Sql_Null - Fatal编程技术网

如何从sql中的整型列读取空值到C#?

如何从sql中的整型列读取空值到C#?,c#,sql,null,C#,Sql,Null,我正在努力为我的学校做一个项目。我试图读取一个整列中有一些空值的表。我已将其设置为整数,但无法将空值转换为整数 我已经在stackoverflow中搜索过了,但是在我的项目中没有一个答案。有人能给我一些帮助,告诉我在哪里我必须把代码,使它再次工作。我刚开始做程序员 这是我的数据库连接字符串+读取器: public static List<Klant> GetAlleklanten() { var result = new Lis

我正在努力为我的学校做一个项目。我试图读取一个整列中有一些空值的表。我已将其设置为整数,但无法将空值转换为整数

我已经在stackoverflow中搜索过了,但是在我的项目中没有一个答案。有人能给我一些帮助,告诉我在哪里我必须把代码,使它再次工作。我刚开始做程序员

这是我的数据库连接字符串+读取器:

        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改成int?整型 如果klantpasid在数据库中为null,我们将该值设置为0而不是null

public int-Klantpasid
{
得到
{
返回klantpasid;
}
设置
{
如果(值==null){
klantpasid=0;
}否则{
klantpasid=值;
}
}
}
我知道一个解决方案, 你把Klantpasid改成int?整型 如果klantpasid在数据库中为null,我们将该值设置为0而不是null

public int-Klantpasid
{
得到
{
返回klantpasid;
}
设置
{
如果(值==null){
klantpasid=0;
}否则{
klantpasid=值;
}
}
}

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

(int)reader["klantid"]

更好的方法是声明
private int-klantid作为
private int?克兰提德(可空
int
):

然后,在从
读取器
读取时,我们可以使用turnary运算符:

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

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

(int)reader["klantid"]

更好的方法是声明
private int-klantid作为
private int?克兰提德(可空
int
):

然后,在从
读取器
读取时,我们可以使用turnary运算符:

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

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

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

查看更多信息。

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

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

查看更多信息。

当您使用
DataReader
读取数据时,它将返回
DBNull.Value
。当您想要填充
Klant.Klantpasid
值(类型为
Nullable
)时,您必须自己将该值转换为
Nullable
。当ADO.NET首次实现时,没有可为null的值,因此它们引入了
DBNull
。更现代的方法(如实体框架)使用可空类型

您可以编写帮助器方法来帮助将读取值转换为可为null的类型:

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();
    }
}
……你写道:

AsNullable<int>(reader["klantpasid"])
AsNullable(读卡器[“klantpasid”])

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

当您使用
DataReader
读取数据时,它将返回
DBNull.Value
。当您想要填充
Klant.Klantpasid
值(类型为
Nullable
)时,您必须自己将该值转换为
Nullable
。当ADO.NET首次实现时,没有可为null的值,因此它们引入了
DBNull
。更现代的方法(如实体框架)使用可空类型

您可以编写帮助器方法来帮助将读取值转换为可为null的类型:

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();
    }
}
……你写道:

AsNullable<int>(reader["klantpasid"])
AsNullable(读卡器[“klantpasid”])

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

reader.IsDBNull(reader.GetOrdinal(“klantid”)-1:Conver.ToInt32(读卡器[“klantid”])
不太清楚您的意思。。。1) Klantid在您的数据库中有空值,这(可能)是错误的吗?如果它是您的主键,我想它应该是唯一的值,空值在这里没有帮助。如果是这样,您需要更正数据库中的数据:为它们赋值。2) 如果您的Klantid可以为NULL是正确的,那么您需要使您的C#代码适应它-使Klantid成为可为NULL的:
public int?Klantid和私有int?克兰提德
reader.IsDBNull(reader.GetOrdinal(“klantid”))-1:Conver.ToInt32(读卡器[“klantid”])
不太清楚您的意思。。。1) Klantid在您的数据库中有空值,这(可能)是错误的吗?如果它是您的主键,我想它应该是唯一的值,空值在这里没有帮助。如果是这样,您需要更正数据库中的数据:为它们赋值。2) 如果您的Klantid可以为NULL是正确的,那么您需要使您的C#代码适应它-使Klantid成为可为NULL的:
public int?Klantid和私有int?克兰提德这不起作用,if语句的结果总是false,因为整数不能为null。这不起作用,if语句的结果总是false,因为整数不能为null