Hallo,
ich bin noch neu hier und hoffe auf Hilfe.
Senario:
Sprache: C#
Datenbank: MySQL
Ich habe ein WinForm Anwendung mit der ich eine Art Stundenkonto für Mitarbeiter führen möchte.
Aktuell hae ich es soweit, das ich eine vorhande Excel Tabelle einlesen kann, Einträge hinzufügen kann.
Ich habe die Mitarbeiter und die Auftraggeber in einer Combobox, die ais der DB gefüllt wird.
Jetzt zu meiner Herausforderung:
Ich möchte das, wenn ich eine Auftraggeber ausgewählt habe, automatisch die hinterlegte Adresse in meine Textbox (txtAdresse) für die Adresse
eingetragen wird. Bekomme das aber irgendwie nicht hin.
Danke euch im Voraus
Jenz
Was hast denn bisher versucht? Was ist Deine Frage? Wo kommst Du nicht weiter?
Siehe [Hinweis] Wie poste ich richtig?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
using (MySqlConnection conn = new MySqlConnection(connString))
{
conn.Open();
// Erstellen eines neuen DataAdapter
string client = txbClient.Text;
string commmand = "SELECT distinct @constructionSite FROM stundenliste where client = @client";
MySqlCommand cmd = new MySqlCommand(commmand);
cmd.Connection = conn;
MySqlDataAdapter adapter = new MySqlDataAdapter();
cmd.Parameters.Add("@constructionSite", MySqlDbType.VarChar);
cmd.Parameters["@constructionSite"].Value = adresse;
adapter.SelectCommand = cmd;
cmd.Parameters.Add("@client", MySqlDbType.VarChar);
cmd.Parameters["@client"].Value = client;
adapter.SelectCommand = cmd;
txbAdresse.Text = cmd.ExecuteNonQuery().toString();
// Schließt die DB Verbindung
conn.Close();
}
Das ist jetzt der aktuelle Stand.
Wie gesagt Einträg in die DB bekomme ich. Jedoch bekomme ich anscheinend nicht das raus was ich mir erhoffe.
Ich versuche es nochmal genauer zu erklären:
Ich habe eine WinForm.
Diese hat mehrere ComboBoxen und mehrere Textboxen sowie eine DateTimePicker.
Ich habe eine Textbox "Adresse" hier zu gibt es auch die passende Splaten in der Datenbank-Tabelle.
Ich hätte jetzt gerne, wenn ihc das Porgramm ausführe und die Textfelder befülle und aus der Combobox(cmbClient) einen Eintrag auswähle, das dieses SelectedItem genutzt wir um eine weitere DB Abfrage durchzuführen ( SELECT adresse FROM Tabellenname where client = cmbClient.SelectedItem (Ich weiß Syntax funktioniert so nicht ist jetzt nur zur Verdeutlichung) ).
Dies soll aber jedesmal geschehen, wenn ich einen Eintrag aus der Combobox auswähle.
Hallo,
dann mußt du dafür das ComboBox.SelectedIndexChanged-Ereignis verwenden.
Und für die Parameter verwendet man, wenn möglich, besser AddWithValue.
Siehe MySQL Docs: MySQL .NET - 6.1.4 Working with Parameters
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Schau dir mal im Debugger an, was cmd.ExecuteNonQuery() zurückgibt. Vermutlich nicht dass, was du erwartest: https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?view=dotnet-plat-ext-7.0
P.S.: Der Code kompiliert nicht.. toString() ist kein valides C#.
So, nachdem ich alles noch mal überdacht hatte, bin ich entlich erfolgreich gewesen
hier meine Lösung:
string connString = $"server=server;user id=user ; password=password; database=database;SslMode=Preferred";
using (MySqlConnection conn = new MySqlConnection(connString))
{
string newclient = cmbClient.Text;
conn.Open();
string commmand = "SELECT distinct constructionSite, client FROM stundenliste where client = '" + newclient + "'";
MySqlCommand cmd = new MySqlCommand(commmand);
cmd.Connection = conn;
MySqlCommand command = new MySqlCommand(commmand, conn);
// Parameter für die Abfrage setzen
command.Parameters.AddWithValue("@client", newclient);
// Abfrage ausführen
MySqlDataReader reader = command.ExecuteReader();
// Ergebnisse verarbeiten
if (reader.Read())
{
// Daten auslesen
string constructionSite = reader.GetString("constructionSite");
// Ausgabe der Daten
txbAdresse.Text = constructionSite;
}
// Reader schließen
reader.Close();
conn.Close();
}
Jetzt verwendest du aber den SQL-Parameter nicht mehr, sondern dein Code ist nun anfällig für SQL-Injection!
Und warum verwendest du jetzt zwei verschiedene MySqlCommand
-Objekte?
Außerdem benötigst du durch konsequente Verwendung der using
-Anweisungen auch keinen expliziten Close()
-Aufruf mehr.