我有一种方法,试图从数据库表DependencyList
中读取一些值。它包含可以为空的列,例如ReleaseId
,TaskId
和PhaseId
。当其中之一为NULL时,阅读并尝试在视图内部可视化它们时出现问题。
代码如下:
public ActionResult FullIndex(int id)
{
List<Dependency> dependencyList = new List<Dependency>();
string connectionString = Configuration["ConnectionStrings:DefaultConnection"];
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sql = "ReadFullDependencies";
SqlCommand command = new SqlCommand(sql, connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter = new SqlParameter
{
ParameterName = "@DependencyId",
Value = id,
SqlDbType = SqlDbType.VarChar,
Size = 50
};
command.Parameters.Add(parameter);
using (SqlDataReader dataReader = command.ExecuteReader())
{
while (dataReader.Read())
{
Dependency dependency = new Dependency();
dependency.Id = Convert.ToInt32(dataReader["Id"]);
dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);
dependency.ReleaseName = ReadReleaseName(dependency.ReleaseId);
dependency.PhaseId = Convert.ToInt32(dataReader["PhaseId"]);
dependency.PhaseName = ReadPhaseName(dependency.PhaseId);
dependency.TaskId = Convert.ToInt32(dataReader["TaskId"]);
dependency.TaskName = ReadTaskName(dependency.TaskId);
dependencyList.Add(dependency);
}
}
connection.Close();
}
return View(dependencyList);
}
如果它们在数据库中都是not null,那么它可以完美地工作。但是,假设ReleaseId
为NULL。然后,在线:
dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);
我收到此错误:
无法将对象从DBNull强制转换为其他类型。
我已经尝试在模型中每种数据类型的侧面加上问号(?),但这没有解决。
如何防止这种情况的发生并将空值存储为“ None”,例如在模型内部?
您可以检查IsDbNull数据是否为空:
if (!dataReader["ReleaseId"].IsDBNull)
dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);
也可以使ReleaseId属性为空。
public int? ReleaseId { get; set; }
也可以在sql中使用ISNULL方法来检查数据。 ISNULL(ReleaseId,0)
if (!dataReader.IsDBNull(dataReader.GetOrdinal("ReleaseId")))
dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);
有花招。