Laden...

MySQL statt MS SQL

Erstellt von Nightline vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.859 Views
N
Nightline Themenstarter:in
49 Beiträge seit 2005
vor 18 Jahren
MySQL statt MS SQL

Hallo,

ich möchte gerne eine bestehende Webapplikation (geschrieben in C#), die derzeit in Verbindung mit einem MS SQL Server läuft, mit MySQL einsetzen.

Inwieweit muss ich hier Anpassungen vornehmen, auf was muss ich aufpassen?

N
4.644 Beiträge seit 2004
vor 18 Jahren

Mit was hast Du denn den DB Zugriff entwicklelt, mit den System.Data.SqlClient Klassen? Wenn ja dann musst Du diese Klassen austauschen ( Forum Suche nach MySqlConnector ). Wenn Du SQL Queries im Source baust, dann müssen diese natürlich MySql konform sein, also ohne T-SQL.

F
529 Beiträge seit 2003
vor 18 Jahren

Je nach dem welche Funktionen beim MS Sql benutzet wurden, wirst du viel Vergnügen haben...

Je nach dem, wie die Daten aus der Datenbank kommen, genügt es, den Klassennamen zu ändern. Wenn du Pech hast, musst du aber einiges neu machen. Es kommt darauf an, welche Funktionen vom SqlServer verwendet wurden und ob vorher schon jemand dran gedacht hat, das Programm evtl später auf eine neue Datenbank zu portieren.

Besuchen sie das VisualC++ - Forum

N
Nightline Themenstarter:in
49 Beiträge seit 2005
vor 18 Jahren

Ja Noodles, ich benutze die SqlClient-Klassen!

Hmm, also ich zeige euch mal die Methode mit dem längsten SELECT-Command, da seht ihr sicher gleich ob die verwendeten Befehle in MySQL Probleme bereiten:


static public DataSet GetFilme(ref string error)
		{
			try
				{
					conn.Open();
					SqlCommand com = new SqlCommand("SELECT TOP 100 PERCENT SUM(t_cc_rating.rating) AS Summe, COUNT(*)-1 AS Anzahl, ROUND(SUM(dbo.t_cc_rating.rating) / COUNT(*), 0) AS Stern, t_cc_filme.filmID, t_cc_filme.titel, t_cc_filme.bild, t_cc_filme.beschreibung, t_cc_filme.link, t_cc_filme.filmklein, t_cc_filme.filmgross FROM t_cc_rating INNER JOIN t_cc_filme ON t_cc_filme.filmID = t_cc_rating.filmID GROUP BY t_cc_filme.filmID, t_cc_filme.titel, t_cc_filme.bild, t_cc_filme.beschreibung, t_cc_filme.link, t_cc_filme.filmklein, t_cc_filme.filmgross",conn);
					SqlDataAdapter adapter = new SqlDataAdapter(com);
					DataSet ds = new DataSet();
					adapter.Fill(ds, "Filme");
				
					return ds;
				}
				catch(SqlException ex)
				{
					error = ex.Message;
					return null;
				}
				finally
				{
					conn.Close();
				}
		}

Desweiteren wichtig zu wissen: Wie sieht es mit Parametern und dem Befehl @@IDENTITY aus:


static public int SetEntry(string titel, string bildpfad, string beschreibung, string link, 
			string filmklein, string filmgross, ref string error)
		{
			try 
			{
				conn.Open();

				SqlCommand com = new SqlCommand("INSERT INTO t_cc_filme(titel, bild, beschreibung) " +
					"VALUES (@titel, @bildpfad, @beschreibung)",conn);
				com.Parameters.Add("@titel",SqlDbType.NVarChar).Value = titel;
				com.Parameters.Add("@bildpfad",SqlDbType.NVarChar).Value = bildpfad;
				com.Parameters.Add("@beschreibung",SqlDbType.NVarChar).Value = beschreibung;
				com.ExecuteNonQuery();
				com.CommandText = "SELECT @@IDENTITY";
				int last_id = Convert.ToInt32(com.ExecuteScalar());

				SqlCommand com1 = new SqlCommand("INSERT INTO t_cc_rating(rating, ip, filmID) " +
					"VALUES (0, @ip, @filmID)",conn);
				com1.Parameters.Add("@ip",SqlDbType.NVarChar).Value = "0.0.0.0";
				com1.Parameters.Add("@filmID",SqlDbType.Int).Value = last_id;
				com1.ExecuteNonQuery();

				return 0;
			}
			catch(SqlException ex)
			{
				error = ex.Message;
				return -1;
			}
			finally
			{
				conn.Close();
			}
		}

Ok, hoffe ihr könnt mir weitere Hoffnung machen! 😉 Leider war bei Projektbeginn nicht damit zu rechnen, dass eine andere Datenbank genommen werden könnte...

S
1.047 Beiträge seit 2005
vor 18 Jahren

das beste wäre, du schaust dir mal die dokumentation vom mysql server und mssql server bezüglich abweichung vom standard sql an, dann wirst du sehr schnell rausfinden was du ändern mußt

mysql hat z.b. kein "top", dafür aber sowas wie "limit"
je nachdem was für eine mysql version bzw. tabellenformat benutzt hast du transaktionen, subqueries etc. pp.

da hilft nur dokus zwecks features vergleichen, oder aber im internet mal vergleichsseiten zu suchen

68 Beiträge seit 2005
vor 18 Jahren

@@identify wird z.b. auch nicht unterstuetzt -> sieht nicht gut aus

F
529 Beiträge seit 2003
vor 18 Jahren

Bei Mysql geht das doch genauso. Da heißt es halt nicht @Identity sondern Last_Insert_Id() (vlg http://dev.mysql.com/doc/refman/4.0/de/miscellaneous-functions.html)

Übrigens kann man sich einen Command in deinem Quelltext evtl. sogar sparen, da für jede Verbindung das Ergebnis des letzten Einfügevorgangs in der Variablen @Identity oder der Funktion Last_Insert_Id() gespeichert wird. Daher funktioniert das Auswählen dieser Variablen oder Funktion auch ohne den Namen einer Tabelle anzugeben. Jedenfalls kann man diese Variablen auch noch im nächsten Kommando weiterverwenden....

Bearbeitet: Ich habe ca. 57 Rechtschreib- Grammatikschreibfehler entfernt.....

Besuchen sie das VisualC++ - Forum

N
Nightline Themenstarter:in
49 Beiträge seit 2005
vor 18 Jahren

Ok... so weit, so schlecht. 😉

Danke für eure Hinweise und Tipps, werde das nochmal in Ruhe durchgehen müssen.