Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

CSharp Mysql und Datagridview fragen

Frage Entwicklung VB for Applications

Mitglied: Tobias93

Tobias93 (Level 1) - Jetzt verbinden

14.04.2011 um 23:16 Uhr, 6378 Aufrufe, 18 Kommentare

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
Mitglied: dog
14.04.2011 um 23:36 Uhr
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.
Bitte warten ..
Mitglied: Tobias93
14.04.2011 um 23:51 Uhr
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 ?
Bitte warten ..
Mitglied: Okeanos85
15.04.2011 um 09:00 Uhr
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.

Mit freundlichen Grüßen

Okeanos85
Bitte warten ..
Mitglied: Tobias93
15.04.2011 um 13:44 Uhr
Danke ich weiß garnicht wie ich dir danken soll
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
Bitte warten ..
Mitglied: Tobias93
15.04.2011 um 16:44 Uhr
Neue Stunde neues Problem
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
Bitte warten ..
Mitglied: vossi31
15.04.2011 um 17:18 Uhr
Hallo,

wie wäre es so ungefähr?

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

Henning
Bitte warten ..
Mitglied: dog
15.04.2011 um 18:35 Uhr
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 ...
Bitte warten ..
Mitglied: Tobias93
15.04.2011 um 19:38 Uhr
Das Ganze Programm läuft in einem internen Netzwerk.
Da sehe ich die Gefahr als nicht erwähnenswert an.
Bitte warten ..
Mitglied: dog
15.04.2011 um 19:42 Uhr
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/
Bitte warten ..
Mitglied: Tobias93
15.04.2011 um 19:48 Uhr
Hmmm
Gibt es zu "Prepared Statements" auch eine deutsche Anleitung/Doku.
Denke es wäre doch besser wenn ich lieber das mache.
Bitte warten ..
Mitglied: dog
15.04.2011 um 20:07 Uhr
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:
01.
//Abfrage erstellen 
02.
  MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection); 
03.
//definiert die Parametervariable "@var" mit dem Wert "Bernd's Wurstbude" 
04.
    cmd.Parameters.Add( "@val", "Bernd's Wurstbude" ); 
05.
//sendet die abfrage an den server 
06.
    cmd.Prepare(); 
07.
//führt sie aus 
08.
    cmd.ExecuteNonQuery(); 
09.
 
10.
//eine bindung kann auch beliebig oft mit anderen werten ersetzt werden und neu ausgeführt werden 
11.
    cmd.Parameters[0].Value = "Hans' Wurststand"; 
12.
//dann wird die abfrage mit den belegten Parametern ausgeführt 
13.
    cmd.ExecuteNonQuery();
http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-prepar ...
Bitte warten ..
Mitglied: Tobias93
16.04.2011 um 10:59 Uhr
Okay das hat mich überzeugt
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[0].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 );

?
Bitte warten ..
Mitglied: Biber
16.04.2011 um 13:47 Uhr
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
Bitte warten ..
Mitglied: Tobias93
16.04.2011 um 14:08 Uhr
Also der Post gibt mir den Rest.
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
Bitte warten ..
Mitglied: dog
16.04.2011 um 15:37 Uhr
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.
Bitte warten ..
Mitglied: Okeanos85
18.04.2011 um 08:30 Uhr
sorry, doppel posting...
Bitte warten ..
Mitglied: Tobias93
18.04.2011 um 09:19 Uhr
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.
?
Bitte warten ..
Mitglied: Tobias93
18.04.2011 um 12:38 Uhr
Next Update
Nun geht auch die Suche und die Ausgabe in einer anderen Form,
So
Jetzt noch die Letzten sachen
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 ?
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Exchange Server
Allgemeine Fragen zum Exchange 2010 (3)

Frage von Leo-le zum Thema Exchange Server ...

Visual Studio
DataGridViewComboBoxColumn - DatagridView (2)

Frage von SachsenHessi zum Thema Visual Studio ...

PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...