tobias93
Goto Top

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

Content-ID: 164633

Url: https://administrator.de/contentid/164633

Ausgedruckt am: 16.11.2024 um 15:11 Uhr

dog
dog 14.04.2011 um 23:36:56 Uhr
Goto Top
Die frage ist ist das überhaupt möglich

1.
Ja

2.
Ja

3.
Ja

Ich bin dankbar für jeden Tipp

Hier gleich der Erste: Ein Client Programm hat nie direkt auf die Datenbank auf einem Server zuzugreifen!
Für sowas benutzt man immer eine API.
Tobias93
Tobias93 14.04.2011 um 23:51:18 Uhr
Goto Top
Gut es ist möglich aber ein paar antworten wären schon nicht schlecht.
und warum darf die Anwendung nicht direkt auf die Datenbank zugreifen ?
Okeanos85
Okeanos85 15.04.2011 um 09:00:20 Uhr
Goto Top
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
Tobias93
Tobias93 15.04.2011 um 13:44:22 Uhr
Goto Top
Danke ich weiß garnicht wie ich dir danken soll face-wink
Ich werde das machen so wie du es gesagt hast und dann den source nochmal Pub machen.
Naja vielen dank und ich hoffe ich bekomme das hin face-wink
Tobias93
Tobias93 15.04.2011 um 16:44:29 Uhr
Goto Top
Neue Stunde neues Problem face-wink
Beim neuanlegen bekomme ich nicht alles in eine zeile geschriben.
was ist falsch an der sache.

Funktioniert:

string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
connection.Open();
MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Kundennummer) VALUES ('" + Kundennummer + "')", connection);
int i = insertCommand.ExecuteNonQuery();

Funktioniert nicht
string myConnectionString = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";
MySqlConnection connection = new MySqlConnection(myConnectionString);
connection.Open();
MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Kundennummer) VALUES ('" + Kundennummer + "') AND (Firma) VALUES ('" + Firma + "')", connection);
int i = insertCommand.ExecuteNonQuery();


Die Strings sind alle erstellt und der Fehler tritt auch erst auf wenn ich debugge
vossi31
vossi31 15.04.2011 um 17:18:08 Uhr
Goto Top
Hallo,

wie wäre es so ungefähr?

MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Kundennummer, Firma) VALUES ('" + Kundennummer + "," + Firma + "')", connection);

Henning
dog
dog 15.04.2011 um 18:35:26 Uhr
Goto Top
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 ...
Tobias93
Tobias93 15.04.2011 um 19:38:18 Uhr
Goto Top
Das Ganze Programm läuft in einem internen Netzwerk.
Da sehe ich die Gefahr als nicht erwähnenswert an.
dog
dog 15.04.2011 um 19:42:34 Uhr
Goto Top
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
Bernd's Wurstbude
einträgt.

http://xkcd.com/327/
Tobias93
Tobias93 15.04.2011 um 19:48:04 Uhr
Goto Top
Hmmm
Gibt es zu "Prepared Statements" auch eine deutsche Anleitung/Doku.
Denke es wäre doch besser wenn ich lieber das mache.
dog
dog 15.04.2011 um 20:07:45 Uhr
Goto Top
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:
//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 ...
Tobias93
Tobias93 16.04.2011 um 10:59:09 Uhr
Goto Top
Okay das hat mich überzeugt face-wink
Hmm nur ich muss sagen das ich aus dem anderen nicht schlau werde.

string myConnection = "Data Source=localhost;" +
"DATABASE=bb-internet;" +
"UID=root;" +
"PASSWORD=;";

MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection);
cmd.Parameters.Add( "@val", "Bernd's Wurstbude" );
cmd.Prepare();
cmd.ExecuteNonQuery();
cmd.Parameters.Value = "Hans' Wurststand";
cmd.ExecuteNonQuery(


Error 1 The best overloaded method match for 'MySql.Data.MySqlClient.MySqlCommand.MySqlCommand (string, MySql.Data.MySqlClient.MySqlConnection)' has some invalid arguments C:\Users\username\Documents\Visual Studio 2010\Projects\BB_Final\BB_Final\Form2.cs 90 22 BB_Final

Error 2 Argument 2: cannot convert from 'string' to 'MySql.Data.MySqlClient.MySqlConnection' C:\Users\username\Documents\Visual Studio 2010\Projects\BB_Final\BB_Final\Form2.cs 90 76 BB_Final


Dann die Frage


MySqlCommand cmd = new MySqlCommand("INSERT INTO kunden VALUES (@val)", myConnection);

cmd.Parameters.Add( "@val", "Bernd's Wurstbude" );

Wo sag ich das es in spalte XY gehöhrt weil bei meiner alten art war es noch schön übersichtlich

MySqlCommand insertCommand = new MySqlCommand("INSERT INTO kunden (Kundennummer, Firma) VALUES ('" + Kundennummer + "," + Firma + "')", connection);


Das nächste noch viel wichtigere ist kann ich bei prepären Statements auch den Inhalt einer Textbox einfügen ?

weil aus

cmd.Parameters.Add( "@val", "Bernd's Wurstbude" );

werde ich nicht so richtig schlau.
oder kann ich auch einfach

string Name = textBox1.Text;
cmd.Parameters.Add( "@Name", Name );

?
Biber
Biber 16.04.2011 um 13:47:12 Uhr
Goto Top
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
Tobias93
Tobias93 16.04.2011 um 14:08:26 Uhr
Goto Top
Also der Post gibt mir den Rest. face-wink
Jetzt bin ich wirklich verwirrt.
Naja
Ich werde es jetzt sehr warscheinlich so machen wir ich es machen wollte in den input der Textboxen filtern.

Es ist ja nur der " ' " der das Problem verursacht oder ?

Ich würde das Programm bis Mittwoch zur ersten Vorschau fertig haben.
Deswegen muss ich mir mal was einfallen lassen.
Und da das meine erste Arbeit mit Mysql ist sollte ich mir schnell was einfallen lassen da es bestimmt noch zu mehr Problemen kommt.
Und das Design und alles ist auch nicht fertig . ^^
Ich bin mal weiter beschäftigt und danke allen die mir bis jetzt geholfen haben und hoffe das ihr mich auch noch weiter helfen könnt face-wink
dog
dog 16.04.2011 um 15:37:23 Uhr
Goto Top
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.
Okeanos85
Okeanos85 18.04.2011 um 08:30:57 Uhr
Goto Top
sorry, doppel posting...
Tobias93
Tobias93 18.04.2011 um 09:19:37 Uhr
Goto Top
So nun mal ein kleines Update.
Erstmal danke an alle die mir hier geholfen haben.
Was nun läuft.
Ausgeben in Datagrid View
Eintragen mit Prepared Statements
Suchen so fast.
Nur jetzt ist immernoch die sache.

Wenn ich auf eine Zeile im Datagridview ein Doppelklick mache wie kann ich die zeile in einer Messagebox ausgeben lassen.
Und wie sag ich das er genau die spalte ausgeben soll.
?
Tobias93
Tobias93 18.04.2011 um 12:38:32 Uhr
Goto Top
Next Update
Nun geht auch die Suche und die Ausgabe in einer anderen Form,
So
Jetzt noch die Letzten sachen face-wink
Wie edetier ich jetzt und lösche bestimmte spalten
Das ich in das Datagridview schreiben kann is ja klar das ich auch sachen löschen kann ist klar aber es steht ja immernoch in der Datenbank.
Wie kann ich es machen das der User ein z.b. Rechtsklick auf die spalte macht und dann entscheiden kann ob er löschen oder editieren kann ?