【发布时间】:2011-01-10 18:11:04
【问题描述】:
这是我的sp
CREATE PROCEDURE DeteleTitle
(
@TitleID int
)
AS
BEGIN
IF EXISTS(Select TitleID from Titles WHERE TitleID=@TitleID)
BEGIN
DELETE FROM Titles WHERE TitleID=@TitleID
SELECT @TitleID
END
ELSE
BEGIN
SELECT 0
END
END
我称之为的方法是:-
public Int32 DeleteTitle(Int32 TitleID)
{
try
{
int ds=0;
SqlParameter[] sqlparam=new SqlParameter[1];
sqlparam[0]=(@TitleID,TitleID);
ds=Convert.ToInt32(SqlHelper.ExecuteScalar(ConfigurationManager.ConnectionStrings["con"].ConnectionString,CommandType.StoredProcedure,"DeleteTitle",sqlparam).Tables[0]);
return ds;
}
catch(Exception ex)
{
return 0;
}
}
现在 TitleID 是许多表中的外键。如果某个表的记录正在使用 TitleID,那么它会抛出这个异常,上面写着“Foreign Key Violation n stuff”。在我上面的存储过程中,我在 else 块中选择零,以防删除不成功。当删除成功时,它返回 TitleID 的值,如 50、99 或其他值。现在发生的事情是,当删除不成功时,它不会返回零。我希望根据 Delete Stored 过程返回的零值在屏幕上显示一条消息,但是当它没有返回任何值(删除失败时)时,我在 DeleteTitle() 方法的 catch 块中返回零。
现在我有两个问题:-
- 为什么删除失败时存储过程不返回零?
- 在 catch 块中返回零是否像我在上面所做的那样正确?我不知道您如何检索外键异常号和其他内容,所以我只是在 catch 块中返回零。
【问题讨论】:
-
您至少应该捕获一个 sqlexception(我相信这是正确的,如果不查找的话)。目前,您可能会在此处捕获各种不相关的异常,而只是忽略它们。您应该真正捕获特定异常,以便任何意外的异常都可以冒泡到应用程序级别的错误处理程序以进行适当的处理和记录以及其他任何事情。
标签: c# asp.net sql-server stored-procedures