Les données sont Nulles. Cette méthode ou propriété ne peut pas être appelée sur les valeurs Null

Je travaille sur une application où l'on peut obtenir des informations sur des films à partir d'une base de données ainsi que d'ajouter, mettre à jour et supprimer les films. Dans la base de données j'ai trois tables (Film, Genre et MovieGenre <- enregistre les films et leur genre/s). Tout fonctionne bien à part une chose, et c'est quand un film n'a pas obtenu tout genres (ce qui devrait être possible).

Le problème se produit dans la méthode ci-dessous, et à l'exception suivante est générée:
De données est Nulle. Cette méthode ou propriété ne peut pas être appelée sur les valeurs Null.

La raison (bien sûr), c'est que la procédure stockée renvoie null car le film n'a pas obtenu tous les genres, mais je ne peux pas comprendre comment prévenir cette exception levée. Comme je l'ai dit, il devrait être possible de stocker un film sans stocker toutes les informations de genre/s.

Merci d'avance!

La méthode:

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

La procédure stockée:

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
  • Ce: catch { throw new ApplicationException(); } est une assez mauvaise idée. Vous perdez TOUTES les informations de contexte. Au moins passer l'exception interceptée sur l'intérieure d'exception: catch(Exception ex){ throw new ApplicationException(ex); }
InformationsquelleAutor holyredbeard | 2012-03-15