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 😉
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.
Und ganz wichtig bei dem Code:
[Artikel] Drei-Schichten-Architektur
Und noch wichtiger
[Artikelserie] SQL: Parameter von Befehlen
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
vielleicht hilft dir diese Eigenschaft weiter: DataRowView.Item
glandorf
Vielen Dank @ all ich werde die Tips beherzigen 😉
Melde mich heute Abend ob es geklappt hat mit dem DataRowView.
---- >
Keine Signatur 😉
Und ich würde statt Access mal den SQL Express anschauen. Access ist und war noch nie einen Datenbank....
👍
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 😉
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 😉
:
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 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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...
Ich werde mich mal in das Thema SQL Express reinlesen ...
---- >
Keine Signatur 😉