Tôi đang làm việc trên một ứng dụng mà người ta có thể lấy thông tin về phim từ cơ sở dữ liệu cũng như thêm, cập nhật và xóa phim. Trong cơ sở dữ liệu tôi có ba bảng (Phim, Thể loại và MovieGenre < - lưu trữ phim và thể loại của chúng). Tất cả mọi thứ hoạt động tốt ngoài một điều, và đó là khi một bộ phim không có bất kỳ thể loại nào (nên có thể).Dữ liệu là Null. Không thể gọi phương thức hoặc thuộc tính này trên các giá trị Null
Sự cố xảy ra theo phương pháp bên dưới và ngoại lệ sau được ném: Dữ liệu là Null. Không thể gọi phương thức hoặc thuộc tính này trên các giá trị Null.
Lý do (tất nhiên) là sproc trả về null vì phim không có bất kỳ thể loại nào, nhưng tôi không thể tìm ra cách ngăn chặn ngoại lệ này. Như tôi đã nói, có thể lưu trữ phim mà không lưu trữ bất kỳ thông tin nào về thể loại/s.
Cảm ơn trước!
Phương pháp:
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();
}
}
}
Các sproc:
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
này: 'catch {ném Appl mới icationException(); } 'là một ý tưởng khá tồi. Bạn đang mất TẤT CẢ thông tin ngữ cảnh. Ít nhất là vượt qua ngoại lệ bị bắt về như là ngoại lệ bên trong: 'catch (Exception ex) {throw new ApplicationException (cũ); } ' –