Die Verwendung gespeicherter Prozeduren ist eine Möglichkeit und wird seit vielen Jahren häufig verwendet.
Eine modernere Möglichkeit zur Interaktion mit SQL Server-Datenbanken aus C # (oder einer beliebigen .NET-Sprache) ist die Verwendung von Entity Framework. Der Vorteil von Entity Framework besteht darin, dass es eine höhere Abstraktionsebene bietet.
So zitieren Sie von Microsoft ( https://msdn.microsoft.com/en-us/data/jj590134 ):
Mit dem ADO.NET Entity Framework können Entwickler Datenzugriffsanwendungen erstellen, indem sie anhand eines konzeptionellen Anwendungsmodells programmieren, anstatt direkt anhand eines relationalen Speicherschemas zu programmieren. Ziel ist es, den Code- und Wartungsaufwand für datenorientierte Anwendungen zu verringern. Entity Framework-Anwendungen bieten die folgenden Vorteile:
- Anwendungen können im Hinblick auf ein anwendungsorientierteres konzeptionelles Modell arbeiten, einschließlich Typen mit Vererbung, komplexen Elementen und Beziehungen.
- Anwendungen werden von fest codierten Abhängigkeiten von einem bestimmten Datenmodul oder Speicherschema befreit.
- Zuordnungen zwischen dem konzeptionellen Modell und dem speicherspezifischen Schema können sich ändern, ohne den Anwendungscode zu ändern.
- Entwickler können mit einem konsistenten Anwendungsobjektmodell arbeiten, das verschiedenen Speicherschemata zugeordnet werden kann, die möglicherweise in verschiedenen Datenbankverwaltungssystemen implementiert sind.
- Mehrere konzeptionelle Modelle können einem einzelnen Speicherschema zugeordnet werden.
- Die Unterstützung für sprachintegrierte Abfragen (LINQ) bietet eine Syntaxvalidierung zur Kompilierungszeit für Abfragen anhand eines konzeptionellen Modells.
Die Verwendung eines ORM gegenüber gespeicherten Prozeduren beinhaltet Kompromisse, insbesondere in Bezug auf die Sicherheit und wo sich die Logik befindet.
Der "klassische" Ansatz für die Entwicklung mit SQL Server besteht darin, dass sich die Anwendungslogik in gespeicherten Prozeduren und Programmen befindet, denen nur Sicherheitsrechte zum Ausführen gespeicherter Prozeduren erteilt wurden, und keine Tabellen direkt aktualisiert werden. Das Konzept hier ist, dass gespeicherte Prozeduren die Geschäftslogikschicht für die Anwendung (en) sind. Obwohl die Theorie stichhaltig ist, ist sie aus verschiedenen Gründen in Ungnade gefallen und wurde durch die Implementierung der Geschäftslogik in einer Programmiersprache wie C # oder VB ersetzt. Gute Anwendungen werden immer noch mit einem abgestuften Ansatz implementiert, einschließlich der Trennung von Bedenken usw., folgen jedoch eher einem Muster wie MVC.
Ein Nachteil der Implementierung von Logik im ORM anstelle der Datenbank ist das einfache Debuggen und Testen von Datenintegritätsregeln durch die für die Datenbank Verantwortlichen (DA oder DBA). Nehmen wir das klassische Beispiel für die Überweisung von Geld von Ihrem Scheck auf ein Sparkonto. Es ist wichtig, dass dies als atomare Arbeitseinheit erfolgt, dh als Teil einer Transaktion. Wenn diese Art der Übertragung nur über eine gespeicherte Prozedur erfolgen darf, ist es für den Staatsanwalt und die Prüfer relativ einfach, die gespeicherte Prozedur zu überprüfen.
Wenn dies andererseits über ein ORM wie Entity Framework erfolgt und in der Produktion festgestellt wird, dass in seltenen Fällen Geld aus der Prüfung entnommen, aber nicht in das Debuggen von Einsparungen gesteckt wird, kann dies weitaus komplexer sein, insbesondere wenn möglicherweise mehrere Programme beteiligt sind. Dies wäre höchstwahrscheinlich ein Randfall, der möglicherweise besondere Hardwareprobleme mit sich bringt, die in einer bestimmten Reihenfolge auftreten müssen usw. Wie testet man dies?