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