Laden...

INSERT in mySql

Erstellt von chrische5 vor 15 Jahren Letzter Beitrag vor 15 Jahren 9.210 Views
C
chrische5 Themenstarter:in
489 Beiträge seit 2007
vor 15 Jahren
INSERT in mySql

verwendetes Datenbanksystem: mySql

Hallo

Ich mache nun endlich meine ersten Datenbankschritte udn stosse gleich auf ein Problem. Ich möchte neue Daten zu einer Tabelle hinzufügen. Ich probiere das so:


try
{
const string commandText =
"INSERT INTO rh_news (news_ID, news_Schlagzeile, news_Inhalt, news_Datum, news_Autor) Values (?p1, ?p2, ?p3, ?p4, ?p5)";
var insertCommand = new MySqlCommand
{
CommandText = commandText,
Connection = connection
};

insertCommand.Parameters.Add("p1", MySqlDbType.Int32, 7);
insertCommand.Parameters.Add("p2", MySqlDbType.VarChar, 200, textBoxHeadline.Text);
insertCommand.Parameters.Add("p3", MySqlDbType.Text, 200, "richTextBoxContent.Text";);
insertCommand.Parameters.Add("p4", MySqlDbType.Date, 200, dateTimePicker1.ToString());
insertCommand.Parameters.Add("p5", MySqlDbType.VarChar, 150, "textBoxAuthor.Text";);
connection.Open();
insertCommand.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
connection.Close();
}

Leider bekomme ich dabei eine Exception:

------------------------------------------------------Column 'news_Schlagzeile' cannot be null---------------------------OK --------------------------- die ich mir nicht erklären kann. Was mache ich hier falsch?Danke für eure Hilfe.chrische

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo chrisch5,

hat textboxHeadLine keinen Text drinnen?

Gruss
Michael

C
chrische5 Themenstarter:in
489 Beiträge seit 2007
vor 15 Jahren

Hallo

Da steht definitiv was drinne, weil ich vorher das stehen habe:

 if (textBoxAuthor.Text == string.Empty)
{
MessageBox.Show("Sie müssen das Feld \"Autor\" ausfüllen.");
return;
}

if (textBoxHeadline.Text == string.Empty)
{
MessageBox.Show("Sie müssen das Feld \"Schlagzeile\" eingeben.");
return;
}

if(richTextBoxContent.Text == string.Empty)
{
MessageBox.Show("Sie müssen das Feld \"Nachricht\" ausfüllen.");
return;
}
 

chrische

D
496 Beiträge seit 2005
vor 15 Jahren

es gibt einen unterschied zwischen null und string.empty

teste doch mal folgendes

insertCommand.Parameters.Add("p2", MySqlDbType.VarChar, 200, "test");

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

C
chrische5 Themenstarter:in
489 Beiträge seit 2007
vor 15 Jahren

Hallo

Da kommt die gleiche Meldung.

chrische

X
1.177 Beiträge seit 2006
vor 15 Jahren

huhu,

deine Exception sagt aber, dass der Parameter NULL ist. Dies wiederum (mit deinem Code) bedeutet wohl, dass "textBoxHeadline.Text" Null ist und nicht string.Empty.

Imho gibts hier gleich 2 Dinge zu beachten:

  1. Mit dem Debugger einfach mal durchgehen und sich die Variablen angucken.
  2. mit string.IsNullOrEmpty() testen
  3. die Anführungszeichen in deinem ersten Code-Schnipsel bei "richTextBoxContent.Text" und "textBoxAuthor.Text" entfernen, sonst kommt noch die nächste Frage.

🙂

Xynratron

Edit: zu langsam. Aber teste nach der Zuweisung mal, ob P2.Value wirklich gesetzt ist.

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

D
496 Beiträge seit 2005
vor 15 Jahren

um auszuschließen das es an der db liegt kannst du auch noch mal das testen:

"INSERT INTO rh_news (news_ID, news_Schlagzeile, news_Inhalt, news_Datum, news_Autor) Values (?p1, 'test', ?p3, ?p4, ?p5)";

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

3.825 Beiträge seit 2006
vor 15 Jahren

Hallo Crische,

wenn eine Spalte in MySql als NOT NULL definiert ist dann darf sie beim Abspeichern nicht NULL sein.

Gib mal in MySQL ein :

show full columns from TABLE

Grüße Bernd

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

D
496 Beiträge seit 2005
vor 15 Jahren

so wie ich ihn verstehe soll die spalte ja auch not null sein, deswegen fängt er ja auch schon vor dem übergeben ab ob der user vergessen hat einen wert einzugeben

if (textBoxAuthor.Text == string.Empty)
{
MessageBox.Show("Sie müssen das Feld "Autor" ausfüllen.");
return;
}

sein problem ist warum der value null ist obwohl er es nicht sein sollte.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

M
103 Beiträge seit 2006
vor 15 Jahren

Hallo chrische5,

AFAIK müssen die Parameter genauso heißen, wie die Platzhalter. Also:

insertCommand.Parameters.Add("?p2", MySqlDbType.VarChar, 200, textBoxHeadline.Text);

PS1: Verwende 'dateTimePicker1.Value' statt 'dateTimePicker1.ToString()', sonst kracht es auch.

PS2: Bitte verwende 'var' nur dort, wo es (aus Designgründen) nicht anders geht, da es die Lesbarkeit deines Codes unnötig erschwert.

mfg Maddy

C
chrische5 Themenstarter:in
489 Beiträge seit 2007
vor 15 Jahren

Hallo

Vielen Dank für die schnelle Hilfe, aber es klappt immer noch nicht.

 if (string.IsNullOrEmpty(textBoxAuthor.Text))
{
MessageBox.Show("Sie müssen das Feld \"Autor\" ausfüllen.");
return;
}

if (string.IsNullOrEmpty(textBoxHeadline.Text))
{
MessageBox.Show("Sie müssen das Feld \"Schlagzeile\" eingeben.");
return;
}

if(string.IsNullOrEmpty(richTextBoxContent.Text))
{
MessageBox.Show("Sie müssen das Feld \"Nachricht\" ausfüllen.");
return;
}

try
{
const string commandText =
"INSERT INTO rh_news (news_ID, news_Schlagzeile, news_Inhalt, news_Datum, news_Autor) Values (?p1, ?p2, ?p3, ?p4, ?p5)";
var insertCommand = new MySqlCommand
{
CommandText = commandText,
Connection = connection
};

insertCommand.Parameters.Add("?p1", MySqlDbType.Int32, 7);
insertCommand.Parameters.Add("?p2", MySqlDbType.VarChar, 200, textBoxHeadline.Text);
insertCommand.Parameters.Add("?p3", MySqlDbType.Text, 200, richTextBoxContent.Text);
insertCommand.Parameters.Add("?p4", MySqlDbType.Date, 200, dateTimePicker1.ToString());
insertCommand.Parameters.Add("?p5", MySqlDbType.VarChar, 150, textBoxAuthor.Text);
connection.Open();
insertCommand.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
connection.Close();
}
 

Auch der Debugger zeigt, dass die der Inhalt weder leer noch null ist. Ich habe keine Ahnung, was hier los ist.

chrische

1.200 Beiträge seit 2007
vor 15 Jahren

Bei MySQL hab ich für die Parameter immer nur "?" verwendet und keine Namen vergeben, das war aber über ODBC. Ich weiss, dass das auch bei OleDB Probleme macht.

Probiers mal mit dem "@" Zeichen. So stehts auch im C# Samples hier.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

F
10.010 Beiträge seit 2004
vor 15 Jahren

@GMLOD:
Nein MySql verlangt '?Name'.

@chrische5:
Aber Du benutzt immernoch einen String statt dem DateTime.
Auch solltest Du AddWithValue und den richtigen Datentyp benutzen, dann
entscheidet der MySql-Provider welche Felder wie gesetzt werden.
Auch solltest Du die erweiterte Initialisierungssyntax nur benutzen, wenn es
keine entsprechenden Construktor gibt.

Und die richtigen Codetags erleichtern das lesen.


try
{
const string commandText =
"INSERT INTO rh_news (news_ID, news_Schlagzeile, news_Inhalt, news_Datum, news_Autor) Values (?p1, ?p2, ?p3, ?p4, ?p5)";
MySqlCommand insertCommand = new MySqlCommand( commandText,connection);

insertCommand.Parameters.AddWithValue("?p1", 7);
insertCommand.Parameters.AddWithValue("?p2", textBoxHeadline.Text);
insertCommand.Parameters.AddWithValue("?p3", richTextBoxContent.Text);
insertCommand.Parameters.AddWithValue("?p4", dateTimePicker1.Value);
insertCommand.Parameters.AddWithValue("?p5", textBoxAuthor.Text);
connection.Open();
insertCommand.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
connection.Close();
}

1.200 Beiträge seit 2007
vor 15 Jahren

Bei MySQL muss man laut Manual aber noch

insertCommand.Prepare();

aufrufen.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

C
chrische5 Themenstarter:in
489 Beiträge seit 2007
vor 15 Jahren

Hallo FZelle,

vielen Dank für deinen Code. Ich habe ihn genauso übernommen und es klappt. Die Daten werden eingetragen und es wird keine Exception geworfen.

chrische

F
10.010 Beiträge seit 2004
vor 15 Jahren

@GMLOD:
Ja, behaupten die, geht aber auch ohne.