Je travaille sur une application où l'on peut obtenir des informations sur des films à partir d'une base de données ainsi que ajouter, mettre à jour et supprimer les films. Dans la base de données, j'ai trois tables (Film, Genre et MovieGenre <- stocke les films et leur(s) genre(s)). Tout fonctionne bien sauf une chose, et c'est lorsque un film n'a pas de genres (ce qui devrait être possible).
Le problème se produit dans la méthode ci-dessous, et l'exception suivante est levée: Les données sont nulles. Cette méthode ou propriété ne peut pas être appelée sur des valeurs nulles.
La raison (bien sûr) est que la procédure stockée retourne null car le film n'a pas de genres, mais je n'arrive pas à comprendre comment éviter que cette exception soit levée. Comme je l'ai dit, il devrait être possible de stocker un film sans stocker aucune information sur son/ses genre(s).
La méthode:
public List 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 = new List(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 ('Erreur lors de la tentative de récupération du/des genre(s)',16,1)
END CATCH
END