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
SelectedItem auf einer ListBox bringt immer "System.DataRowView" statt dem Value
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

SelectedItem auf einer ListBox bringt immer "System.DataRowView" statt dem Value

beantworten | zitieren | melden

verwendetes Datenbanksystem: <SQL mit AcessDB>

Hallo Leute,

ich bin recht neu in SQL mit ACCESS in Verbindung zu C#. Ich möchte eine kl Anwendung schreiben, welche eine kl. Lagerverwaltung macht. Dazu Daten aus einer AccessDB mit Material Tabelle und Front-End wo der User Material auswählt, welches dann in der DB eingetragen wird und zeigt vieviel von jedem noch da ist. im Anhang das Bild wie das Prog aussehen soll.

Nun versuche ich mit kl. Schritten die Verbinndung aufzubauen und dann aus der Material ListBox etwas auszuwählen was dann in die Command-Zeichenfolge aufgenommen werden soll. So in etwa:


OleDbConnection sqlConnection1 = new OleDbConnection(Properties.Settings.Default.BMU_LagerConnectionString);
                OleDbCommand cmd = sqlConnection1.CreateCommand();
                sqlConnection1.Open();
                
                cmd.CommandText = $"UPDATE BMU_Material SET BMU_MatISTStand = BMU_MatISTStand - {bMU_MatISTStandNumericUpDown.Value} WHERE BMU_MatName = '" + bMU_MatNameListBox.SelectedItem.ToString() +"' ;";

                cmd.CommandType = CommandType.Text;
                
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    bMU_MatISTStandLabel1.Text = reader[0].ToString();
                }
                reader.Close();

                sqlConnection1.Close();

Mein Problem ist, dass ich bei

WHERE BMU_MatName = '" + bMU_MatNameListBox.SelectedItem.ToString() +"' ;";
nicht den Wert der Listbox bekomme, sondern immer System.DataRowView !!

was mache ich falsch? Wie bekkome in den Wert des selektierten Items der ListBox in das Command ?

Danke im Voraus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von axelfxxx am .
Attachments
---- >
Keine Signatur
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 357
Herkunft: Kassel

beantworten | zitieren | melden

Hi,

ich kenne mich mit WinForms nicht gut aus (in das Forum hätte es wohl auch besser gepasst), würde aber an deiner Stelle mal folgendes machen: Schau im Debugger, was für Möglichkeiten die dein SelectedItem bietet.
==> [Artikel] Debugger: Wie verwende ich den von Visual Studio?


Edit: Sorry, auf dem Schlauch gestanden... DataRowView ist eine View einer Zeile.. da müsstest du eigentlich mit ((DataRowView)SelectecItem)["Spalte"] an den Wert kommen.

P.S. das was du da baust ist eine riesige Sicherheitslücke, zum einen weil der Nutzer direkten Datenbankzugriff hat (ohne, dass du kontrollieren kannst, was er macht) und weil du die Tür für SQL Injection ganz weit aufmachst. Querys baut man nicht mit String Concat zusammen, sondern mit SQL Parametern.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Papst am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15807
Herkunft: BW

beantworten | zitieren | melden

Und ganz wichtig bei dem Code:
[Artikel] Drei-Schichten-Architektur

Und noch wichtiger
[Artikelserie] SQL: Parameter von Befehlen
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 66
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

vielleicht hilft dir diese Eigenschaft weiter: DataRowView.Item

glandorf
private Nachricht | Beiträge des Benutzers
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

beantworten | zitieren | melden

Vielen Dank @ all ich werde die Tips beherzigen ;)
Melde mich heute Abend ob es geklappt hat mit dem DataRowView.
---- >
Keine Signatur
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 444
Herkunft: Untermeitingen

beantworten | zitieren | melden

Und ich würde statt Access mal den SQL Express anschauen. Access ist und war noch nie einen Datenbank....
private Nachricht | Beiträge des Benutzers
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

beantworten | zitieren | melden



Danke @ Papst mein Command String heist jetzt:
cmd.CommandText = $"UPDATE BMU_Material SET BMU_MatISTStand = BMU_MatISTStand - {bMU_MatISTStandNumericUpDown.Value} WHERE BMU_MatName = '" + ((DataRowView)bMU_MatNameListBox.SelectedItem)["BMU_MatName"] + "' ;";

Aber in wie fern ist das jetzt eine Sicherheitslücke ? (blöde Frage) Es kann doch keiner SQL senden, die Felder sind statisch ?

[email protected] ALL für die Tips
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von axelfxxx am .
---- >
Keine Signatur
private Nachricht | Beiträge des Benutzers
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

beantworten | zitieren | melden

Zitat von Stefan.Haegele
Und ich würde statt Access mal den SQL Express anschauen. Access ist und war noch nie einen Datenbank....

Sorry ich arbeite in einem Netzwerk wo diese Access DB gebraucht wird. Ich habe keinen SQL Server hier und kann keinen installieren...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von axelfxxx am .
---- >
Keine Signatur
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15807
Herkunft: BW

beantworten | zitieren | melden

Zitat von axelfxxx
:
Aber in wie fern ist das jetzt eine Sicherheitslücke ? (blöde Frage) Es kann doch keiner SQL senden, die Felder sind statisch ?

Bitte lesen wofür Parameter sind.
Sie sind auch dafür da, dass die Datentypen korrekt verarbeitet werden.

Und egal wie man argumentiert: auch mit statischen Values darf man ruhig sicheres SQL entwickeln und nicht mit String-Concat frickeln ;-)
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 444
Herkunft: Untermeitingen

beantworten | zitieren | melden

Zitat von axelfxxx
Sorry ich arbeite in einem Netzwerk wo diese Access DB gebraucht wird. Ich habe keinen SQL Server hier und kann keinen installieren...

Nur noch als kleiner Hinweis - du kannst selbst eine Access Oberfläche ohne große Änderungen an einen SQL Express binden. Und Netzwerk und Access DB ist eigentlich schon ein Widerspruch...
private Nachricht | Beiträge des Benutzers
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

THX @ aLL

beantworten | zitieren | melden

Ich werde mich mal in das Thema SQL Express reinlesen ...
---- >
Keine Signatur
private Nachricht | Beiträge des Benutzers