Halten Sie eine Anwendung, Datenbank-agnostisch (ADO.NET vs Kapselung von DB-Logik)
Machen wir eine ziemlich ernsthafte Anwendung, zu bleiben, Agnostiker zu den DB-client verwenden möchte. Zunächst planen wir auf die Unterstützung von MySQL, Oracle & SQL-Server. Die Tabellen & Ansichten sind einfach wie sind die Abfragen (keine wirkliche Lust SQL), deshalb die Frage:
- Verwenden Sie das native DB-Treiber (MySQLDbConnection etc.) und Kapseln die Logik der Ausführung von Anfragen und Verarbeitung der Ergebnisse oder
- Verwenden eine generische OleDbConnection
Natürlich option 2 beinhaltet keinen overhead, aber ich vorausgesetzt, die Leistung ist nicht so toll wie mit nativen Zugriff?
- Nur einen Punkt zu erwähnen, wenn Sie ADO.NET: Microsoft planen, Ihre veralteten Oracle Data Provider (System.Daten.OracleClient) Siehe hier
- Siehe auch stackoverflow.com/questions/13133804/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehmen wir an, Sie haben einen connection-string definiert in Ihrem
app.config
:Beachten Sie die Anwesenheit der
providerName
Attribut und seinen Wert. Sie könnten auch legen Sie einen Wert für ein anderes DB-provider, z.B.System.Data.SQLite
.(Beachten Sie, dass nicht-standard-Anbieter, d.h. diejenigen, die nicht in der .NET Framework standardmäßig registriert werden müssen ersten, entweder in
app.config
oder in der client-Maschinemachine.config
.)Nun können Sie mit der angegebenen Datenbank in einem komplett-Anbieter-agnostischen-Mode wie folgt:
Beachten Sie, wie dieser code funktioniert nur mit interface-Typen. Der einzige Ort, wo Sie angeben, eine bestimmte DB-provider wird durch die
providerName
Attribut-Wert in derapp.config
- Datei. (Habe ich markiert alle Orte, an denen eine Einstellung ausapp.config
genommen mit^^^
s).Weiter Lesen:
Generische Kodierung mit ADO.NET 2.0 Basisklassen und Fabriken:
ähnlich wie meine Antwort, aber geht mehr ins detail.
ADO.NET Managed Provider und Datasets-Developer Center:
umfasst, unter anderem, ein index zur Verfügung ADO.NET Datenbank-Anbieter.
CommandText
.IDbCommand.CommandText
)? Sollte es@toDateTime
(named-parameter)? Oder beschäftigen Sie eine?
token (Positionsparameter)? Oder eine andere syntax? ADO.NET nicht wirklich anbieten, eine provider-unabhängige Lösung für dieses.IMHO mit einem ORM ist eine gute design-Entscheidung, um eine Datenbank-unabhängige Anwendung. Schalt-Datenbank könnte so einfach sein wie das ändern einer config-Einstellung und die Verbindungszeichenfolge.
Brauchen Sie nicht
OleDbConnection
Zugriff auf unspezifische ADO.NET die Anbieter. Verwenden Sie einfachDbConnection
et. al. SehenDbProviderFactories
auf MSDN für mehr info.Durch Oracle in der Liste, die Sie garantiert haben, dass nichts wird einfach sein.
In anderen Worten, kann die app nicht DB-Agnostiker. Wenn Sie nicht ein ORM, Sie wollen auf jeden Fall bauen Sie eine data-access-Schicht versteckt, dass alle diese Dinge aus dem rest der Anwendung.
Stimme der Erfahrung hier. Just sayin'. Nach einem gemeinsamen schema bei SQL Server und Oracle, haben wir uns bauen mussten, die meisten der Infrastruktur eines ORM, während die Vermeidung der Aspekte, die die Leistung beeinträchtigen kann. Interessant, aber nicht trivial, auf jeden Fall!
LINQ ist ein hoch angesehen .NET ORM, Teils, weil Sie es verwenden können, und gespeicherte Prozeduren. Problem ist, es ist nur SQL-Server aber die Leute arbeiten, um ähnliche Funktionalität bieten für Oracle & MySQL.
Für Datenbank - & query-Optimierungen, ich erschaudern bei der Vorstellung, ein ORM. Datentypen, Funktionen & Allgemeine syntax sind nicht sehr portabel in SQL. Die meisten performant für die Interaktion mit jeder Datenbank, um maßgeschneiderte das model & Abfragen, um jeden, aber es bedeutet know-how, Zeit und Geld. Wenn es sein muss, sich auf ein Datenbank-Anbieter mit der code-setup-support-Anbieter swap-out & hinzufügen von Unterstützung für andere Datenbanken wie nötig.
Es gibt keinen guten Grund, um zu vermeiden, die die meisten generischen Schnittstellen mit der breiteste Unterstützung - OleDb und auch ODBC wenn Sie bequem mit Ihnen. Alles darüber hinaus reduziert sich der pool der Produkte/Sprachen/Plattformen/tools/Entwickler mit dem Sie arbeiten können. Die enge Verbindung zu der SQL-metal, der Verkäufer ist nicht zu vorstellen viel Ineffizienz, sicherlich weniger als die eher esoterischen Möglichkeiten. Sie haben schon eine lange, lange Zeit, auswringen Probleme.
Wenn Sie hinzufügen, wird eine Abstraktionsschicht (Ihre eigenen oder jemand anderes), dann sollte entschieden werden, auf der Grundlage der Verdienste der Abstraktionen eingeführt, in Ihrem bestimmten Kontext, nicht nur eine Abstraktions-Schicht (die nur mehr unterstützen, es sei denn, es ist eine absichtliche nutzen.)
Wie Sie sehen können, jeder der Kilometerstand variiert. 🙂 Aber im Allgemeinen denke ich, dass einfacher besser ist.
Warum nicht verwenden die Microsoft Muster & Practices Enterprise Library Data Access Application Block. Es gibt nur einen minimalen Aufwand und den Anbieter wechseln, ist ein Kinderspiel.
Zitat:
Können Sie immer machen, einen Teil der Datenbank der Anwendung Agnostiker, indem er den Großteil der Anwendung verwenden Sie die DAL eine Reihe von Schnittstellen. Die DAL selbst würde dann eine konkrete Implementierung für die Ziel-Datenbank.
Diese Weise erhalten Sie die Entkopplung in der Nutzung der DAL, aber der nutzen von performance-Verbesserungen oder herstellerspezifische Konstrukte innerhalb des DAL.