Laden...

[gelöst] Exception: Syntaxfehler in der INSERT INTO-Anweisung

Erstellt von Xyero vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.977 Views
X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren
[gelöst] Exception: Syntaxfehler in der INSERT INTO-Anweisung

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

J
3.331 Beiträge seit 2006
vor 16 Jahren

Bei OleDb werden Parameter im Befehlstext (glaube ich) nur durch '?', aber nicht mit Namen angegeben. Jürgen

X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

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

A
83 Beiträge seit 2007
vor 16 Jahren

Hallo Xyero

"VALUES (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,)";

hier ist m.E. das letzte Komma zuviel des Guten,

ara

X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

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

420 Beiträge seit 2007
vor 16 Jahren

vielleicht
"VALUES ('@p1','@p2','@p3','@p4','@p5','@p6','@p7','@p8','@p9')"
?
Ich kenn mich in diesem Themengebiet aber nicht sooo gut aus..

Gruß Dennis

X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

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

F
10.010 Beiträge seit 2004
vor 16 Jahren

User ist ein reserviertes Wort.

X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

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

3.511 Beiträge seit 2005
vor 16 Jahren

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)

X
Xyero Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

Danke. Damit ist das Problem gelößt und die Sache erledigt

Der Fehler sitzt meistens vor der Anwendung