'无法将对象从DBNull强制转换为其他类型。在存储过程中

问题描述 投票:0回答:1

我有一种方法,试图从数据库表DependencyList中读取一些值。它包含可以为空的列,例如ReleaseIdTaskIdPhaseId。当其中之一为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”,例如在模型内部?

c# sql-server ado.net dbnull
1个回答
0
投票

您可以检查IsDbNull数据是否为空:

if (!dataReader["ReleaseId"].IsDBNull) 
dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);

也可以使ReleaseId属性为空。

public int? ReleaseId { get; set; }

也可以在sql中使用ISNULL方法来检查数据。 ISNULL(ReleaseId,0)


0
投票

if (!dataReader.IsDBNull(dataReader.GetOrdinal("ReleaseId"))) dependency.ReleaseId = Convert.ToInt32(dataReader["ReleaseId"]);

有花招。

© www.soinside.com 2019 - 2024. All rights reserved.