Hallo,
wir besitzen einen SQL- Server 2012 der auf einem Windows Server 2012 R2 läuft.
Im Unternehmen werden einige Access- Programme für beispielsweise Abwesenheitsliste, Urlaubsprogramm usw. verwendet.
Access dient hier als Front- End.
Via einer eigens entwickelten Verbindungsklasse (ADO) wird die Verbindung zwischen Front- End und Back- End hergestellt.
Stored Procedures dienen dann zur Abhandlung von Datenbankeinträgen, -updates oder -löschungen.
Nun ist es aber so, dass wir bei manchen Aktionen an den Client eine Fehler-/Infomeldung anzeigen lassen wollen.
Verwendet werden soll hier die TSQL- Funktion "THROW".
Fehlermeldungen anzuzeigen ist kein Problem.
Bei Infomeldungen haben wir folgendes überlegt:
if @proctype = 3 -- check how info messages thrown
BEGIN
BEGIN TRANSACTION t1;
BEGIN TRY
-- Step 1
INSERT INTO AccessTests.dbo.excp_test (test_text) VALUES ('t');
-- Step 2
INSERT INTO AccessTests.dbo.excp_test2 (test_text2) VALUES ('test');
COMMIT TRANSACTION t1;
THROW 53000, '200INFO! Daten erfolgreich gespeichert', 1
END TRY
BEGIN CATCH
--PRINT 'Catch block2';
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION t1;
THROW;
END CATCH
END
Sobald die beiden INSERTs ok sind, wird ein COMMIT der Transaktion t1 durchgeführt. Somit ist die Transaktion abgeschlossen.
Über THROW wird nun eine Meldung erzeugt, die an den Client (Access- Programm) zurückgeliefert wird.
Dadurch, dass THROW aber eigentlich verwendet wird, um Fehler zurückzugeben, springt das Skript in den CATCH- Block.
Die Prüfung bezüglich dem @@TRANCOUNT (prüft, Anzahl von BEGIN TRANS...) verhindert, dass ein ROLLBACK der vorher positiv abgewickelten SQL- Queries durchgeführt wird.
Nun könnten wir die Meldung, die vom SQL- Server zurückgeliefert wird in unserer VBA- Verbindungsklasse parsen und prüfen, ob das Muster "200INFO!" darin enthalten ist.
Dadurch können wir den Programmablauf besser steuern --> Recordset = true und nicht false.
Gibt es eine schönere Variante? Wasw meint ihr dazu?
Hab schon einige Einträge im Internet durchsucht, aber nichts besseres gefunden.
Ich bedanke mich schon einmal für eure Antworten.