Laden...

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

Erstellt von axelfxxx vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.712 Views
axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 5 Jahren
SelectedItem auf einer ListBox bringt immer "System.DataRowView" statt dem Value

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

---- >
Keine Signatur 😉

P
441 Beiträge seit 2014
vor 5 Jahren

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.

16.834 Beiträge seit 2008
vor 5 Jahren

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

Und noch wichtiger
[Artikelserie] SQL: Parameter von Befehlen

87 Beiträge seit 2016
vor 5 Jahren

Hallo,

vielleicht hilft dir diese Eigenschaft weiter: DataRowView.Item

glandorf

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 5 Jahren

Vielen Dank @ all ich werde die Tips beherzigen 😉
Melde mich heute Abend ob es geklappt hat mit dem DataRowView.

---- >
Keine Signatur 😉

463 Beiträge seit 2009
vor 5 Jahren

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

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 5 Jahren

👍

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 ?

THX@ ALL für die Tips

---- >
Keine Signatur 😉

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 5 Jahren

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...

---- >
Keine Signatur 😉

16.834 Beiträge seit 2008
vor 5 Jahren

:
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 😉

463 Beiträge seit 2009
vor 5 Jahren

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...

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 5 Jahren
THX @ aLL

Ich werde mich mal in das Thema SQL Express reinlesen ...

---- >
Keine Signatur 😉