118 votes

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

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

1voto

Daniel Despain Points 11

J'ai également rencontré ce problème et pour moi, une propriété de ma classe était décorée avec [Required] alors que la table contenaient des valeurs nulles dans cette colonne. Cela a du sens. Une fois que j'ai supprimé Required, les données se sont chargées avec succès avec des valeurs nulles.

0voto

Ronika Points 24

BookingQuantity - colonne ayant une valeur nulle dans la base de données. mais la colonne BookingQuantity réelle de la base de données n'est pas nulle. Dans de rares cas, il arrive que cela se produise. Dans ce cas, le code ci-dessous génère la même erreur(Les données sont nulles. Cette méthode ou propriété ne peut pas être appelée sur des valeurs nulles).

totalBookingQuantity += item.InspPoTransactions.Where(x => x.PoId == inspectionPODetail.PoId && x.ProductId == inspectionPODetail.ProductId).Sum(x => Convert.ToInt32(x.BookingQuantity));

0voto

ZBouChacra Points 1

Cette erreur peut se produire en raison du manque de permissions de l'utilisateur sur la base de données. Vérifiez si l'utilisateur possède au moins les autorisations EXECUTE, SELECT ou SHOW DATABASES

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X