sandreas schrieb:
Warum machst du denn bei jedem Event die Datenbankverbindung neu auf? Da freut sich der Server aber bestimmt nicht drüber...
Jein. Zum einen sehen wir nicht was genau denn hinter
dbCon
steckt und zum anderen muss nicht zwingend jedes Open() und Close() tatsächlich auch genau das tun was der Name impliziert.
SqlConnection zieht sich beispielsweise eine offene Verbindung aus dem Connection Pool, wenn eine verfügbar ist.
The
SqlConnection draws an open connection from the connection pool if one is available. Otherwise, it establishes a new connection to an instance of SQL Server.
Meistens verwendet man daher die SqlConnection in einem using-Statement, weil dort das Connection Handling mehr oder weniger automatisch erfolgt. Wenn man das zu Fuß programmiert und da wirklich andauernd echtes Open() und Close() gemacht wird, kann das natürlich Performance kosten, keine Frage.
Thommy1972de schrieb:
Das Event wir innerhalb von Mikrosekunden 2-3 abgefeuert.
In dem Fall drängt sich die Frage auf warum das so ist. Was ist das für eine dll und warum feuert sie den Event so oft? Soll das so dein?
Prinzipiell ist jedes Event eigenständig, eine eigene Instanz. Wenn du zB 38 Mal pro Sekunde auf einen "Add" Button hämmerst, wird 38x das Click-Event abgefeuert. Selbst wenn du dort e.handled=true setzen würdest, gälte das nur für diese eine Event-Instanz, aber die anderen 37 Instanzen sind nach wie vor gefeuert und wollen behandelt werden.
Möchtest du nun mehrere gefeuerte Events gegeneinander abriegeln, musst du entweder den Handler entsprechend absichern (zB mit einer Semaphore wie
@mattsavvy es zeigt) oder du kannst vor dem Insert auf Vorhandensein des Records prüfen. Auch eine Event-"Pause" wie du sie mit der
DebounceTime gebaut hast ist eine Möglichkeit. Dann sollte die Prüfung allerdings wie
@marcOcram schon geschrieben hat ganz oben stattfinden.
Letztendlich ist das aber nur Symptombekämpfung. Entweder sollte das Event gar nicht so oft gefeuert werden oder aber das Event ist
eigentlich anders zu handhaben.
dms schrieb:
@Thommy1972de und bitte Prepared SQL bauen
Der Hinweis ist sehr wichtig!
@mattsavvy, dein Code ist zur Zeit anfällig gegenüber
SQL-Injection. Wie in dem verlinkten Comic dargestellt kann ein böswilliger Anwender bei Eingabefeldern SQL-Statements einschleusen, wenn diese nicht validiert werden. Baut man ein SQL-Statement als String zusammen, kann genau das passieren. Deswegen solltest du dir angewöhnen, einen
Parameterized Query zu bauen. Das ist typsicher und niemand kann ein "DROP ALL TABLES" einschleusen, höchstens als reinen String, aber
ohne Funktion.