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

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

我有一种方法,试图从数据库表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
2个回答
1
投票

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

有花招。


0
投票

您应该选中DBNull,然后相应地分配值,像这样

dependency.ReleaseId = dataReader["ReleaseId"] != System.DBNull.Value ? Convert.ToInt32(dataReader["ReleaseId"]) : 0;
© www.soinside.com 2019 - 2024. All rights reserved.