Bewährte Methoden: C # arbeitet mit DB

8

Zunächst einmal bin ich Java-Programmierer und ich bin neu in C # und ich brauche die Meinung von C # -Entwicklern. Ich entwickle eine Anwendung, die eine Verbindung zur Datenbank (Firebird 1.5) herstellt, einige Daten abfragt und zu mir zurückkehrt, also gibt es nichts zu kompliziert, aber leider bin ich in einige Dinge stecken geblieben:

Wie wir wissen, sollte die Datenbankverbindung in einem separaten Thread realisiert werden, da es sich um eine hochgradige Operation handelt und alle Verbindungen im Verbindungspool sein sollten, um die bereits geöffnete Verbindung wiederzuverwenden und stattdessen die neue zu erstellen.

Also hier meine erste Frage - wie man den Verbindungspool richtig organisiert? (Was ist mit Verbindungspool Ich habe gelesen, dass in der Regel Verbindungspool ist bereits von Datenprovidern realisiert und ich kann es einfach in Verbindungsparameter wie "connectionBuilder.Pooling = true;") setzen

Was ist mit Abfragen? Ich meine, dass ich immer eine Query pro Thread verwende (und ich denke, das ist richtig, weil wir auch eine hochgradige Operation durchführen, liege ich falsch? Wie auch immer, ich würde mich freuen, Ihre Best Practices für die Organisation der Datenbankarbeit zu sehen / strong>) und in Java gebe ich nur Abfrageergebnis von einem separaten Thread zurück, indem ich Schnittstellen und anonyme Klassen benutze:

In DBHelper.class (DBHelper ist ein Singleton)

%Vor%

in einer UI-Klasse (z. B. MainWindow )

%Vor%

In C # sollte ich Delegaten verwenden, um zu markieren, welche Methode im Thread ausgeführt wird, aber leider kann ich keinen Callback als Parameter senden - also Wie sollte ich meine Abfrageergebnisse zum Haupt-UI-Thread zurückgeben ?

UPD

Ich habe ein wenig verstanden, wie man mit Delegierten und Ereignissen arbeitet, habe aber ein Problem mit dem Anheben eines benutzerdefinierten Ereignisses. Ich hatte einen EventHandler und einen benutzerdefinierten EventArgs deklariert:

%Vor%

Und in My DBHelper.class habe ich ein nächstes Feld und ein nächstes Ereignis deklariert:

%Vor%

In der UI-Klasse (MainWindow) verwende ich den folgenden Code:

%Vor%

Also ist mein Problem jetzt, wie man ein Ereignis asynchron auslöst? In meiner DBHelper.class versuche ich beginInvoke & amp; endInvoke mit _query delegate zu verwenden, aber es scheint, dass ich einige Codezeilen verpasst habe was auch immer es war Ich kann nicht verstehen, was ich falsch mache und wie Ereignis asynchron auslösen? Hier mein DBHelper.class -Code:

%Vor%     
whizzzkey 06.04.2015, 01:57
quelle

3 Antworten

8

Zuerst zum Verbindungs-Pooling. Wenn Sie ADO.NET verwenden, müssen Sie sich darüber keine Gedanken machen, da es bereits vorhanden ist. Sie müssen keine zusätzlichen Arbeiten ausführen, sondern nur eine Verbindung erstellen:

%Vor%

Sie sollten immer Schließen oder Dispose Sie Verbindungen. Die Namen der Methoden sehen "gruselig" aus, aber tatsächlich werden Verbindungen wiederverwendet. Bitte lesen Sie diesen MSDN-Artikel , um weitere Informationen zu erhalten.

>

Der von Ihnen vorgeschlagene Code sieht zu kompliziert aus. Ich denke, Sie sollten async / await -Muster verwenden, das im Allgemeinen nicht Multithread ist, aber es behandelt UI-Reaktionsfähigkeit Probleme und vereinfacht das Schreiben / Lesen des Codes. In neueren Versionen von .NET haben fast alle Methoden, die möglicherweise lange ausgeführt werden, asynchrone Versionen. So könnte beispielsweise Ihre Datenzugriffsschicht so aussehen (ich verwende Dapper ORM QueryAsync -Methode nur dazu Code kurz und einfach halten):

%Vor%

Und dann irgendwo auf der Benutzeroberfläche:

%Vor%

Wenn Sie Code in einem anderen Thread ausführen müssen, sollten Sie sich Aufgaben Namespace.

%Vor%

In diesem Beispiel ist GetAllDistricts nicht asynchron und wird in einem anderen Thread ausgeführt. Aber ContinueWith wird im UI-Thread wegen TaskScheduler.FromCurrentSynchronizationContext() ausgeführt.

    
Aleksandr Ivanov 10.04.2015, 23:53
quelle
1
%Vor%

Aber das Problem, dem Sie begegnen werden, ist, dass Sie nicht auf die UI-Steuerelemente vom EventHandler zugreifen können, da dies verweigert wird, weil Sie nicht mehr im gleichen Thread sind ...

Siehe diesen Artikel für eine Erläuterung

Wie man die GUI von einem anderen Thread in aktualisiert C #?

Um dies zu vermeiden, können Sie vielleicht das Steuerelement BackgroundWorker verwenden.

    
Laurent Lequenne 08.04.2015 17:10
quelle
-1

Verwenden Sie diese Option

Ссылка

es ist einfach zu bedienen und einfach zu Datenbank-Betrieb mit weniger Code.

    
Gokul Hirani 14.04.2015 13:50
quelle