我正在开发一个应用程序,可以从数据库中获取电影信息,还可以添加、更新和删除电影.在数据库中,我有三个表(电影、流派和电影流派<-存储电影及其流派).除了一件事之外,一切都很好,那就是一部电影没有任何类型(这应该是可能的).

问题出现在下面的方法中,并引发以下异常:

原因(当然)是存储过程返回null,因为电影没有任何类型,但我不知道如何防止抛出此异常.正如我所说,应该可以在不存储任何类型信息的情况下存储电影.

提前谢谢!

The method:

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();
        }
    }
}

The sproc:

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值转换为int,因此在创建MovieGene实例之前,您需要使用SqlDataReader.IsDBNull方法判断可为null的字段:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

假设GenreID和MovieGenreID是可为空的int,您可以执行以下操作:

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

Sql相关问答推荐

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

如何在一个范围内进行分组.""范围值在范围表中定义

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

NULL-生成的列中连接的字符串的输入

在SQL Server中设置关联对象的有效JSON格式

Redshift PL/pgSQL循环中的参数化列名

如何使子查询在UPDATE语句期间获得最新更新

违反了完整性约束-值存在时找不到父键

显示十进制列,但尽可能显示为整数

配置单元查询失败:无法识别';附近的输入;LEFT'';(select子句中的';';col'

显示所有组并计算给定组中的项目(包括 0 个结果)

从选定记录中提取摘要作为值的划分

从另一个没有公共键的表中获取值来加入

递归 CTE 附加为行

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

如何在TSQL中编写此窗口查询

IN子句使用的表值用户定义函数参数

HIVE SQL where 子句未按预期工作

基于源表的 SQL INSERT、UPDATE 和 DELETE

有条件求和