我正在尝试从数据库中获取gridview中的数据,以便在单击时显示在文本框中,并且对于没有空数据的行,它可以正常工作,但是因为我的int列有一些空值,所以我的GetInt32方法继续返回“数据为空。无法在空值上调用此方法或属性。”
有没有一种简单的方法可以修复或解决这个问题?我用其他方法替换GetInt32吗?如果可能的话,我希望在文本框中显示空白/空的数据为null。如果您有任何建议,这是我的代码,谢谢。
public ArrayList GetAllPersonnel(int WorkerID) {
using (var connection = new SqlConnection(connectionString)) {
connection.Open();
String query = "Select * FROM Personnel WHERE WorkerID = " + WorkerID;
using (var command = new SqlCommand(query, connection)) {
var reader = command.ExecuteReader();
var list = new ArrayList();
while (reader.Read()) {
String firstname = reader.GetString(1);
String lastname = reader.GetString(2);
String occupation = reader.GetString(3);
String deployment = reader.GetString(4);
int disasterid = reader.GetInt32(5);
String location = reader.GetString(6);
int deployedhours = reader.GetInt32(7);
int resthours = reader.GetInt32(8);
list.Add(firstname);
list.Add(lastname);
list.Add(occupation);
list.Add(deployment);
list.Add(disasterid);
list.Add(location);
list.Add(deployedhours);
list.Add(resthours);
}
connection.Close();
reader.Close();
return list;
}
}
}
答案 0 :(得分:4)
您应该使用SqlDataReader的IsDBNull方法
int resthours = (!reader.IsDBNull(8) ? reader.GetInt32(8) : 0);
或更直接
list.Add((!reader.IsDBNull(8) ? reader.GetInt32(8).ToString(): string.Empty));
说,我注意到你使用字符串连接来构建sql命令文本来检索记录。请不要这样做。这非常危险,可能导致Sql Injection
String query = "Select * FROM Personnel WHERE WorkerID = @wkID";
using (var command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@wkID", WorkerID);
var reader = command.ExecuteReader();
....
答案 1 :(得分:2)
好的,所以你有效地说你显示的所有内容都应该是string
类型,这很好,我只是提出这一点,因为你声明你甚至想要整数显示为一个空字符串。那么这段代码呢?
String firstname = reader.GetString(1);
String lastname = reader.GetString(2);
String occupation = reader.GetString(3);
String deployment = reader.GetString(4);
String disasterid = reader.IsDBNull(5) ? string.Empty : reader.GetString(5);
String location = reader.GetString(6);
String deployedhours = reader.IsDBNull(7) ? string.Empty : reader.GetString(7);
String resthours = reader.IsDBNull(8) ? string.Empty : reader.GetString(8);
list.Add(firstname);
list.Add(lastname);
list.Add(occupation);
list.Add(deployment);
list.Add(disasterid);
list.Add(location);
list.Add(deployedhours);
list.Add(resthours);
现在,我之所以说你希望将所有内容都用作字符串,是因为int
的默认值是0
,并且不符合空文本框要求。
答案 2 :(得分:1)
您至少有两种方法可以对此进行排序
修改你的sql以选择零或任何你认为合适的空值。这将确保您在整数列中始终具有整数值。它可以通过以下方式完成
从xxx中选择ISNULL(ColumnName,0)作为ColumnName
始终从阅读器获取对象并检查它是否为空。如果为null,则将其替换为合适的值。