Datenbank Fehler

04/05/2021 15:26 Reaper of Souls#1
Hallo,

ich bekomme bei meinem Programm immer den Fehler: Column count doesnt match value count at row 1.

Der Code:

Code:
        private void button10_Click(object sender, EventArgs e)
        {
            string insertQuery = "INSERT INTO forgottensouldb.tanks(`ID`,`Discord Name`,`Join Date`,`Character Name1`,`Realm`,`Class and Spec`,`Character Name2`,`Class and Spec2`,`Bench Player`,`Performance`,`Too late`,`Not excused Absence`,`Other notes`)VALUES('" + textBox1.Text + "', '" + textBox2.Text + "', " + textBox3.Text + textBox4.Text + "'," + textBox5.Text + textBox6.Text + "', " + textBox7.Text + textBox8.Text + "'," + textBox9.Text + textBox10.Text + "', " + textBox11.Text + textBox12.Text + "'," + textBox13.Text + "')";
            connection.Open();
            MySqlCommand command = new MySqlCommand(insertQuery, connection);

            try
            {
                if (command.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Data Inserted");
                }
                else
                {
                    MessageBox.Show("Data Not Inserted");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            connection.Close();

        }
    }
}
Das Programm: [Only registered and activated users can see links. Click Here To Register...]
Die Datenbank: [Only registered and activated users can see links. Click Here To Register...]

Kann mir da jemand weiterhelfen?
Ich finde den Fehler einfach nicht...

Vielen dank im voraus
04/05/2021 15:39 lordsill#2
Du solltest dir nochmal deine Query anschauen:
1) Du vergisst gerne mal die ' - du beginnst ohne, aber endest mit einem, z.B.:
Quote:
"', " + textBox3.Text + textBox4.Text + "',"
2) Bedenke auch, dass sowas wie textBox3.Text + textBox4.Text die beiden Texte einfach zusammenführt. Wenn also bspw. in textBox3 "abc" und in textBox4 "123" steht wäre es das selbe wie: "abc123". Wenn du jetzt die Query einfach mal so versuchst den Spalten zuzuordnen siehst du, dass du auch nicht genug Daten einfügst.
ID = textBox1
Discord Name = textBox2
Join Date = textBox3 + textBox4
Character Name1 = textBox5 + textBox6
Realm = textBox7 + textBox8
Class and Spec = textBox9 + textBox10
Character Name2 = textBox11 + textBox12
Class and Spec2 = textBox13
Und alle anderen Spalten würden keine Werte mehr bekommen. (Dies aber alles auch nur, wenn zumindest noch das fehlende ' am Anfang gesetzt worden wäre)

Aktuell kannst du dir deine Query auch als sowas vorstellen:
INSERT INTO forgottensouldb.tanks(`ID`,`Discord Name`,`Join Date`,`Character Name1`,`Realm`,`Class and Spec`,`Character Name2`,`Class and Spec2`,`Bench Player`,`Performance`,`Too late`,`Not excused Absence`,`Other notes`)VALUES('abc', 'abc', abcabc',abcabc', abcabc',abcabc', abcabc',abc')
[Wenn ich in alle Textboxen einfach nur "abc" eingeben würde]

Ich lasse mal dabei außen vor, dass dein Programm sehr anfällig für bspw. SQL-Injection ist.
04/05/2021 19:28 0x0009000#3
ich lass dir den mal hier [Only registered and activated users can see links. Click Here To Register...]


Code:
              
            var _connBuilder = new MySqlConnectionStringBuilder()
            {
                Server = "127.0.0.1",
                Database = "dbname",
                UserID = "username",
                Password = "passwort"
            };

using (var conn = new MySqlConnection(_connBuilder.ConnectionString))
            {
                conn.Open();

                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "INSERT INTO `forgottensouldb.tanks`(`id`, `value1`, `value2`) VALUES (null,  [MENTION=3453695]ValuE1[/MENTION],  [MENTION=3455287]value2[/MENTION])";
                    cmd.Parameters.AddWithValue(  [MENTION=3453695]ValuE1[/MENTION], value1);
                    cmd.Parameters.AddWithValue(  [MENTION=3455287]value2[/MENTION], value2);
                    int rowCount = cmd.ExecuteNonQuery();

                }
                conn.Close();
            }
kannst die connection und mysql commands alle in using statements kleiden, dann brauchst du dich später nicht über unnötige memory allocations aufregen und tote verbindungen. die parameter geben dir die nötige sicherheit gegen xss und gegen tippfehler falls du nicht "versehentlich" die ganze tabelle überschreiben willst. mach bitte die leerzeichen aus den spaltennamen weg


edit:
//gut das dass forum die @ value mit irgendwelchen mentions ersetzt