【发布时间】:2010-11-15 04:17:29
【问题描述】:
我在我的代码中发现了一个错误,我对它最初是如何发生的感到困惑。
我的问题是,我在数据库 ID 字段中发现了一个跳过(它是一个递增的标识字段),表明没有插入一些记录 - 这意味着我的 SQL 存储过程(可能)抛出了一个错误。从那里往后想,这意味着我的业务对象应该已经捕捉到该错误并抛出它,立即退出并返回到页面的代码隐藏(而是继续到第二个存储过程)。我不明白为什么或如何做到这一点。跳过我的 try 捕获的代码执行是怎么回事?
后面的页面代码:
protected void submitbutton_click(object sender, EventArgs e){
try{
mybusinessobject.savetodatabase()
} catch( Exception ex) {
Response.Redirect("Error.aspx");
}
}
业务对象代码:
public static void savetodatabase(){
int ID1=-1;
int ID2=-1;
//store the billing contact
SqlCommand cmd1 = new SqlCommand("SaveInfo1", con);
cmd1.CommandType = CommandType.StoredProcedure;
//...
cmd1.Parameters.Add("@Ret", SqlDbType.Int);
cmd1.Parameters["@Ret"].Direction = ParameterDirection.ReturnValue;
try
{
con.Open();
cmd1 .ExecuteNonQuery();
ID1 = Convert.ToInt32(cmd1.Parameters["@Ret"].Value);
}
catch (Exception ex) { throw ex; }
finally { con.Close(); }
if (ID1 > 0)
{
SqlCommand cmd = new SqlCommand("SaveInfo2", con);
cmd.CommandType = CommandType.StoredProcedure;
//...
try
{
con.Open();
cmd.ExecuteNonQuery();
ID2= Convert.ToInt32(cmd.Parameters["@Ret"].Value);
}
catch (Exception ex) { throw ex; }
finally { con.Close(); }
}
}
SQL 代码:
PROCEDURE [dbo].[SaveInfo1]
(
-- ... parameters ...
)
AS
INSERT INTO Table1 ( ... ) Values ( ... )
RETURN SCOPE_IDENTITY
PROCEDURE [dbo].[SaveInfo2]
(
-- ... parameters ...
)
AS
DECLARE @SpecialID INT
INSERT INTO Table2 ( ... ) Values ( ... )
SET @SpecialID = SCOPE_IDENTITY()
INSERT INTO Table3 ( [ID], ... ) Values ( @SpecialID, ... )
RETURN SCOPE_IDENTITY()
【问题讨论】:
-
我不使用 asp.net,所以我可能会错过这里的船。它不会引起您所询问的问题,但是否存在围绕两个存储过程调用的事务?
-
不,这是问题的一部分。但这仍然不能解释为什么它跳过了我的尝试捕获。
-
看我的回答。我确定我是对的。在找到解决方案之前,我一直在绞尽脑汁试图解决同一个问题几周
标签: asp.net sql exception exception-handling