Laden...

Transaktionen Query Beispiele oder Tutorial

Erstellt von Gogeta vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.498 Views
Thema geschlossen
G
Gogeta Themenstarter:in
152 Beiträge seit 2012
vor 10 Jahren
Transaktionen Query Beispiele oder Tutorial

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

L
416 Beiträge seit 2008
vor 10 Jahren

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.

1.696 Beiträge seit 2006
vor 10 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

G
Gogeta Themenstarter:in
152 Beiträge seit 2012
vor 10 Jahren

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.

1.696 Beiträge seit 2006
vor 10 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

M
334 Beiträge seit 2007
vor 10 Jahren

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ä?

1.696 Beiträge seit 2006
vor 10 Jahren

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? 😉

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

M
334 Beiträge seit 2007
vor 10 Jahren

Ja das ist klar. 🙂

Es ist aber nicht sicher, dass die zweite Transaktion klappt, auch wenn die erste erfolgreich war.

G
Gogeta Themenstarter:in
152 Beiträge seit 2012
vor 10 Jahren

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

F
115 Beiträge seit 2012
vor 10 Jahren

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

M
334 Beiträge seit 2007
vor 10 Jahren

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.

1.696 Beiträge seit 2006
vor 10 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

G
Gogeta Themenstarter:in
152 Beiträge seit 2012
vor 10 Jahren

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?

M
334 Beiträge seit 2007
vor 10 Jahren

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.

G
Gogeta Themenstarter:in
152 Beiträge seit 2012
vor 10 Jahren

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

F
115 Beiträge seit 2012
vor 10 Jahren

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

L
416 Beiträge seit 2008
vor 10 Jahren

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

Thema geschlossen