2009-04-16 5 views
1

Ich bin auf den Punkt jetzt in meiner Programmierung Entwicklung, die ich versuche, objektorientiertes Design anstelle der grundlegenden hinter dem Knopf verfahren Sachen, die ich gemacht habe, zu nutzen.Wie verwalten Sie Datenbankverbindungen und Transaktionen über Einfügungen auf objektorientierte Weise, mit VB.net oder C#?

In einem aktuellen Projekt wiederholte Ich nehme, Kopieren und Einfügen von SQL Server-Code einfügen und es Klassen mit Eigenschaften, Methoden usw. Migration ...

Eine Frage, die ich bei stecken zu bleiben habe, ist, wie man Halten Sie die Verbindungen zur Datenbank niedrig, während Sie Einfügungen über mehrere Objekte und somit mehrere Tabellen durchführen.

In einer prozeduralen Weise habe ich eine ADO.net-Transaktion verwendet, um in eine Tabelle zu schreiben und dann basierend auf der ID des eingefügten Datensatzes zusätzliche Informationen in eine andere Tabelle zu schreiben - ohne die Verbindung zu schließen, bis der zweite Job abgeschlossen ist . Ich benutze die Transaktion so, wenn die spätere Einfügung fehlschlägt, kann die erste Einfügung rückgängig gemacht werden, und mit try, catch, schließlich, um die Verbindung zu schließen, ob es erfolgreich ist oder fehlschlägt.

Wie gehst du damit in der objektorientierten Welt um?

EDIT: Danke an alle Antworten. Ich verstehe es. Hier ist eine weitere Frage, die auch dazu beigetragen hat, es für mich zu klären: ASP.NET/ADO.NET: Handling many database connections inside a .NET Object?

Antwort

1

Hmm, nicht viel anders.

Ihre "Objekte" (ich nehme an, Sie meinen, dass Sie Klassen verwenden und Instanzen dieser Klassen "Elemente" in Ihrer Geschäftsdomäne darstellen), sollten sich nicht um diese Transaktionen kümmern. Das heißt, sie sollten nichts über Transaktionen wissen, und sie sollten nicht für die Abwicklung von Transaktionen verantwortlich sein.

Transaktionen sollten von einem anderen Objekt initiiert und bearbeitet werden. Eine Art "Manager". Diese Klasse startet Transaktionen, schreibt sie fest und führt sie zurück.
Sie werden diesen Manager in Ihrer Anwendung zum Beispiel in Ihrem Formular verwenden.
Für mich ist dies die einzig richtige Art Transaktionen zu verarbeiten, da Ihre Anwendung den 'Kontext' kennt. Ihre Anwendung weiß, wie viele Roundtrips Sie mit der DB machen müssen, die Anwendung weiß, wie lange die Transaktion dauern sollte. Deine Objekte wissen das nicht.

+0

Ihre Annahme ist korrekt ... Klassen und Instanzen von Klassen, die Elemente in der Geschäftsdomäne darstellen) ... Wie sieht die "Manager" -Klasse aus? – codethrift

+0

Und ... wenn ich keine SQL-Transaktionen verwende, nehme ich an, dass die Manager-Klasse den neu erstellten 1st-Level-Eintrag löschen muss, wenn der 2nd-Level-Insert fehlschlägt? – codethrift

+0

Hmm, ich glaube nicht, dass ich so weit gehen würde ... Das ist die Verantwortung des Programmierers/Benutzers imho. In meiner Situation ist mein 'Manager' nur ein Wrapper um ein NHibernate-ISession-Objekt, das Methoden StartTransaction/Commit, etc .. hat. –

0

Soweit Verbindungen verwalten, nicht. .Net wird einen Pool für Sie bereithalten und diese effizient recyceln. Der Versuch, sie selbst zu recyceln, wird die Leistung beeinträchtigen.

Abgesehen davon, es klingt, als ob Sie es richtig machen, einfügen, ID bekommen, wieder einfügen mit der gleichen Verbindung in diesem Bereich.

+0

Dies ist ein bisschen eine kurzsichtige Sichtweise. Wenn Sie das Verbindungspooling deaktivieren, können Sie Ihre Verbindungen effizienter und zuverlässiger verwalten. Dadurch wird lediglich der Aufwand in Ihrem Code (auf einer bestimmten Ebene) erhöht, um dafür Sorge zu tragen. –

Verwandte Themen