当前位置: 首页 > 面试题库 >

数据为空。不能在Null值上调用此方法或属性

松旭
2023-03-14
问题内容

我正在开发一种应用程序,可以从数据库中获取电影信息以及添加,更新和删除电影。在数据库中,我有三个表(电影,流派和电影流派<-存储电影及其流派/秒)。除了一件事,一切都可以正常工作,那就是电影没有任何类型的流派(应该有可能)。

在下面的方法中,会发生问题,并引发以下异常: 数据为Null。 不能在Null值上调用此方法或属性。

原因(当然)是因为电影没有任何体裁,所以sproc返回null,但是我只是不知道如何防止抛出此异常。就像我说的那样,应该可以在不存储任何流派信息的情况下存储电影。

提前致谢!

方法:

public List<MovieGenre> GetMovieGenrebyMovieID(int movieID) {

    using (SqlConnection conn = CreateConnection()) {
        try {

            SqlCommand cmd = new SqlCommand("dbo.usp_GetMovieGenreByMovieID", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@MovieID", movieID);

            List<MovieGenre> movieGenre = new List<MovieGenre>(10);

            conn.Open();

            using (SqlDataReader reader = cmd.ExecuteReader()) {

                int movieGenreIDIndex = reader.GetOrdinal("MovieGenreID");
                int movieIDIndex = reader.GetOrdinal("MovieID");
                int genreIDIndex = reader.GetOrdinal("GenreID");

                while (reader.Read()) {

                    movieGenre.Add(new MovieGenre {
                        MovieID = reader.GetInt32(movieIDIndex),
                        MovieGenreID = reader.GetInt32(movieGenreIDIndex),
                        GenreID = reader.GetInt32(genreIDIndex)
                    });
                }
            }

            movieGenre.TrimExcess();

            return movieGenre;
        }
        catch {
            throw new ApplicationException();
        }
    }
}

程序:

ALTER PROCEDURE usp_GetMovieGenreByMovieID
@MovieID int
AS
BEGIN
    BEGIN TRY
        SELECT m.MovieID, g.GenreID, mg.MovieGenreID, g.Genre
        FROM Movie AS m
        LEFT JOIN MovieGenre AS mg
            ON m.MovieId = mg.MovieID
        LEFT JOIN Genre AS g
            ON mg.GenreID = g.GenreID
        WHERE m.MovieID = @MovieID
    END TRY
    BEGIN CATCH
        RAISERROR ('Error while trying to receive genre(s).',16,1)
    END CATCH
END

问题答案:

您不应该尝试将proc的null值转换为ints-
因此,在创建MovieGenre实例之前,需要使用以下SqlDataReader.IsDBNull方法检查可为空的字段:

http://msdn.microsoft.com/zh-
CN/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

假设GenreID和MovieGenreID是可为null的整数,则可以执行以下操作:

movieGenre.Add(new MovieGenre {
  MovieID = reader.GetInt32(movieIDIndex),
  MovieGenreID = reader.IsDBNull(movieGenreIDIndex) ? null : reader.GetInt32(movieGenreIDIndex),
  GenreID = reader.IsDBNull(genreIDIndex) ? null : reader.GetInt32(genreIDIndex)
});


 类似资料:
  • 问题内容: 嗨,我在表格中将使用空值来填充组合框。我不确定该怎么做。当我运行以下代码时,出现错误: 数据为空。不能在空值上调用此方法或属性。 我需要帮助,并且是MySQL的新手 编码 : 问题答案: 当您的一个或多个字段包含NULL(DBNull.Value)时,您将无法对其使用。 您需要使用IsDBNull方法检查它们是否为空,然后选择要在文本框中输入的值。通常是一个空字符串 我建议也围绕一次性

  • 我对学习java中的方法还不熟悉。在python中,使用“函数”很容易,但我最近了解到java没有类似的功能。我有一个方法,应该返回n1和n2中的最低值。我在公共静态int函数的行中得到一个错误。。。 但语法似乎没有任何问题。

  • 本文向大家介绍js判断输入框不能为空格或null值的实现方法,包括了js判断输入框不能为空格或null值的实现方法的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇js判断输入框不能为空格或null值的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我对FreeMarker很陌生,我正在开发一个使用FreeMarker作为模板引擎的Spring MVC应用程序。 因此,我有以下问题,尝试将空值放入模型,并试图将其评估到我的FreeMarker页面。 因此,我有以下控制器方法: 因此,正如您在前面的代码片段中看到的那样,loginPost()方法将此String@ModelAt0016(重定向)String重定向(这是我的控制器类的@Sessi

  • (免责声明:当人们通过Facebook、Firebase等请求使用异步操作时,会问到数据为空/不正确的问题。我提出这个问题的目的是为每个开始在android中进行异步操作的人提供一个简单的答案) 我试图从我的一个操作中获取数据,当我使用断点或日志调试它时,值就在那里,但当我运行它时,它们总是空的,我如何解决这个问题? 火基 脸谱网 静态编程语言协程 等等。