Я работаю над приложением, в котором можно получать информацию о фильмах из базы данных, а также добавлять, обновлять и удалять фильмы. В базе данных у меня есть три таблицы (Movie, Genre и MovieGenre <- хранит фильмы и их жанры). Все отлично работает, кроме одной вещи, и именно тогда у фильма нет жанров (что должно быть возможно). </p>
Проблема возникает в методе ниже, и выдается следующее исключение:
Данные равны нулю. Этот метод или свойство нельзя вызывать для значений Null.
Причина (конечно) в том, что sproc возвращает ноль, потому что у фильма нет жанров, но я просто не могу понять, как предотвратить это исключение. Как я уже сказал, должна быть возможность хранить фильм без какой-либо информации жанра.
Заранее спасибо!
Метод:
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