我正在开发一个应用程序,它将从存储过程中读取并放入工作表中。我的问题是,当我遇到null时,它不会在代码中被处理。
while (reader.Read())
{
ws.Cells[i, 1] = reader.GetString(0);
ws.Cells[i, 2] = reader.GetString(1);
ws.Cells[i, 3] = reader.GetString(2);
ws.Cells[i, 4] = reader.GetString(3);
ws.Cells[i, 5] = reader.GetString(4);
ws.Cells[i, 6] = reader.GetString(5);
ws.Cells[i, 7] = reader.GetDecimal(6);
ws.Cells[i, 8] = reader.GetDateTime(7);
ws.Cells[i, 9] = reader.GetDecimal(8);
ws.Cells[i, 10] = reader.GetDecimal(9);
ws.Cells[i, 11] = reader.GetDecimal(10);
ws.Cells[i, 12] = reader.GetDecimal(11);
ws.Cells[i, 13] = reader.GetDateTime(12);
ws.Cells[i, 13] = reader.GetDateTime(13);
i++;
}
reader.Close();如果有人能解释如何处理这个问题,这样我们就可以让单元格为空;谢谢!!
发布于 2015-04-22 19:54:05
您可以使用reader.IsDBNull检查值是否为null,并在代码中写入条件逻辑。
if (reader.IsDbBull(12)) {
ws.Cells[i, 13] = "";
} else {
ws.Cells[i, 13] = reader.GetDateTime(12);
}发布于 2015-04-22 19:54:45
在尝试从字段读取值之前,可以使用reader.IsDBNull(int)检查字段是否为空。
例如
ws.Cells[i, 1] = reader.IsDBNull(0) ? "Default value when null" : reader.GetString(0);发布于 2015-04-22 20:01:00
我会创建一个扩展方法来完成这个任务。
类似于:
static class DataReaderExtensions
{
public static DateTime? TryGetDateTime(this DataTableReader reader, int ordinal)
{
return reader.IsDBNull(ordinal) ? null : (DateTime?)reader.GetDateTime(ordinal);
}
}那就这样说吧:
ws.Cells[i, 1] = reader.TryGetDateTime(1);要处理任何数据类型,可以尝试使用泛型:
public static T TryGetValue<T>(this DataTableReader reader, int ordinal)
{
return reader.IsDBNull(ordinal) ? default(T) : reader.GetFieldValue<T>(ordinal);
}那就这样说吧:
ws.Cells[i, 1] = reader.TryGetValue<DateTime?>(1);https://stackoverflow.com/questions/29807490
复制相似问题