Laden...

WPF - ListView erste Spalte in SQL Abfrage ansprechen

Erstellt von Disko vor 8 Jahren Letzter Beitrag vor 8 Jahren 7.407 Views
D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren
WPF - ListView erste Spalte in SQL Abfrage ansprechen

Hallo zusammen.

In meiner "ersten" C# WPF Anwendung lese ich Werte aus einer Access Datenbank in eine ListView nach folgendem Schema ein.

ListViewAufbau: Bindung PNummer, Vorname, Nachname
Personalnummer | Vorname | Nachname
1 Max Mustermann

Access Datenbank: Tabelle: tblPersonen
persID | persVorname | persNachname
1 Max Mustermann

Ich hatte eigentlich gedacht, dass ich es nun schaffe mit dem SQL Command:

sql.CommandText = "SELECT * FROM tblPersonen WHERE persID = " + listView.SelectedItems[0];

Nur die Zeile aus der Datenbank Tabelle "tblPersonen" auszulesen, welche nach einem Klick in die ListView der persID aus der tblPersonen entspricht. Es sollte also die persID der Personalnummer(PNummer) entsprechen.

Leider klappt der Befehl nicht. Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist die Folge.

Weiß jemand was ich falsch mache bzw. kann mir jemand sagen wie ich den SQl Command richtig ausführen kann?

Vielen Dank schon einmal.
Gruß

1.040 Beiträge seit 2007
vor 8 Jahren

Wie lautet die genaue Fehlermeldung?

Bitte beachten:
[Artikelserie] SQL: Parameter von Befehlen

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Sobald ich in die ListView auf eine beliebige Zeile klicke.

Fehlermeldung:
OleDbException wurde nicht behandelt.
Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
Zusätzliche Informationen: GUID falsch formatiert in Abfrageausdruck 'persID = { PNummer = 1, Vorname = Max, Nachname = Mustermann }'.

16.806 Beiträge seit 2008
vor 8 Jahren

Schau Dir den Link an, den Dir p!lle gegeben hat.

Davon abgesehen ist a) Access keine Datenbank, die man heute noch wählen sollte und b) Dein Vorgehen mehr als nur suboptimal.
Schau Dir den MVVM Pattern an, sowie [Artikel] Drei-Schichten-Architektur

Ohne Pattern wie MVVM wirst Du keine Freude bei WPF haben und immer und immer wieder auf Probleme stoßen.

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Danke für den Hinweis. Ich hab mir den Beitrag auch angeschaut, jedoch hab ich dort keine Lösung gefunden.
Sry vielleicht sehe ich auch einfach nur den Wald vor lauter Bäumen nicht mehr.

Wäre echt nett wenn Ihr da trotzdem eine Lösung oder Vorgehen hättet.


Ich habe hier nach einem Beispiel aus dem Buch "Einstieg in C# 2015" programmiert.
Dachte damit wäre ich so gut es geht auf dem laufenden.

Ich werde mir deine Tips bzgl. anderer Datenbank und MVVM zu Herzen nehmen.

1.040 Beiträge seit 2007
vor 8 Jahren

Naja, du übergibst an das SELECT den Parameter listView.SelectedItems[0] und bekommst dann im Fehler "persID = { PNummer = 1, Vorname = Max, Nachname = Mustermann }" angezeigt...

Du darfst natürlich nur eine ID übergeben.
Für das bessere verständnis: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Ja ich möchte ja auch gerne nur einen Wert, nämlich PNummer der angeklickten Zeile übergeben.
Hab da wohl irgendwo einen Denkfehler und ich komm nicht drauf. Es werden anscheinend immer alle drei übergeben.

1.040 Beiträge seit 2007
vor 8 Jahren

Es werden anscheinend immer alle drei übergeben.

Es wird das übergeben, was du übergibst. 😉

listView.SelectedItems[0]

Du musst dir aus dem Element die richtige Information besorgen.

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Ja leider weiß ich nicht wie man sich da die richtige Info besorgt. X(
Sicherlich muss ich ja wie mir der Debugger schon anzeigt irgendwie nur die PNummer übergeben.
Aber egal wo und wie ich die PNummer ansprechen will, es geht nicht.

Kannst du mir sagen wie die SQL-Anweisung lauten müsste?

1.040 Beiträge seit 2007
vor 8 Jahren

Schaue dir mal folgende Klassen an:
ListView.SelectedItems
ListViewItem
Interessant ist in dem Zusammenhang, wie deine Daten in die ListView kommen.

Und zur Sicherheit:
[FAQ] Wie finde ich den Einstieg in C#?

Das SQL ist prinzipiell richtig, nur wird eben der falsche Parameter hinzugefügt.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Disko,

nimm es mir bitte nicht übel, aber wenn du nicht weißt, wie man auf eine Eigenschaft eines Objektes zugreift, dann solltest du dich ersteinmal mit den Grundlagen von C# beschäftigen, bevor du dich mit WPF oder Datenbanken auseinandersetzt. Ansonsten wirst du immer wieder frustriert vor solchen simplen Problemen stehen. Mein Tip wäre daher, ersteinmal ein C#-Buch durchzuarbeiten, z.B. das kostenlose Buch vom Rheinwerk-Verlag: 🛈
Dann beantworten sich solche Fragen von ganz alleine.

Christian

Weeks of programming can save you hours of planning

16.806 Beiträge seit 2008
vor 8 Jahren

Hinter Deinem listView.SelectedItems[0] steckt eben nicht eine ID, was Du erwartest, sondern ein Objekt.
Du darfst dem SQL aber kein Objekt übergeben, sondern eben die ID.

Du musst also zuerst aus dem Objekt die ID holen.
Ich kenn das Objekt nicht; könnte aber so aussehen...

Guid id = listView.SelectedItems[0].PNummer;

Und die Id gibst Du dann korrekterweise als Parameter dem SQL Befehl.

Ich kann mir nicht vorstellen, dass das in dem Buch falsch drin steht 😉

1.040 Beiträge seit 2007
vor 8 Jahren

Ich kenn das Objekt nicht; könnte aber so aussehen... ~~:::

EDIT: Ich sehe gerade, dass es ja um WPF geht. Also ist die Ausage an dieser Stelle Blödsinn.

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Danke für die ganzen Tipps. Ich hab nun echt einiges ausprobiert. Wenn ich PNummer irgendwo anhänge kommt immer "object" enthält keine Definition für "PNummer",...
Ich komme da leider zu keiner Lösung.

In dem Buch ist leider zum großteil alles eher auf WinForms bezogen. Ich möchte gerne mit WPF arbeiten. Ich werde mir aber alles noch einmal angucken. 😉

1.040 Beiträge seit 2007
vor 8 Jahren

Ich muss jetzt leider MrSparkle zustimmen. Was du machst, ist grade nur Rätselraten.

Da in der ListView alles mögliche angezeigt werden kann, ist das SelectedItem bzw. sind die Elemente in der Liste SelectedItems vom Typ object. Es muss erst in den entsprechenden Typ gecastet werden, der in die ListView reingehängt wurde.
[FAQ] Casten aber richtig: () / is / as

Ich würde dir aber empfehlen, nochmal einen Schritt zurückzugehen und etwas einfacheres auszuprobieren, ansonsten kommst du nur von einem Problem zum nächsten, weil einfach Grundlagen fehlen. =)

5.657 Beiträge seit 2006
vor 8 Jahren

In dem Buch ist leider zum großteil alles eher auf WinForms bezogen. Ich möchte gerne mit WPF arbeiten. Ich werde mir aber alles noch einmal angucken. 😉

Wenn du das Buch vom Rheinwerk-Verlag meinst: WPF wird dort ab dem 16. Kapitel behandelt. Du solltest dich zunächst ersteinmal mit den vorherigen 15 Kapiteln beschäftigen.

Weeks of programming can save you hours of planning

189 Beiträge seit 2014
vor 8 Jahren

Wenn du das Buch vom Rheinwerk-Verlag meinst:

Ich denke, er meint "Einstieg in Visual C#" auch von Rheinwerk. (siehe 3. Post von Disko)
Die Versionen dieses Buches, die ich in den Händen hielt, haben nur auf WinForms gesetzt.

@Disko: Schau dir wirklich mal "Visual C# - Das umfassende Handbuch" von Rheinwerk an.
Das beschäftigt sich viel tiefergehender mit den grundlegenden Themen (hat aber leider keine Übungen etc. und ist viel theoretischer).

D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Davon abgesehen ist a) Access keine Datenbank, die man heute noch wählen sollte...

Welches DBMS wäre denn zu empfehlen?
Das Programm soll später lokal also an einem PC ohne Internet Zugriff laufen. Wäre MS SQL eine bessere Wahl?

4.931 Beiträge seit 2008
vor 8 Jahren

Wenn nur dein Programm eine Datenbank benötigt, dann würde ich eine sog. Embedded Database dir empfehlen, z.B. SQLite oder MS SQL Server Compact.
Jedes volle DBMS müßte ja erst auf dem Rechner installiert (+ administriert) werden.

J
251 Beiträge seit 2012
vor 8 Jahren
D
Disko Themenstarter:in
18 Beiträge seit 2016
vor 8 Jahren

Alles klar, Danke. Dann stell ich das nun wo alles noch übersichtlich ist gleich mal um.