코드에서 버그를 발견했으며 처음에는 어떻게 발생했는지에 대해 당황 스러웠습니다.asp.net/sql 서버 무슨 일이 일어나고 있는지 파악해보십시오.
내 질문에, 일부 레코드가 삽입되지 않았 음을 나타내는 데이터베이스 ID 필드 (증가 된 ID 필드)에서 건너 뛰기를 발견했습니다. 즉, SQL SQL sprocs (아마도)가 오류를 던졌습니다. 그곳에서부터 생각해 보면, 내 비즈니스 객체가 오류를 잡아서 던져 버려야하고 즉시 종료되고 페이지의 코드 숨김으로 돌아 가야한다는 것을 의미합니다 (대신 두 번째 저장 프로 시저로 계속 진행됨). 나는 왜 이것이 가능한지 이해하지 못한다. 내 시도를 건너 뛰는 코드 실행과 관련하여 어떤 일이 벌어지고 있습니까? 뒤에
페이지 코드 :
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을 사용하지 않으므로 여기서 보트를 놓칠 수 있습니다. 그것은 당신이 요구하는 문제를 일으키지 않을 것이지만 두 개의 저장 프로 시저 호출에 대한 트랜잭션이 있습니까? –
아니요, 이는 문제의 일부입니다. 그러나 그것은 아직도 내가 시도 잡기를 건너 뛰는 이유를 설명하지 못한다. –
내 대답보기. 나는 내가 옳다고 확신한다. 몇 주 동안 같은 문제를 해결하기 전에 내 뇌를 때리고 있었어요 – abatishchev