Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF - ListView erste Spalte in SQL Abfrage ansprechen
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

WPF - ListView erste Spalte in SQL Abfrage ansprechen

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Wie lautet die genaue Fehlermeldung?

Bitte beachten:
[Artikelserie] SQL: Parameter von Befehlen
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

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 }'.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Disko am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16234

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Disko am .
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Disko am .
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Zitat von Disko
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.
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16234

beantworten | zitieren | melden

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 ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Zitat von Abt
Ich kenn das Objekt nicht; könnte aber so aussehen...
Die 'Zeilen' einer ListView unter WinForms sind immer vom Typ ListViewItem.
Die einzelnen 'Zellen' sind in der Property SubItems hinterlegt, welche wiederum vom Typ ListViewSubItem sind.


EDIT: Ich sehe gerade, dass es ja um WPF geht. Also ist die Ausage an dieser Stelle Blödsinn.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von p!lle am .
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

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. =)
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von Disko
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
private Nachricht | Beiträge des Benutzers
Ezio
myCSharp.de - Member

Avatar #avatar-3575.png


Dabei seit:
Beiträge: 196

beantworten | zitieren | melden

Zitat von MrSparkle
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).
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Disko am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4198

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

vllt. hilft des auch Datenbank-Wahl für kleines Büro mit Sicherung zu Hause
private Nachricht | Beiträge des Benutzers
Disko
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Alles klar, Danke. Dann stell ich das nun wo alles noch übersichtlich ist gleich mal um.
private Nachricht | Beiträge des Benutzers