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
Hallo chrisch5,
hat textboxHeadLine keinen Text drinnen?
Gruss
Michael
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
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."
Hallo
Da kommt die gleiche Meldung.
chrische
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:
🙂
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.
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."
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
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."
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
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
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!
@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();
}
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!
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
@GMLOD:
Ja, behaupten die, geht aber auch ohne.