MSSQL und C#
-
Wenn ihr heute und jetzt aus einer Datenbank performant lesen wollt (und natürlich auch dorthin schreiben wollt), wie würdet ihr das basierend auf C# und MSSQL umsetzen?
Simple Connection und senden von handgemalten SQL-Statements?
Verwenden der ADO.NET DataBlubb-Klassen?
Verwenden des Entity Frameworks mit LINQ?Was ist State-of-the-Art bzw. auch perfromant. Ich hab Angst, dass mir das allles ziemlich die Performance killt. Da der Server nicht allzu viel Perofrmance haben wird bin ich etwas ängstlich.
Noch eine zusätzliche Frage: Wie gut sind diese DataBlubb-Klassen eigentlich für disconnected-Verwendung? Kann ich da wirklich den User offline arbeiten lassen und dann nach einigen Tagen mit zwischenzeitlicher Programmbeendigung (=Serialisation auf die lokale Festplatte) dann mit dem Internet syncen lassen? Oder ist das alles nur rein theoretisch möglich und ich muss mir da ohnehin selber was basteln?
MfG SideWinder
-
Ich habe mir eine mysql.dll aus dem net geladen und mir eine Connection class gebaut.
-
Performant ist SqlConnection + SqlCommand + SqlDataReader bzw. ExecuteNonQuery für INSERT/UPDATE/DELETE.
Und alles was ausreichend komplex ist, um den Query-Optimizer/Compiler mehr als nur unwesentlich zu beschäftigen, idealerweise in eine Stored-Procedure.
Auf jeden Fall die Parameter des SqlCommand Objekts verwenden, und NICHT die Werte direkt mit in den Command-String mit reinpacken.Das wichtigste ist aber, dass du performantes SQL schreibst und passende Indexe verwendest.
@PREIST: MySQL != MSSQL
-
Danke für diese Erstinformationen. Du hältst also performancemäßig auch nichts von diesen DataTable-Dingen, etc.
MfG SideWinder
-
Ich würde die Performance nicht immer über alles andere stellen. Kommt natürlich auf die Anwendung an. Hier ein Hinweis welche Einschnitte man für's Entity Framework und Linq hinnehmen muss.
-
SideWinder schrieb:
Noch eine zusätzliche Frage: Wie gut sind diese DataBlubb-Klassen eigentlich für disconnected-Verwendung? Kann ich da wirklich den User offline arbeiten lassen und dann nach einigen Tagen mit zwischenzeitlicher Programmbeendigung (=Serialisation auf die lokale Festplatte) dann mit dem Internet syncen lassen?
Ich hatte mal einen Kunden dessen Mitarbeiter mit Laptops Firmen aufgesucht haben und erst nach mehreren Tagen wieder Gelegenheit hatten isch mit der Datenbank zu synchronisieren. Ich habe das so gelöst dass der Benutzer das Dataset auf die Platte serialisiert speichern konnte und dann zu einem späteren Zeitpunkt die Daten wieder einladen und weiterarbeiten konnte. Lief perfekt. Du mußt dir halt Gedanken um die Mehrbenutzersynchronisierung machen du kannst ja nicht solange Sperren halten. Auch wird der Benutzer nicht akzeptieren wenn er die Daten durch das optimistische Sperrkonzept nicht wieder rein kriegt.
SideWinder schrieb:
Verwenden des Entity Frameworks mit LINQ?
Falls du Abfragen durch E-Sql oder Linq2Entities nicht performant genug hinbekommst kannst du alternativ im Modell virtuelle Tabellen anlegen deren SQL-Abfrage mit DefiningQueries definiert wurde. Dann nimmt er genau Dein hochoptimiertes SQL-Konstrukt.
Entities sind WCF- und .Net-serialisierbar. Wenn Du Änderungen von "deattached" Entities wieder einspielen willst kannst du diese mit ObjectContext. ApplyPropertyChanges in einen anderen Kontext übertragen.SideWinder schrieb:
Simple Connection und senden von handgemalten SQL-Statements?
Verwenden der ADO.NET DataBlubb-Klassen?Wäre vllt gut wenn du beschreiben würdest was du vorhast.
-
hustbaer schrieb:
...
@PREIST: MySQL != MSSQL
huch hab mich verlesen
-
ich habe eine eigene Klasse dafür.
Wenn ich ein DataTable brauche dann nehme ich das auch.
Die Klasse ist auch hilfreich wenn ich MSSQL und MySQL mische.
Ist ja alles das gleiche bei C#.
Wenn ich jedoch viele Daten abfragen muss dann nehme ich auch schon mal einen DataReader.
Stell Dir vor du musst 2,5 Mill Daten einlesen.
Das dauert. Problem aber dann z.B. bei mir mit Bulkkopie war der Timeout.
-
Kannst ja auch was mitlaufen lassen das dir abprüft ob das ereignis noch aktiv ist und falls ja aber es auf den timeout zu läuft wird der spontan mal erhöht
geht ja glaub im nachhinein noch