2009-07-17 3 views
1

Die Hintergrundgeschichte ist dies ein Mitarbeiter nicht die Tatsache, dass wir die Standardisierung mochte waren auf Enterprise Library Data Access Blocks weilEnterprise Library Data Access Blocks Entwurfsentscheidungen

  • Es zu viele Verweise in jedem Projekt benötigt, die erforderlich Zugriff auf die Datenbank
  • Wir können nicht alle Funktionen brauchte vorgesehen
  • Er dachte, die DbCommand/SqlCommand intern in der Datenbankobjekte gespeichert werden sollen, statt mit einer sqlcommand lassen Datenbank aufzubauen und dass der Benutzer seinen Zustand verwalten extern
  • Er mochte es nicht, dass Sie den Typ beim Hinzufügen eines Parameters angeben mussten, er dachte, die Überladungen sollten den Typ für Sie ableiten. * Haben Sie nicht wie die Enterprise Library für alle Datenbanken generic war, als unser System deutlich wurde immer nur SQL Server kompatibel sowieso

Ich wollte persönlich halten mit Enterprise Library statt seiner Heimat gewachsene Lösung sein würde, aber es hat mich dazu gebracht, einige Fragen zu stellen.

Warum bieten Enterprise Library oder andere Datenbankabstraktionslayer keine AddParameter-Überladungen für Basistypen?

Beispiel

db.AddInParameter(dbCommand, 
    "EmployeeID", DbType.Int32, 1); 

Was den Grund sein würde, oder nur einige der Gründe, warum sie nicht nur nur Überlastungen für alle Datentypen wie int, anstelle ein Objekt zu nehmen und zwingt den Benutzer zu Geben Sie den Typ an.

db.AddInParameter(dbCommand, "EmployeeID", 1); 

Einige Gründe, die wir sind denken können ...

Wenn Sie jede einzelne Typzuordnung als Überlast geben die folgende Situation passieren kann, nicht.

Lässt Sie sagen eine Überlastung für int haben, aber nicht

char c = 'R' 

db.AddInParameter(dbCommand, "Initial", c); 

Der Compiler char wird die Überlastung beheben statt char in int und einen Fehler aus, weil die gespeicherte Prozedur den Typ expeected char zu sein.

Eine weitere Implikation ist, dass wenn ich die Datenbank-Klasse verspotten möchte, habe ich jetzt eine massive Schnittstelle von Überladungen, die ich implementieren muss statt nur einer.

Meine andere große Frage war ..

Warum Data Access Block benötigen Sie den Befehl Objekt abzurufen, ist es dann in der für nachfolgende Aufrufe passieren zurück, anstatt nur intern seinen Zustand verwalten?

using (var cmd = db.GetStoredProcCommand("AddEmployee")) 
{ 
     db.AddInParameter(cmd, "@Name", DbType.String, name); 

statt

using(var db = new Database()) 
{ 

     db.CreateStoredProcCommand("AddEmployee") 

     db.AddInParameter("@Name", DbType.String, name); 

Ich bin daran interessiert zu sehen, was euch denken.

Dank

Antwort

4

Erste Frage:

Dies ist nur eine Vermutung, aber ich vermute, dass es ist, weil ADO.NET nicht diese Funktionalität bietet.

Zweite Frage:

DbCommands ist Datenbank-Provider-spezifische, so müssen Sie irgendwo eine Factory-Methode, sie instanziieren.

Zum Speichern des Befehls und seiner Parameter im Database-Objekt sind Datenbankobjekte so entworfen, dass sie keinen befehlsspezifischen Status enthalten. Dadurch können sie wiederverwendet werden. Ein gängiges Muster besteht darin, ein Datenbankobjekt beim Start der Anwendung einmalig zu instanziieren und seine Methoden GetXXXCommand() während der Laufzeit der Anwendung wie erforderlich aufzurufen. Multithread-Anwendungen (z. B. Websites) können DbCommands auch dann sicher aus einem einzelnen Datenbankobjekt instanziieren, wenn viele gleichzeitige Anforderungen erfüllt werden.

Wenn das Datenbankobjekt einen impliziten DbCommand speicherte, wäre eine gemeinsame Thread-Freigabe von Datenbankinstanzen nicht mehr möglich.

Schließlich, auch in Singlethread-Anwendungen, ist es durchaus möglich, mehrere DbCommands zu erstellen, oder keine Eins-zu-eins-Zuordnung zwischen Aufrufen von GetXXXCommand() und Aufrufen von ExecuteXXX(). Sie könnten sie beispielsweise mehrmals mit verschiedenen Parametern ausführen.

0

Notiz, die Enterprise Library Data Access Blocks keine neue Datenzugriffs Rahmen ist, dann ist es ein Wrapper für normale ADO.NET, die automatisch für Sie in großen Enterprise-Anwendungen benötigt viele Sachen tut. Es speichert nur einige Zeilen Code. Die Technik dahinter ist immer noch einfach ADO.NET. Also bitte können Sie bitte weitere Informationen zu Ihrem Problem geben? Soweit ich sehen kann, mag man einfach nicht die API-Syntax von Enterprise Library Data Access Blocks.

Verwandte Themen