CSharp Mysql und Datagridview fragen
Hallo Administrator Forum
Ich schreibe seit kurzen ein Programm um Kunden Daten in Sql zu speichern und in c# auszugeben.
Da ich noch nicht viel Ahnung von der Materie habe hoffe ich hier hilfe zu finden.
Die sache sieht so aus.
Das Datenbank soll in einem internen Netzwerk liegen und das Programm soll abfragen, schreiben und durchsuchen.
Das Auslesen und in ein Datagridview schreiben habe ich schon.
string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
String sql = "SELECT * FROM `kunden` WHERE 1";
DataTable datatable = new DataTable();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(sql, connection);
dataAdapter.Fill(datatable);
dataGridView1.DataSource = datatable;
dataGridView1.Show();
Das Funktioniert auch soweit.
Auch das schreiben Funktioniert.
string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
connection.Open();
String name = "test";
MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Firma) VALUES ('" + name + "')", connection);
int i = insertCommand.ExecuteNonQuery();
Nur jetzt kommt das wo ich meine Probleme habe.
1.
Suchen
Ich hätte gerne eine Textbox und daneben eine Listbox wo die Spalten wie z.b. Kundennummer Firma Nachname usw. aufgelistet sind.
Jetzt sag ich z.b. Kundennummer und in der Textbox gebe ich die Nummer ein die ich suche das er mir die ganze Spalte ausgibt also Name Firma usw.
2.
Daten ändern
Das wenn ich die Daten wie oben beschriben gesucht habe ich sie auch ändern kann wenn sich zumbeispiel die Telefonnummer geändert hat.
3.
Datagridview anklicken
Sehr schön wär es wenn ich eine zeile im Datagridview anklicke und sich eine neue form öffnet wo die daten ca. so stehen
Kundennummer:
Firma;
Name:
Nachname:
Die frage ist ist das überhaupt möglich und wie mach ich aus den richtigen inhalt der spalten eine String.
So das wär es auch schon
Ich bin dankbar für jeden Tipp den ihr mir geben könnt da ich leider von Mysql nicht viel verstehe
und mich da noch weiter bilden möchte.
Mit freundlichen Grüßen
Tobias Dressler
Ich schreibe seit kurzen ein Programm um Kunden Daten in Sql zu speichern und in c# auszugeben.
Da ich noch nicht viel Ahnung von der Materie habe hoffe ich hier hilfe zu finden.
Die sache sieht so aus.
Das Datenbank soll in einem internen Netzwerk liegen und das Programm soll abfragen, schreiben und durchsuchen.
Das Auslesen und in ein Datagridview schreiben habe ich schon.
string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
String sql = "SELECT * FROM `kunden` WHERE 1";
DataTable datatable = new DataTable();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(sql, connection);
dataAdapter.Fill(datatable);
dataGridView1.DataSource = datatable;
dataGridView1.Show();
Das Funktioniert auch soweit.
Auch das schreiben Funktioniert.
string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
connection.Open();
String name = "test";
MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Firma) VALUES ('" + name + "')", connection);
int i = insertCommand.ExecuteNonQuery();
Nur jetzt kommt das wo ich meine Probleme habe.
1.
Suchen
Ich hätte gerne eine Textbox und daneben eine Listbox wo die Spalten wie z.b. Kundennummer Firma Nachname usw. aufgelistet sind.
Jetzt sag ich z.b. Kundennummer und in der Textbox gebe ich die Nummer ein die ich suche das er mir die ganze Spalte ausgibt also Name Firma usw.
2.
Daten ändern
Das wenn ich die Daten wie oben beschriben gesucht habe ich sie auch ändern kann wenn sich zumbeispiel die Telefonnummer geändert hat.
3.
Datagridview anklicken
Sehr schön wär es wenn ich eine zeile im Datagridview anklicke und sich eine neue form öffnet wo die daten ca. so stehen
Kundennummer:
Firma;
Name:
Nachname:
Die frage ist ist das überhaupt möglich und wie mach ich aus den richtigen inhalt der spalten eine String.
So das wär es auch schon
Ich bin dankbar für jeden Tipp den ihr mir geben könnt da ich leider von Mysql nicht viel verstehe
und mich da noch weiter bilden möchte.
Mit freundlichen Grüßen
Tobias Dressler
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 164633
Url: https://administrator.de/forum/csharp-mysql-und-datagridview-fragen-164633.html
Ausgedruckt am: 24.12.2024 um 00:12 Uhr
18 Kommentare
Neuester Kommentar
Hallo,
zu Deiner 1. Frage:
'#########
Suchen
Ich hätte gerne eine Textbox und daneben eine Listbox wo die Spalten wie z.b. Kundennummer Firma Nachname usw. aufgelistet sind.
Jetzt sag ich z.b. Kundennummer und in der Textbox gebe ich die Nummer ein die ich suche das er mir die ganze Spalte ausgibt also Name Firma usw.
'#########
Die Listbox ist schnell erstellt, befüllt wird Sie durch folgende Eigenschaften (hier in VB, aber c# sollte die gelichen eigenschaften haben):
ComboBox2.DataSource = DataGridView1.Columns
ComboBox2.DisplayMember = "DataPropertyName"
ComboBox2.ValueMember = "DataPropertyName"
Jetzt zur Textbox:
Hier wird es etwas krimineller, ich kann Dir da nur sagen wie ich es gemacht habe, das hat jedoch keinen Anspruch auf "Best Practise"
Damit Du die Daten Ordentlich filtern kannst verwende doch eine BindingSource. Dein DB Schema sähe dann So aus [DataTable] -> [BindingSource] -> [Datagridview]
Der Vorteil daran ist, dass die Bindingsource über Eigenschaften wie Filter,Navigation sowie Positionierung verfügt.
List- und Textbox ist also erstellt und Listbox hat ein Datasource. Um den Suchfilter zu setzen verwende ich immer das TextChanged Ereigniss.
Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
Try
ArtikelBindingSource1.Filter = ComboBox.Text & " LIKE '" & TextBox.Text & "%'"
Catch e1 As Exception
[......]
End Try
den Funktionsumfang der Filter Eigenschaft kannst Du da in der msdn nachlesen.
Zur 3. Frage
SelectionMode Eigenschaft des DataGridview auf FullRowSelect umstellen und dann z.b. Ereignis CellMouseDoubleClick abfangen. der Rest von Frage 3 dürfte dann klar sein.
Zur 2. Frage
Also entweder direkt in der View (Doppelklick auf eine Zelle, F2, ... je nachdem was in der EditMode Eigenschaft des Grids eingestellt ist) oder über ein gebasteltes Formular in dem die Steuerelemente an die aktuell gewählte Zeile im Grid gebunden wird. Auch hier findet BindingSource wieder verwendung.
Scheue keine Fragen zum Thema, bei Datenbanken und deren Verwendung kann man viele Nerven lassen.
MfG
Okeanos85
zu Deiner 1. Frage:
'#########
Suchen
Ich hätte gerne eine Textbox und daneben eine Listbox wo die Spalten wie z.b. Kundennummer Firma Nachname usw. aufgelistet sind.
Jetzt sag ich z.b. Kundennummer und in der Textbox gebe ich die Nummer ein die ich suche das er mir die ganze Spalte ausgibt also Name Firma usw.
'#########
Die Listbox ist schnell erstellt, befüllt wird Sie durch folgende Eigenschaften (hier in VB, aber c# sollte die gelichen eigenschaften haben):
ComboBox2.DataSource = DataGridView1.Columns
ComboBox2.DisplayMember = "DataPropertyName"
ComboBox2.ValueMember = "DataPropertyName"
Jetzt zur Textbox:
Hier wird es etwas krimineller, ich kann Dir da nur sagen wie ich es gemacht habe, das hat jedoch keinen Anspruch auf "Best Practise"
Damit Du die Daten Ordentlich filtern kannst verwende doch eine BindingSource. Dein DB Schema sähe dann So aus [DataTable] -> [BindingSource] -> [Datagridview]
Der Vorteil daran ist, dass die Bindingsource über Eigenschaften wie Filter,Navigation sowie Positionierung verfügt.
List- und Textbox ist also erstellt und Listbox hat ein Datasource. Um den Suchfilter zu setzen verwende ich immer das TextChanged Ereigniss.
Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
Try
ArtikelBindingSource1.Filter = ComboBox.Text & " LIKE '" & TextBox.Text & "%'"
Catch e1 As Exception
[......]
End Try
den Funktionsumfang der Filter Eigenschaft kannst Du da in der msdn nachlesen.
Zur 3. Frage
SelectionMode Eigenschaft des DataGridview auf FullRowSelect umstellen und dann z.b. Ereignis CellMouseDoubleClick abfangen. der Rest von Frage 3 dürfte dann klar sein.
Zur 2. Frage
Also entweder direkt in der View (Doppelklick auf eine Zelle, F2, ... je nachdem was in der EditMode Eigenschaft des Grids eingestellt ist) oder über ein gebasteltes Formular in dem die Steuerelemente an die aktuell gewählte Zeile im Grid gebunden wird. Auch hier findet BindingSource wieder verwendung.
Scheue keine Fragen zum Thema, bei Datenbanken und deren Verwendung kann man viele Nerven lassen.
MfG
Okeanos85
Das ist komplett falsch und ein Garant dafür, dass du dir eine Sicherheitslücke schießt!
Mein Kommentar oben war nicht ohne Grund!
Wenn Abfragen mit Parameter, dann immer über Prepared Statements.
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqlcomm ...
Mein Kommentar oben war nicht ohne Grund!
Wenn Abfragen mit Parameter, dann immer über Prepared Statements.
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqlcomm ...
Prost!
Es ist sogar leichter Prepared Statements zu benutzen als die Sicherheitslücke, die du dir da bastelt aber du bleibst lieber dabei.
Dein Gebastele implodiert ja schon wenn mal jemand bei Firma
http://xkcd.com/327/
Es ist sogar leichter Prepared Statements zu benutzen als die Sicherheitslücke, die du dir da bastelt aber du bleibst lieber dabei.
Dein Gebastele implodiert ja schon wenn mal jemand bei Firma
Bernd's Wurstbude
einträgt.http://xkcd.com/327/
Das ist doch ganz einfach:
Bei Prepared Statements wird zuerst eine Abfrage an den Server gesendet und dann alle benötigten Parameter hinterher.
Damit weiß der Server ganz klar was ein korrekter Query und was potentiell gefährliche Variablen sind.
Das Beispiel zeigt auch schon alles, was es da zu sehen gibt:
http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-prepar ...
Bei Prepared Statements wird zuerst eine Abfrage an den Server gesendet und dann alle benötigten Parameter hinterher.
Damit weiß der Server ganz klar was ein korrekter Query und was potentiell gefährliche Variablen sind.
Das Beispiel zeigt auch schon alles, was es da zu sehen gibt:
//Abfrage erstellen
MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection);
//definiert die Parametervariable "@var" mit dem Wert "Bernd's Wurstbude"
cmd.Parameters.Add( "@val", "Bernd's Wurstbude" );
//sendet die abfrage an den server
cmd.Prepare();
//führt sie aus
cmd.ExecuteNonQuery();
//eine bindung kann auch beliebig oft mit anderen werten ersetzt werden und neu ausgeführt werden
cmd.Parameters.Value = "Hans' Wurststand";
//dann wird die abfrage mit den belegten Parametern ausgeführt
cmd.ExecuteNonQuery();
http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-prepar ...
Moin tobias93,
SQL ist zwar nicht ganz mein Fachgebiet, aber zwei Tipps hätte ich dennoch.
a) es geht hier weder üm "prepäre Statements" noch um Prepaid-Statements, sondern um "Prepared Statements"
b) wenn dog in seinem Beispiel EIN Feld in seine mytable INSERTed und dafür EINEN Parameterwert füllen muss, dann solltest du für deine DREI Felder in deiner dytable.... na..??? Hmmm?
Grüße
Biber
SQL ist zwar nicht ganz mein Fachgebiet, aber zwei Tipps hätte ich dennoch.
a) es geht hier weder üm "prepäre Statements" noch um Prepaid-Statements, sondern um "Prepared Statements"
b) wenn dog in seinem Beispiel EIN Feld in seine mytable INSERTed und dafür EINEN Parameterwert füllen muss, dann solltest du für deine DREI Felder in deiner dytable.... na..??? Hmmm?
Grüße
Biber
MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection);
myConnection ist ein Connection-String und keine Datenbankverbindung.
Die sollte man mit MySqlConnection schon noch aufbauen.
"INSERT INTO kunden (Kundennummer, Firma) VALUES (@kdnummer,@firma)"
cmd.Parameters.Add( "@firma", textBox1.Text );
Du solltest schon darauf achten was dir Visual Studio in der Kontexthilfe anbietet.
Wenn da steht, dass die Funktion einen String will dann kannst du da auch alles einsetzen was einen String liefert.