【发布时间】:2012-03-31 22:59:51
【问题描述】:
我正在开发一个应用程序,可以从数据库中获取有关电影的信息以及添加、更新和删除电影。在数据库中,我有三个表(电影、流派和电影流派
问题出现在下面的方法中,抛出如下异常: 数据为空。不能对 Null 值调用此方法或属性。
原因(当然)是 sproc 返回 null 因为电影没有任何类型,但我只是不知道如何防止引发此异常。正如我所说,应该可以在不存储任何流派信息的情况下存储电影。
提前致谢!
方法:
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();
}
}
}
存储过程:
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
【问题讨论】:
-
这个:
catch { throw new ApplicationException(); }是一个非常糟糕的主意。您正在丢失所有上下文信息。至少将捕获的异常作为内部异常传递:catch(Exception ex){ throw new ApplicationException(ex); }
标签: c# asp.net sql stored-procedures