verwendetes Datenbanksystem: <MS Access 2003>
verwendete Arbeitsumgebung: Visual Studio 2005
verwendete Sprache: c# 😉
Hi,
ich versuche gerade ein Programm zu schreiben in dem in Daten aus einer DB auslesen, ändern und neue dazuspeichern kann.
Beim neuen Datensatz speichern Bringt er mir die Fehlermeldung "Syntaxfehler in der INSERT INTO Anweisung".
Ich habe aus Frust schon den Quellcode aus einem funktionierenden (selber getestet) Beispiel Abgetippt und an den entsprechenden Stellen angepasst.
Ich weis nicht woran es liegt. Vielleicht habe ich die Datenbank falsch erstellt in Access?
Hier der Code:
private void buttonSpeichern_Click(object sender, EventArgs e)
{
// Variante 1 A
//
//*
OleDbConnection conn;
OleDbCommand cmd;
OleDbDataAdapter da;
DataSet ds;
DataTable dt;
DataView dv;
conn = new OleDbConnection(ConnStr);
cmd = new OleDbCommand("SELECT * FROM Daten", conn);
da = new OleDbDataAdapter(cmd);
ds = new DataSet();
conn.Open();
da.Fill(ds, "Daten");
conn.Close();
dt = ds.Tables["Daten"];
dv = ds.DefaultViewManager.CreateDataView(dt);
dv.Sort = "ID";
dataGridViewTest.DataSource = dv;
string insSQL = "INSERT INTO Daten (User, Type, Genre, Titel, Bewertung, Jahr, Interpret, Kommentar) " +
"VALUES (@p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9)";
//string insSQL = "INSERT INTO Daten (ID) VALUES (@p1)";
//string insSQL = "INSERT INTO Daten (ID, User) VALUES (@p1, @p2)";
//OleDbCommand cmd = new OleDbCommand(insSQL, conn); // Test
cmd = new OleDbCommand(insSQL, conn);
//*
cmd.Parameters.Add("@p2", OleDbType.VarChar, 50, "User");
cmd.Parameters.Add("@p3", OleDbType.VarChar, 50, "Type");
cmd.Parameters.Add("@p4", OleDbType.VarChar, 50, "Genre");
cmd.Parameters.Add("@p5", OleDbType.VarChar, 50, "Titel");
cmd.Parameters.Add("@p6", OleDbType.Integer, 50, "Bewertung");
cmd.Parameters.Add("@p7", OleDbType.Integer, 50, "Jahr");
cmd.Parameters.Add("@p8", OleDbType.VarChar, 50, "Interpret");
cmd.Parameters.Add("@p9", OleDbType.VarChar, 50, "Kommentar");
//*/
da.InsertCommand = cmd;
DataRow rw = dt.NewRow();
//*
rw[1] = labelUser.Text;
rw[2] = comboBoxType.Text;
rw[3] = comboBoxGenre.Text;
rw[4] = textBoxTitel.Text;
rw[5] = Convert.ToInt32(textBoxBewertung.Text);
rw[6] = Convert.ToInt32(textBoxJahr.Text);
rw[7] = textBoxInterpret.Text;
rw[8] = textBoxKommentar.Text;
//*/
dt.Rows.Add(rw);
//da.Update(dt);
//*
try
{
da.Update(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
conn.Close();
//*/
}
in meiner Datenbank sind alle Felder auf TEXT eingestellt, bis auf die Erste Spalte, ID, die ist auf Zahl und als Primärschlüssel definiert.
Ich danke für eure Hilfe schon mal im Vorraus.
Kritik an meinem Quellcode ist auch erwünscht, so lernt man ja 🙂
Im Anhang findet Ihr mein Projekt. Das Beispiel ist zu groß und ich kann es leider nicht Hochladen. Bei Anfrage schicke ich es aber gerne per Mail.
Das Beispiel ist aus dem Buch
Visual C#.NET
Kochbuch
Walter Doberenz
Thomas Kowalski
Hanser Verlag
€dit: Es geht um Beispiel 5.20
Gruß Tom
Update:
Hab ein paar kleine Fehler ausgebessert, geht aber immer noch nicht. Datenanhang ist aktualisiert
LÖSUNG:
Spaltenname in der Access DB darf nicht 'User' heißen
Anhang gelöscht
Der Fehler sitzt meistens vor der Anwendung
Bei OleDb werden Parameter im Befehlstext (glaube ich) nur durch '?', aber nicht mit Namen angegeben. Jürgen
Bei OleDb werden Parameter im Befehlstext (glaube ich) nur durch '?', aber nicht mit Namen angegeben. Jürgen
meist du damit
string sql = "INSERT INTO Daten (ID, User) VALUES (?, ?)";
Der Fehler sitzt meistens vor der Anwendung
Hallo Xyero
"VALUES (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,)";
hier ist m.E. das letzte Komma zuviel des Guten,
ara
Hallo Xyero
"VALUES (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,)";
hier ist m.E. das letzte Komma zuviel des Guten,
ara
danke, aber daran liegt es nicht 😭
Der Fehler sitzt meistens vor der Anwendung
vielleicht
"VALUES ('@p1','@p2','@p3','@p4','@p5','@p6','@p7','@p8','@p9')"
?
Ich kenn mich in diesem Themengebiet aber nicht sooo gut aus..
Gruß Dennis
vielleicht
"VALUES ('@p1','@p2','@p3','@p4','@p5','@p6','@p7','@p8','@p9')"
?
Ich kenn mich in diesem Themengebiet aber nicht sooo gut aus..Gruß Dennis
Hi, hab ein paar kleinigkeiten noch geändert, den Code oben und den anhang geupdated.
Ne andere Frage: der BeispielCode wurde mit Visual Studio 2003 erstellt. Ich benutze Visual Studio 2005
Der Fehler sitzt meistens vor der Anwendung
Ein großes Danke, das hat das Problem gelöst
Zum verständniss:
Welchert Teil hat User als reserviertes Wort?
SQL, C# oder MS ACCESS?
Der Fehler sitzt meistens vor der Anwendung
Du stellst die Abfrage ja gegen MS ACCESS. Also wird wohl MS ACCESS User als reserviertes Wort betrachten.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Danke. Damit ist das Problem gelößt und die Sache erledigt
Der Fehler sitzt meistens vor der Anwendung