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