Ich habe einen Fehler in meinem Code festgestellt und ich bin nicht sicher, wie er überhaupt aufgetreten sein könnte.asp.net/sql Server versuchen zu fangen, was vor sich geht?
Meine Frage ist, habe ich einen Übersprung in den Datenbank-ID-Feldern gefunden (es ist ein inkrementiertes Identitätsfeld), anzeigend einige Datensätze wurden nicht eingefügt - was bedeutet, dass mein SQL-Sprocs (wahrscheinlich) einen Fehler warf. Wenn Sie von dort rückwärts denken, bedeutet dies, dass mein Geschäftsobjekt diesen Fehler erfasst und ausgelöst, sofort beendet und zum Codebehind der Seite zurückgekehrt sein sollte (statt dessen ging es direkt weiter zur zweiten gespeicherten Prozedur). Ich verstehe nicht warum oder wie das möglich ist. Was passiert in Bezug auf die Codeausführung, indem ich meine Versuche vergesse?
Suchrufcode hinter:
protected void submitbutton_click(object sender, EventArgs e){
try{
mybusinessobject.savetodatabase()
} catch(Exception ex) {
Response.Redirect("Error.aspx");
}
}
Business-Objektcode:
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-Code:
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()
Ich benutze nicht asp.net, also könnte ich hier das Boot vermissen. Es würde nicht das Problem verursachen, nach dem Sie fragen, aber gibt es eine Transaktion um die zwei Aufrufe der gespeicherten Prozedur? –
Nein, das war Teil des Problems. Aber das erklärt immer noch nicht, warum es meine Versuchsfänge übersprungen hat. –
Siehe meine Antwort. Ich bin mir sicher, dass ich recht habe. Ich habe mir den Kopf zerbrochen und versucht, das gleiche Problem für ein paar Wochen zu lösen, bevor ich die Lösung gefunden habe. – abatishchev