Laden...

Bin ich zu Blöd für MySQL ?

Erstellt von snoopy vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.884 Views
S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren
Bin ich zu Blöd für MySQL ?

Hi,
ich wollte mal wieder mit C# anfangen und ne kleine MySQL Anwendung schreiben.

Zum einen bekomm ich immer die Fehlermeldung, das ich in meinem INSERT INTO Query nen Syntax Fehler habe:


try
			{
				con = new MySql.Data.MySqlClient.MySqlConnection();
				con.ConnectionString = conString;
				MySql.Data.MySqlClient.MySqlCommand cmd;
				cmd = new MySql.Data.MySqlClient.MySqlCommand();
				cmd.Connection = con;
				
				con.Open();
				string test = "stefan";


				
				cmd.CommandText = "INSERT INTO table VALUES("+test+")";


				cmd.ExecuteNonQuery();
				MessageBox.Show("Erfolgreich");
			}
			catch(MySql.Data.MySqlClient.MySqlException ex)
			{
				MessageBox.Show(ex.Message);
				
			}

zum andern, wieso muss ich jedesmal MySql.Date dafor schrieben? Ich hab doch oben weiter mit using den namespace eingebunden.


using MySql.Data;

Danke für die Hilfe.

3.825 Beiträge seit 2006
vor 16 Jahren

Hallo Snoopy,

Bin ich zu Blöd für MySQL ?

Weiss ich nicht !

😉

In deinem SQL-Statement ist ein Fehler. Schau mal hier nach :

http://dev.mysql.com/doc/refman/5.1/de/index.html

Am Anfang schreibe einfach :

using MySql.Data.MySqlClient;

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren

selbst diese änderung bringt nichts..

immernoch der gleiche Fehler.



string test = "stefan";
				
cmd.CommandText = "INSERT INTO table(name) VALUES("+test+")";


G
497 Beiträge seit 2006
vor 16 Jahren

ohne die Fehlermeldung vermute ich einfach mal die fehlenden Anführungszeichen im zusammengebastelten SQL-Kommando.


string test = "stefan";
				
cmd.CommandText = "INSERT INTO table(name) VALUES('"+test+"')";

Edit: dieser Befehl würde in die Tabelle "table" eine Zeile einfügen und den Wert "stefan" in das Feld "name" einsetzen.

S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren

die genaue Fehlermeldung lautet:


You habe an error in your SQL syntax; check the manuel that corresponds to your MySQL server version for the right syntax tu usw near 'table(name) VALUES('stefan') at line 1

ich versteh nciht was daran jetzt falsch ist, mein code sieht nun so aus



con.Open();
			string test = "stefan";
                
cmd.CommandText = "INSERT INTO table(name) VALUES('"+test+"')"; 
				cmd.ExecuteNonQuery();

3.825 Beiträge seit 2006
vor 16 Jahren

Leerzeichen zwischen 'table' und '(name)' und nach VALUES ?

INSERT INTO table (name) VALUES ('test')

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
18 Beiträge seit 2007
vor 16 Jahren

Vielleicht 😁

Im Manual steht folgendes Beispiel:
mysql> INSERT INTO haustier
-> VALUES ('Puffball','Diane','Hamster','w','1999-03-30',NULL);

und das sieht gar nicht nach insert into table(haustier) ...

aus.

Hi ha ho, jetzt simmer widder froh 🙂

K
95 Beiträge seit 2007
vor 16 Jahren

Hallo,

Problem schon gelöst?

Eigentlich reicht meines Erachtens nach schon

Insert into <tableName> (Spalte1) values (test)

tableName = Name der Tabelle
Spalte1 = Name der Spalte der Tabelle

Gruß

S
489 Beiträge seit 2007
vor 16 Jahren

table ist ein reserviertes Wort! 😉 Guggst Du: http://dev.mysql.com/doc/refman/5.1/de/reserved-words.html

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

@SeboStone:
Ich denke mal, dass snoopy das bekannt ist. table ist ein Platzhalter. Genauso wie das erste Feld wohl kaum "spalte1" heißen wird ...

Nobody is perfect. I'm sad, i'm not nobody 🙁

S
489 Beiträge seit 2007
vor 16 Jahren

_Original von tom-essen_table ist ein Platzhalter. Genauso wie das erste Feld wohl kaum "spalte1" heißen wird ...

Na wer weiss, ich hatte schon solche Probleme mit reservierten Wörtern. 🙂

3.825 Beiträge seit 2006
vor 16 Jahren

Nochmal zum Mitschreiben :


// falsch :
cmd.CommandText = "INSERT INTO table(name) VALUES('"+test+"')";

// richtig :

cmd.CommandText = "INSERT INTO adressen (name) VALUES ('"+test+"')";


Leerzeichen beachten !

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren

sehr merkwürdig. Ich starte heute meinen PC und versuche es nochmal auszuführen und es klappt. Mh vielleicht nen Bug von SHarpdevelop 2.2 ?
Naja nun klappt es auf jedenfall. Danke trotzdem.

S
489 Beiträge seit 2007
vor 16 Jahren

Hast Du in letzter Zeit irgendwas installiert ohne den Rechner neu zu booten? Kann manchmal passieren, dass ein Neustart notwendig ist, ein Setup das aber nicht fordert.

S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren

mh eigentlich nicht..

Aber ich habe ein anderes Problem.

Ich möchte gerne innerhalb einer Methode zweimal Daten von dem MySQL Server mit dem MySqlDataReader object lesen. Doch leider klappt es nur einmal.

der code


MySqlDataReader reader = command.ExecuteReader();

while(reader.read())
{
//verarbeitung
}
reader.close();

command.CommandText = "SELECT * FROM tabelle";
command.ExecuteReader();
while(reader.read())
{
  //Verarbeitung
}

mh mein Programm bricht beim beim zweiten "executereader" ab mit der meldung, das auf der Verbindung schon gelesen wird, aber ich hab es doch mti reader.close() geschlossen, oder ist das falsch? Bzw. wie muss ich ihn richtig schließen?

Grüße

Stefan

R
317 Beiträge seit 2006
vor 16 Jahren

Das Problem ist genau das, dass der reader geschlossen ist.

Daher kann er nicht mehr lesen, weil er eben geschlossen ist.


MySqlDataReader reader = command.ExecuteReader();

while(reader.read())
{
//verarbeitung
}
reader.close();

command.CommandText = "SELECT * FROM tabelle";

// Du musst dem reader den neuen Command zuweisen:
// ****
reader = command.ExecuteReader();
// ****

while(reader.read())
{
  //Verarbeitung
}

lg,
daniel

S
snoopy Themenstarter:in
204 Beiträge seit 2005
vor 16 Jahren

mh geht immernoch nicht, also ich erhalte diese Fehlermeldung

There is already an open DataReader associated with this Connection which must be closed first.

und der code sieht nun genau so aus:


void MainFormLoad(object sender, EventArgs e)
		{
			MySqlCommand cmd = new MySqlCommand();
			cmd.Connection = m_con;
			cmd.CommandText = "SELECT id,name FROM kunden ORDER BY name asc";
			MySqlDataReader reader = cmd.ExecuteReader();
			
			
			
			while(reader.Read())
			{
				TreeNode node = new TreeNode();
				node.Text = reader.GetValue(1).ToString();
				node.Tag = reader.GetValue(0).ToString();
				treeView.Nodes.Add(node);				
			}			
			reader.Close();
			for(int i=0;i<treeView.Nodes.Count;i++)
			{
				cmd.CommandText = "SELECT name FROM computer WHERE kunden_id = "+treeView.Nodes[i].Tag+" ORDER BY name ASC";
				
				reader = cmd.ExecuteReader();
				while(reader.Read())
				{
					treeView.Nodes[i].Nodes.Add(reader.GetValue(0).ToString());
				}				                
			}
		}

beim zweiten executeReader bleibt er hängen mit oben genannter Fehlermeldung.

G
58 Beiträge seit 2007
vor 16 Jahren

Du schliesst ihn innerhalb der for-Schleife ja auch nicht..

L
770 Beiträge seit 2006
vor 16 Jahren

also ich finde, die Fehlermeldung sagt doch alles... oder?

this Connection which must be closed first.

also was wirst du wohl tun müssen? richtig, nach dem reader noch cmd.connection.close() 🙂

lg

lg Lion