verwendetes Datenbanksystem: MS SQL 2008
Hallo,
ich habe das Internet abgesucht, doch finde ich kein gutes Tutorial noch eine gute query wie so eine Transaktions query aufgebaut ist.
(zum beispiel habe ich diese Links:
SqlTransaction Class,
BEGIN TRANSACTION (Transact-SQL) )
So doch leider weiß ich nicht wie ich sowas erstellen kann.
Ich möchte das er erst ein INSERT INTO vollstädigt durch testet und wenn dieser query in ordnung ist soll er auf eine tabelle ein DELETE anwenden und die Datensätze aus dem INSERT INTO Query hinzufügen, ich hoffe ihr könnt mir hlfen, bin hier am verzweifeln.
Lg
Was verstehst du unter "vollständig durch testen"?
Und was ist eig das Problem? Ein Beispiel zu finden?
SqlConnection.BeginTransaction Method Hier ist zb eins dabei.
Das ist bei google der 2. oder 3. Treffer.
Hallo,
wenn du "nur testen" möchtest, kannst du Transaction starten, die Query einfach absetzen und anschließend ein Transaction.Rollback() ausführen. Wenn die Query auf einen Fehler läuft, wirst du eine Exception erhalten; hier kannst du den fehlerhaften Insert loggen oderwas auch immer, danach machst du zur Sicherheit auch ein Rollback.
Ich frage mich aber wozu soll das gut sein?
Grüße
**:::
Hallo vbprogger,
dasheißt ich kann ein Command schreiben:
Beispiel:
"Insert into tabelle value 'hans'";
und im anschluss ein Rollback und wenn dieser query falsch ist kommt ein fehler?
Wozu das gut ist:
Da ich eine Tabelle komplett lösche und dann erst Insert mache und wenn dann beim Inser-Query ein fehler kommt bleibt die tabelle leer und das will ich vermeiden, sodass wenn der insert - query falsch ist ich noch die alten datensätze habe.
falsch ist relativ. Denn es wird nur Exception geworfen, wenn syntaxtisch was faul ist; bei logischen Fehler nicht 😉. Warum probierst du nicht einfach aus? Du hast hoffentlich eine Test-/Entwicklungsumgebung geschaffen, oder nicht?
Grüße
**:::
Also dein Vorhaben ergibt zwar keinen Sinn, aber so gehts:
Transaktion öffnen.
Ersten Insert absetzen.
Delete absetzen.
Zweiten Insert absetzen.
Transaktion committen.
Wenn der Commit durch geht kannst du dir sicher sein dass die 3 Querys erfolgreich waren.
Wenn beim Commit eine Exception fliegt -> Rollback.
Was vbprogger vorschlägt klappt leider nicht da man sich zwischen dem Commit und dem Rollback entscheiden muss.
Der SQL Server arbeitet nach dem ACID-Prinzip, d.h. entweder ganz oder gar nicht. So wie du dir das vorstellst ist es nicht möglich da zwischen dem "Testen" und dem "Ausführen" eine unbekannte Zeitspanne liegt in der alles mögliche passieren kann.
Edit: Wie stellst du dir das überhaupt vor? Tabelle löschen und dann in diese Tabelle was einfügen? Hä?
Was vbprogger vorschlägt klappt leider nicht da man sich zwischen dem Commit und dem Rollback entscheiden muss.
Warum nicht? Er muss anschließend nur eine neue Transaction starten, aber das muss ich ihn/dir nicht sagen, oder? 😉
**:::
Ja das ist klar. 🙂
Es ist aber nicht sicher, dass die zweite Transaktion klappt, auch wenn die erste erfolgreich war.
Hallo mabo und vbprogger,
ich werde es probieren, ich habe zu testzwecken eine Tabelle in der Datenbank erstellt.
Jetzt werde ich versuchen eure argumente um zusetzen.
Doch leider weiß ich nicht wie ich so eine Transaktion starte und abschließe 😕 ???
Lg
DANKE
Hi,
daDa ich eine Tabelle komplett lösche und dann erst Insert mache und wenn dann beim Inser-Query ein fehler kommt bleibt die tabelle leer und das will ich vermeiden, sodass wenn der insert - query falsch ist ich noch die alten datensätze habe.
ist ein doch durch genau eine Transaktion ohnehin gewährleistet. Einfach den Delete und den Insert ausführen, wenn es zu keinem Fehler kam COMMIT, sonst ROLLBACK.
Das sollte doch genau das sein, was Du willst.
Gruß
f_igy
Doch leider weiß ich nicht wie ich so eine Transaktion starte und abschließe 😕 ???
Dann schau in deinen ersten Beitrag, da hast du die benötigten Sachen selbst verlinkt.
Doch leider weiß ich nicht wie ich so eine Transaktion starte und abschließe 😕 ???
Dann schau in deinen ersten Beitrag, da hast du die benötigten Sachen selbst verlinkt.
... oder im 2. Beitrag
**:::
Hallo f_iqy,
Jo versuch es gerade umzusetzen 😃
Hallo mabo,
ich habe jz in mein Server Manager diesen Query eingegeben
USE databaseA;
GO
BEGIN TRANSACTION;
BEGIN TRY
Insert Into Test VALUES ('test','test','1125','test','test');
DELETE FROM Test
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
Insert Into Test VALUES ('test','test','1125','test','test');
GO
Doch irgendwie fügt er eine zeile hinzu dann löscht er alles dann fügt er die letzte zeile hinzu, dann habe ich zu testzwecken die zahl durch buchstaben ersetzt(die spalte soll NUR int annehmen) also die obere, dann fügt er nur noch hinzu...
Ich hoffe ihr könnt mir helfen...
EDIT: ICH HABE ES GELÖST:
USE databaseA;
GO
BEGIN TRANSACTION;
BEGIN TRY
Insert Into Test VALUES ('test','test','Hast','test','test');
DELETE FROM Test
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
Insert Into Test VALUES ('test','test','Hast','test','test');
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
GO
Ich habe den Commit teil in den Try-block getan, ist das so korrekt oder kann da noch was üpassieren?
Und wie kann ich sowas in C# einbauen?
Ja ist klar (vermutlich, wie sieht die Tabellenstruktur aus?):
Das erste Insert löst eine Exception aus, also springt er in den Catch-Block und der Delete wird nicht ausgeführt.
Edit: na geht doch 😉 Wegen dem Commit, wenn der fehlschlägt gehts auch im Catch-Block weiter. Musst du wissen ob das passt.
Hi mabo,
Danke zunächst für die ganze Hilfe 😃
Warum sollte es beim Commit zum fehler kommen, der überprüft das doch nur, hast du einen anderen aufbau stil wo es deutlicher und nich so verschachtelt ist?
Lg
Hm,
ich denke eher sowas in der Richtung:
USE databaseA;
GO
BEGIN TRANSACTION;
BEGIN TRY
DELETE FROM Test
Insert Into Test VALUES ('test','test','Hast','test','test');
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
Gruß
f_igy
Und wie kann ich sowas in C# einbauen?
Wie wärs wenn du dir mal den Link anschaust den ich dir im zweiten Beitrag gegeben habe?
Zum Rest ... wäre wohl ganz hilfreich wenn du dir mal anschaust wie Transaktionen funktionieren. Ich hab das Gefühl da gibts noch ein paar Unklarheiten. Das Ganze hier geht schon ziemlich Richtung [Hinweis] Wie poste ich richtig? 1.1 & 1.1.1