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