hi!
ich arbeite schon länger mit datenbanken (accdb, sql) und vb.net. ich habe bisher auch immer alles erreichen können, was rauskommen sollte
jetzt möchte ich meinen programmierstil in dem bereich ein wenig professioneller gestalten und muss daher einige sachen hinterfragen.
ich experimentiere hierbei auch gerade mit möglichkeiten, daten von einem sql server in ein datagridview zu übertragen
dabei habe ich jetzt hier 3 varianten:
in 2 fällen wird ein dataset über geben, in einem eine bindingsource.
in jedem fall setze ich diese dann als datasource meines datagridviews, passe bei den beiden ersten fällen noch das datamember an, und die daten werden angezeigt.
a) wo ist der unterschied bei den ersten beiden varianten?
b) warum brauche ich in keinem fall explizit eine verbindung zum sql server aufzubauen (con.Open())?
c) wird die verbindung in obigen fällen automatisch aufgebaut UND getrennt, wenn das dataset gefüllt wurde?
d) gibt es einen grund/vorteil mit der bindingsource variante zu arbeiten? (ich denke hier an die möglichkeit steuerelemente wie textboxen schnell und einfach via bindingsource an felder der tabelle zu binden, ohne alle einzeln mit einem reader einzulesen und zuzuordnen)
jetzt zum "best practise" des datenbankzugriffs:
ausgangssituation:
- sql server 2008 speichert kundendaten, ehemalige kunden, etc
- büroanwendung (verwaltung) und clientanwendung arbeiten mit diesen daten
- gleichzeitiger schreib-/lesezugriff auf datensatz denkbar
- die anwendungen laden alle kunden in ein datagridview, doppelklick auf einen kunden lädt alle kundendaten mittels reader in dafür vorgesehene textboxen/comboboxen
- änderungen werden jeweils pro datensatz mittels executeReader und sql update befehl verwirklicht
e) ist es sinnvoll, bei programmstart alle tabellen in ein dataset der anwendung zu laden, lesezugriff dann nur vom lokalen dataset zu betreiben und bei änderung von datensätzen nur diese auf dem server zu aktualisieren? (gbit netzwerk sollte da keine große wartezeit aufkommen lassen)?
f) sollte eine der beiden anwendungen (z.b. büroanwendung) daten verändern, möchte ich, dass die andere anwendung (in dem falle die clientanwendung) davon erfährt und entsprechenden datensatz im lokalen dataset aktualisiert, oder - sollte die idee mit dem lokalen dataset, das alle tabellen am anfang einliest käse sein - entsprechenden datansatz vom server holt, sofern er gerade auf dem clientrechner geöffnet ist.
ich hätte hier die idee, dass sich beide anwendungen via tcp/ip darüber informieren, wer gerade etwas verändert hat. die andere anwendung kann dann darauf reagieren.
die andere möglichkeit wäre sicher, query notifications zu verwenden. was haltet ihr für sinnvoller?
praktisches beispiel:
kunde max mustermann kommt am empfang an, empfangmitarbeiter checkt kunden mit rfid karte ein, die clientanwendung lädt den datensatz vom sql server/lokalen dataset. kundendaten erscheinen auf dem monitor.
gleichzeitig wird dieser kunde von der büroanwendung aus bearbeitet, erhält z.b. eine sperre. der rechner am empfang soll über die bearbeitung des datensatzes informiert werden, um diesen automatisch oder auf nachfrage aktualisieren zu können (entweder direkt vom sql server in die detailansicht des kunden laden, oder den datensatz im lokalen dataset aktualisieren und von dort aus die detailansicht füllen, wo wir auch wieder bei frage e) sind).
mit tcp/ip kein thema. kurz eine msg an den client geschickt, dieser führt das dann aus. ist es mit query notification eleganter?
ein anderes beispiel wäre, dass durch zufall beide anwendungen den gleichen datensatz zur gleichen zeit bearbeiten wollen, hierbei ist es unbedingt notwendig, dass beide anwender wissen, dass der andere den gleichen kunden bearbeitet.
jetziger zustand:
- es existiert nur die büroanwendung
- anfangs werden alle kunden (ID, Name, Vorname) in ein datagridview geladen
- darunter ist ein textfeld als suchmaske
- klickt der benutzer auf einen kunden im grid, werden die gesamten daten des kunden rechts daneben in einem detailfenster angezeigt. hierbei lädt ein reader einzeln alle felder in die textboxen/comboboxen
- es wird also bei jedem aufruf eine verbindung zum server aufgebaut --> siehe frage e): alles in lokales dataset laden und dann von dort aus die detailform füllen?
- änderungen werden mittels ExecuteReader und sql update befehl in die tabelle auf dem server geschrieben
g) wäre es hier besser/schneller/eleganter die detailform nicht mittels reader zu füllen und mittels sql update command zu speichern, sondern eine bindingsource zu verwenden und den dataadapter update-befehl bei änderungen zu benutzen?
VIELEN dank!
ich arbeite schon länger mit datenbanken (accdb, sql) und vb.net. ich habe bisher auch immer alles erreichen können, was rauskommen sollte
jetzt möchte ich meinen programmierstil in dem bereich ein wenig professioneller gestalten und muss daher einige sachen hinterfragen.
ich experimentiere hierbei auch gerade mit möglichkeiten, daten von einem sql server in ein datagridview zu übertragen
dabei habe ich jetzt hier 3 varianten:
VB.NET-Quellcode
- Public Function LoadServerDBToDataset(ByVal sqlStr As String) As DataSet
- da = New SqlDataAdapter(sqlStr, conStr)
- ds = New DataSet
- da.Fill(ds, "Mitglieder")
- Return ds
- End Function
- Public Function LoadServerDBToDataset2(ByVal sqlStr As String) As DataSet
- con = New SqlConnection(conStr)
- cmd = New SqlCommand(sqlStr, con)
- da = New SqlDataAdapter(cmd)
- cb = New SqlCommandBuilder(da)
- ds = New DataSet
- da.Fill(ds, "Mitglieder")
- Return ds
- End Function
- Public Function LoadServerDBToDataset3(ByVal sqlStr As String) As BindingSource
- con = New SqlConnection(conStr)
- cmd = New SqlCommand(sqlStr, con)
- da = New SqlDataAdapter(cmd)
- cb = New SqlCommandBuilder(da)
- ds = New DataSet
- bs = New BindingSource
- da.Fill(ds, "Mitglieder")
- bs.DataSource = ds
- bs.DataMember = "Mitglieder"
- Return bs
- End Function
in 2 fällen wird ein dataset über geben, in einem eine bindingsource.
in jedem fall setze ich diese dann als datasource meines datagridviews, passe bei den beiden ersten fällen noch das datamember an, und die daten werden angezeigt.
a) wo ist der unterschied bei den ersten beiden varianten?
b) warum brauche ich in keinem fall explizit eine verbindung zum sql server aufzubauen (con.Open())?
c) wird die verbindung in obigen fällen automatisch aufgebaut UND getrennt, wenn das dataset gefüllt wurde?
d) gibt es einen grund/vorteil mit der bindingsource variante zu arbeiten? (ich denke hier an die möglichkeit steuerelemente wie textboxen schnell und einfach via bindingsource an felder der tabelle zu binden, ohne alle einzeln mit einem reader einzulesen und zuzuordnen)
jetzt zum "best practise" des datenbankzugriffs:
ausgangssituation:
- sql server 2008 speichert kundendaten, ehemalige kunden, etc
- büroanwendung (verwaltung) und clientanwendung arbeiten mit diesen daten
- gleichzeitiger schreib-/lesezugriff auf datensatz denkbar
- die anwendungen laden alle kunden in ein datagridview, doppelklick auf einen kunden lädt alle kundendaten mittels reader in dafür vorgesehene textboxen/comboboxen
- änderungen werden jeweils pro datensatz mittels executeReader und sql update befehl verwirklicht
e) ist es sinnvoll, bei programmstart alle tabellen in ein dataset der anwendung zu laden, lesezugriff dann nur vom lokalen dataset zu betreiben und bei änderung von datensätzen nur diese auf dem server zu aktualisieren? (gbit netzwerk sollte da keine große wartezeit aufkommen lassen)?
f) sollte eine der beiden anwendungen (z.b. büroanwendung) daten verändern, möchte ich, dass die andere anwendung (in dem falle die clientanwendung) davon erfährt und entsprechenden datensatz im lokalen dataset aktualisiert, oder - sollte die idee mit dem lokalen dataset, das alle tabellen am anfang einliest käse sein - entsprechenden datansatz vom server holt, sofern er gerade auf dem clientrechner geöffnet ist.
ich hätte hier die idee, dass sich beide anwendungen via tcp/ip darüber informieren, wer gerade etwas verändert hat. die andere anwendung kann dann darauf reagieren.
die andere möglichkeit wäre sicher, query notifications zu verwenden. was haltet ihr für sinnvoller?
praktisches beispiel:
kunde max mustermann kommt am empfang an, empfangmitarbeiter checkt kunden mit rfid karte ein, die clientanwendung lädt den datensatz vom sql server/lokalen dataset. kundendaten erscheinen auf dem monitor.
gleichzeitig wird dieser kunde von der büroanwendung aus bearbeitet, erhält z.b. eine sperre. der rechner am empfang soll über die bearbeitung des datensatzes informiert werden, um diesen automatisch oder auf nachfrage aktualisieren zu können (entweder direkt vom sql server in die detailansicht des kunden laden, oder den datensatz im lokalen dataset aktualisieren und von dort aus die detailansicht füllen, wo wir auch wieder bei frage e) sind).
mit tcp/ip kein thema. kurz eine msg an den client geschickt, dieser führt das dann aus. ist es mit query notification eleganter?
ein anderes beispiel wäre, dass durch zufall beide anwendungen den gleichen datensatz zur gleichen zeit bearbeiten wollen, hierbei ist es unbedingt notwendig, dass beide anwender wissen, dass der andere den gleichen kunden bearbeitet.
jetziger zustand:
- es existiert nur die büroanwendung
- anfangs werden alle kunden (ID, Name, Vorname) in ein datagridview geladen
- darunter ist ein textfeld als suchmaske
- klickt der benutzer auf einen kunden im grid, werden die gesamten daten des kunden rechts daneben in einem detailfenster angezeigt. hierbei lädt ein reader einzeln alle felder in die textboxen/comboboxen
- es wird also bei jedem aufruf eine verbindung zum server aufgebaut --> siehe frage e): alles in lokales dataset laden und dann von dort aus die detailform füllen?
- änderungen werden mittels ExecuteReader und sql update befehl in die tabelle auf dem server geschrieben
g) wäre es hier besser/schneller/eleganter die detailform nicht mittels reader zu füllen und mittels sql update command zu speichern, sondern eine bindingsource zu verwenden und den dataadapter update-befehl bei änderungen zu benutzen?
VIELEN dank!