Laden...

[gelöst] Beispielprojekt C# mit mysql anbindung

Erstellt von Blogscreen vor 14 Jahren Letzter Beitrag vor 14 Jahren 9.211 Views
Blogscreen Themenstarter:in
344 Beiträge seit 2007
vor 14 Jahren
[gelöst] Beispielprojekt C# mit mysql anbindung

Vorwort:
Ich möchte NICHT das es so rüberkommt das ich hier nach fertigen Projekten suche,
ohne selbst hierfür etwas zu leisten!

Anliegen:
Hat jemand ein Projekt, alternativ einen Link, mit einer einfachen C# Anwendung die
auf mysql zugreift?

Im folgenden würde ich mir gerne ein einfaches Programm programmieren
welches eine Gridview hat und per Button eine Tabelle einliest.
Dort sollte man dann per Textfeld einfach Datensätze in die Tabelle einfügen können
und diese löschen.

Habe mich leider in C# nie mit Mysql beschäftigt
Kennt jemand ein passendes Beispielprojekt?

Grüße

👶-> :]-> 8o-> 🙂

F
10.010 Beiträge seit 2004
vor 14 Jahren

Solltest du mal hier in der Suche den Begriff "MySql" eingeben, wirst du haufenweise finden.

Auch bei MySql selber gibt es eine Doku zum MySql Connector.NET.

Blogscreen Themenstarter:in
344 Beiträge seit 2007
vor 14 Jahren

In der suche findet man auf den ersten Seiten nicht viel.
Habe nun doch was weiter hinten gefunden.
Schaue ich mir mal gleich an ...

👶-> :]-> 8o-> 🙂

S
22 Beiträge seit 2009
vor 14 Jahren
Leider nur in c++

Hi,

hab schon mal ne kleine dll geschrieben (die den Mysql Connector beinhaltet). Diese Dll kann man in c# projekten einbinden, sollte genau das sein was du suchst.... vielleicht taugs dir (siehe anhang) 😃

Hier ein beispiel wie du die dll benutzen kannst:

Code (nicht getestet als ned 1zu1 kopieren):


using xDot.mysqlHandling;

//Set Up new Connection
mysql MySqlConnection = new mysql("Server", "Username", "Passwort", "DB-Name", 5 , "#");
//Die letzten 2 sind Timeout und Seperator, der Seperator wird benutzt um die spalten von einander zu trennen im Rückgabe String Array

//Anfrage an den Server:
String[] Result = MySqlConnection.readMysqlString("SELECT * FROM `table`");
for (int x = 0; x < Result p.Length; x++)
    Console.WriteLine(Result .GetValue(i)); //Gibt die Zeilen aus (Rows)

/*
Die Rückgabe erfolgt als Array in dem Format
Array[0] = ROW 0= "Column#Column2#Column3#Column4#...ColumnN#
Array[1] = ROW 1= "Column#Column2#Column3#Column4#...ColumnN#
Array[2] = ROW 2= "Column#Column2#Column3#Column4#...ColumnN#
Array[3] = ROW 3= "Column#Column2#Column3#Column4#...ColumnN#
\*/

//Du kannst dann jede Zeile über Split aufteilen dann hast jeden Wert alleine.
//Daten einfügen löschen etz:
MySqlConnection.sendMysqlString("DELETE FROM `Table` WHERE `id`='12' LIMIT 1");

Es gibt eigentlich nur die 2 Funktionen zum empfangen und versenden...
readMysqlString("Sql Command") ... die zum empfangen liefert einen String Array zurück
sendMysqlString("SQL Command") ... die zum versenden einen bool wert
ganz easy... 😃

Die Dll ist inklusive der MySql.Data die der Connector mitliefert... Wennst den C++ Source haben willst sag Bescheid.

mfg seek

Blogscreen Themenstarter:in
344 Beiträge seit 2007
vor 14 Jahren

Edit: Super erklärt: http://www.codeplanet.eu/tutorials/csharp/5-verbindung-zum-mysql-server-mit-csharp.html

Danke seek!

Weitere Hilfen sind erstmal nicht nötig

👶-> :]-> 8o-> 🙂

F
10.010 Beiträge seit 2004
vor 14 Jahren

@seek:
Bitte diesen Code sofort verbrennen und neu anfangen.

Da ist so ziemlich alles suboptimal drin, was geht.
Schau dir bitte die entsprechenden Tutorials und Artikel bei uns an
zu Parametern und Datenbanken.

S
22 Beiträge seit 2009
vor 14 Jahren
omg was bist du für einer.... ???

...........sofort verbrennen ??

Sag mal nur weil was nicht perfekt ist heist es nicht das es nciht funktioniert.
Die Aussage sofort verbrennen ist ja abartig sorry aber das muss gesagt werden.

Es ist ne kleine Klasse in c++ geschrieben wodurch man mit 3 Zeilen code schon was von nem Mysql Server abrufen kann ich finds hilfreich du nicht tja... pech.

Wennst das besser kannst ok, wenn nicht auch gut, aber man muss ned jemanden so herablasend beurteilen 🙄 🙄

ps: Die klasse läuft in einem Client welches ca. 10 leute bei mir in der Arbeit verwenden und es funktioniert sogar sehr gut ohne fehler!... wow wer hätte das geglaubt... ??

mfg seek

365 Beiträge seit 2007
vor 14 Jahren

Hallo zusammen,

Ich glaube FZelle wollte damit nur sagen das der Code unschöne und sicherheitsbedenkliche Passagen beinhaltet.

Er will ja nicht deine Person kritisieren, sondern nur deinen Code.
Auch wenn es eine unglücklich formulierte Kritik ist. 😁

Falls du aber in dem Punkt nicht kritikfähig bist, willst du wohl auch gar nicht kritisiert bzw. auf bessere Lösungsvorschläge hingewiesen werden.
Ohne Parameter zu arbeiten ist fahrlässig und öffnet Hackern Tor und Tür.

Greetz da kubi...

[Edit] Rechtschreibung 😜 [/Edit]

F
10.010 Beiträge seit 2004
vor 14 Jahren

@seek:
Es war nicht Herablassend gemeint.

Dein Code ist nicht einfach nur nicht perfekt, sondern verstösst explizit gegen viele
grundgedanken bei ADO.NET und OOP überhaupt.

Du friemelst die Parameter in den SqlString, was nicht nur Fehleranfällig ist,
sondern eben zu SqlInjrctions und performance Problemen führen wird.

Und das code läuft heisst noch lange nicht, das er irgendwie gut sein muss.

S
22 Beiträge seit 2009
vor 14 Jahren

...das der Code nicht perfekt ist weiß ich auch, da ich grad mal ca. 1 Monat C++ prog Erfahrung habe, aber es ist ausreichen wenn man in einem kleinen Programm die Verbindung zu einer MySql db ermöglichen will.

Ich bin sehr wohl Kritik fähig nur es gibt mehrere arten wie man Kritik an den Mann bringen kann und die Art von FZelle war meines Erachtens total herablassend!

Ich hab mir auch den Code von "codeplanet.eu" angeschaut und da ist natürlich kein Vergleich zu meinem Aufbau und style und Sicherheit. Weiters ist der Code der Klasse gar nicht sichtbar also kritisiert man etwas was man noch gar nicht gesehen hat =)

Es ist auch unverständlich wieso ich nicht den Connection String dynamisch generieren kann also „zerschnipseln“

conString = "blablabla" 

ist doch das gleiche wie

x = "bla"
conString = "bla"+x+"bla";

?

mfg seek

F
10.010 Beiträge seit 2004
vor 14 Jahren

Es geht hier nicht um den ConnectionString, sondern um den SqlString.
So wie Du es machst ist es falsch.

[Artikelserie] Parameter von SQL Befehlen

Und bevor Du weiter fragst, auch globale Connections sind falsch.
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

S
22 Beiträge seit 2009
vor 14 Jahren

Punkt 1.) Hab verstanden was du mit Parameter meinst dadurch könnte ein "hacker" im laufenden Programm auf die Methode zugreifen und seinen MySql Befehl an den Server schicken.

Punkt 2.) Im Anhang ist der C++ Quellcode du wirst sehen man kann am Anfang eine globale Connection definieren die Verbindung erfolgt jedoch nur wenn einer der 2 Methoden aufgerufen wird. Nach erfolgreicher Beendung oder bei einer Exception wird die DB Connection wieder geschlossen.

Aber danke für die vielen Tipps das wird mir hoffentlich helfen die Klasse etwas sicherer zu machen 😉

mfg Seek

F
10.010 Beiträge seit 2004
vor 14 Jahren

zu 1) Es geht nicht nur um Sql-Injections.
Was ist z.b bei der Übergabe von Namen wie "Jean d'arc"

Und genauso wie in dem Code macht man es nicht.

Aber das wird dir erst auf die Füsse fallen, wenn Du mal mehr als einen Befehl
gleichzeitig absetzen musst, oder mit Threads arbeitest.

Und statt den ConnectionString so zusammenzusetzen kannst Du auch den MySqlConnectionStringBuilder benutzen.

Und

if(!System::String::Compare(System::Convert::ToString(mysqlHandle->State),"Open")) 

Ist auch nicht sinnvoll:


if(mysqlHandle->State == ConnectionState.Open))

Wenn ich C++ lesen muss, weiss ich immer warum ich bei .NET auf c# umgestiegen bin.
Die Syntax sieht schrecklich aus.

Dein ganzer C++ Code ist in C# dann


using  System;
using  MySql.Data.MySqlClient;


namespace xDot 
{
	namespace mysqlHandling 
	{

		public class mysql
		{
			
			public mysql(string servername, string username, string password, string db, int timeOut)
			{ 
				server=servername;
				user=username;
				pass=password; 
				dbname=db; 
				timeout=timeOut; 
			}
			protected string server;	//Server Var
			protected string user;		//User Var
			protected string pass;		//Pass Var
			protected string dbname;	//DBName Var
			protected int timeout;		//Timeout var
			
			
			public void ExecuteNonQuery(string mysqlQuery)
			{
				ExecuteNonQuery(mysqlQuery,null);
			}
			public void ExecuteNonQuery(string mysqlQuery, Dictionary<string,object> param )
			{
				using( MySqlConnection con = new MySqlConnection( GenerateConnectionString()))
				{
					con.Open();
					using( MySqlCommand cmd = new MySqlCommand(mysqlQuery,con) )
					{
						FillParameter( cmd,  param );
						cmd.ExecuteNonQuery();
					}
				}
			}
			public int ExecuteDataTable(DataTable dt,string mysqlQuery)
			{
				return ExecuteDataTable(dt,mysqlQuery, null);
			}
			
			public int ExecuteDataTable(DataTable dt,string mysqlQuery, Dictionary<string,object> param)
			{
				using( MySqlDataAdapter adap = new MySqlDataAdapter( mysqlQuery, GenerateConnectionString()))
				{
					FillParameter(adap.SelectCommand,  param );					
					adap.Fill( dt );
					return dt.Rows.Count;
				}
			}
			protected virtual string GenerateConnectionString()
			{
				MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder();
				cb.Server = server ;
				cb.UserID = user ;
				cb.Password = pass ;
				cb.Database = dbname ;
				cb.ConnectionTimeout = timeout ;
				return cb.ToString()
			}
			protected void FillParameter(MySqlCommand cmd, Dictionary<string,object> param )
			{
				if( param == null )
					return;
				foreach( var kv in param )
				{
					cmd.Parameters.AddWithValue( kv.Key, kv.Value );
				}
			}
		}
	}
}

( Nur so eingehackt, ohne IDE und Funktionstest)

Statt also die Daten in ein StringArray zu lesen benutze lieber eine dataTable.

S
22 Beiträge seit 2009
vor 14 Jahren

Und

if(!System::String::Compare(System::Convert::ToString(mysqlHandle->State),"Open"))   

Ist auch nicht sinnvoll:

  
if(mysqlHandle->State == ConnectionState.Open))  
  

Hast voll kommen recht gg

Ich kenn noch nicht sehr viele Standard Techniken des Programmierens ich hatte da wohl meine Kenntnisse genutzt um eine Lösung zu finden sprich - Arrays (Wollte eigentlich mehrdimensionala Arrays zuerst verwenden), aber das mit den Data Tables ist eine sehr gute Idee und ConnectionStirngbuilder hab ich auch noch nicht gekannt.

Ich glaub ich werd das ganze mal in C# neu schreiben und wenns fertig ist post ichs mal, du kannst mich dann gerne verbessern 😁

Aja bei der c++ klasse, wenn ein Falscher MySql String verwendet wird, gibts ne Exeption die wird dann mit dem throw weitergegeben.

mfg seek

F
10.010 Beiträge seit 2004
vor 14 Jahren

Auch hier wird die Exception geworfen.

Wenn man sie nicht wegfängt, wird sie "durchgereicht" bis es jemand tut.