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); }
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas être en train d'essayer de convertir les valeurs null de la proc dans ints - donc, avant de créer le MovieGenre exemple, vous devez vérifier la nullable champs à l'aide de la
SqlDataReader.IsDBNull
méthode:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx
En supposant que le GenreID et MovieGenreID sont nullable ints vous pourriez faire quelque chose comme:
Modifier votre instruction select comme suit pour gérer la valeur null question.
La réponse la plus simple est de remplacer les valeurs null avec des valeurs non nulles. Essayez:
coalesce
ISNULL
ne fonctionne pas pour moi j'utilise MySql