2016-04-02 8 views
0

Im Versuch, entsprechen Daten in meine SQL-Datenbank einfügen, aber ich bekomme die folgende Meldung:Fehler beim Datensatz einfügen: Spaltenname oder Anzahl der übergebenen Werte nicht Tabellendefinition

„Spaltenname oder Anzahl der übergebenen Werte nicht Match Spaltendefinition“

Hier ist der Code-Schnipsel i für die Aufgabe hat geschrieben:

string sql = "INSERT INTO [dbo].[user_table] VALUES('" + NameOfUser + "," + username + "," + userPIN + "," + category + "," + BeginTimePicker.Text + "," + EndTimePicker.Text + "',@img)"; 
      SqlCommand cmd = new SqlCommand(sql, conn); 

      conn.Open(); //open connection to database 
      cmd.Parameters.Add(new SqlParameter("@img", img)); 
      cmd.ExecuteNonQuery(); //used with insert, update, delete 
      conn.Close(); 

Meine Datenbank-Tabelle sieht wie folgt aus: user_table screenshot

Irgendeine Idee, was könnte schief gehen? Ich stecke eine ganze Weile fest. Hilfe wird geschätzt. Vielen Dank.

+0

Was sind die Spalten in der Tabelle user_table? – Steve

+0

[Bobby Tables] (http://www.bobby-tables.com) wird der Party beitreten. –

+0

@Steve Ich habe einen Screenshot der Tabelle mit der gestellten Frage hochgeladen. –

Antwort

0

Sie müssen keine einfachen Anführungszeichen um jeden Einfügewert setzen? Gerade jetzt Ihre SQL wie folgt aussehen:

INSERT INTO table VALUES ('value, value2, value3') 

Sollte es nicht sein:

INSERT INTO table VALUES ('value', 'value2', 'value3') 

Mit anderen Worten, ändert Instanz "" in Ihrem Code " ''"

+0

Ich schrieb eine Einfügeabfrage in genau der gleichen Weise in einer anderen Anwendung und dort hat es gut funktioniert, so denke ich, das Problem ist nicht –

0

Sie müssen Tabellenfelder angeben, weil Sie die Spalte userid in den Werten nicht verwendet haben. Sie machen auch Fehler bei der Vorbereitung der Einfügeabfrage, überprüfen Sie bitte die vorbereitete SQL-Variable und überprüfen Sie sie auf dem Db-Management-Tool.

+0

Benutzer-ID ist als Auto-Inkrement in Sql-Server festgelegt, so dass es nicht in Einfügeabfrage angeben muss Ich vermute. Bitte korrigiere mich wenn ich falsch liege? –

+0

Wenn Sie nicht alle Spalten einfügen, müssen Sie Spalten angeben. Beispiel: INSERT INTO [dbo]. [User_table] (NameOfUser, user_name) VALUES ('name', 'nick') – mkysoft

0

Der Fehler ist selbsterklärend, aber die Lösung ist nicht einfach: Sie müssen zwei Dinge tun:

  • Es ist immer eine gute Idee, die Liste der Spalten, in denen Sie Daten einfügen angeben. Andernfalls wird Ihr Code bei der Änderung der Tabellendefinition beschädigt
  • Es ist absolut nicht akzeptabel, Abfragewerte in die Abfragezeichenfolge zu erstellen. Sie müssen parametrisierte Abfragen verwenden.

Mit diesen zwei Dingen aus dem Weg, wird Ihr Einsatz zu arbeiten.

+0

Wenn ich eine Spaltenliste festlege, bekomme ich Folgendes: Es gibt mehr Spalten in der INSERT-Anweisung als die in angegebenen Werte die VALUES-Klausel. Die Anzahl der Werte in der VALUES-Klausel muss mit der Anzahl der in der INSERT-Anweisung angegebenen Spalten übereinstimmen. Ich habe immer wieder verifiziert, dass ich Werte für alle Spalten (außer userid) zur Verfügung stellen, da es in sql automatisch erhöht wird. –

+0

@SohaibFurqan Sie müssen nur die Spalten auflisten, für die Sie Werte angeben. – dasblinkenlight

+0

Ja, ich weiß. Ich mache genau das aber immer noch fest! @dasblinkenlight –

0

Von was ich verstehe; Das Code-Snippet, das ich benutze, passt nicht zu deinem Datenbankschema.

Sie versuchen, keine Werte in die anderen Spalten in den Zeilen einzufügen. Das wäre in Ordnung, wenn Ihre Datenbank NULL erlaubt. Vielleicht solltest du das überarbeiten. Ein guter Trick wäre ein Stück Papier, um die Spaltennamen auszugeben und eine Farbe für Spalten zu haben, die Nullen nicht zulassen, während die Spalten, die Werte benötigen, eine andere Farbe haben. Dies würde Ihnen helfen, sich damit abzufinden.

Ich hatte selbst ähnliche Probleme und es wurde sehr verwirrend mit dem Einfügen in Tabellen. Meine Lösung war Gespeicherte Verfahren. Dadurch wurde die Komplexität meiner Strings auf einen Standard-String reduziert. Dies machte es viel einfacher zu folgen und reduzierte meine Fehler dramatisch. Außerdem können Sie den SQL-Code testen, um sicherzustellen, dass er genau das tut, was Sie tun möchten, bevor Sie fortfahren und eine andere Sprache zum Implementieren verwenden können.

Punkt, ich würde nie sql verwenden, wo Sie es als String-Namen haben. Es ist zu nah am Reservierten Wort und obwohl du ein kleines Programm machst; Wenn Sie es vergrößern, könnten Sie sich auf der ganzen Linie einmischen. Versuche dies.

String sqlInsertString = "INSERT INTO [dbo].[user_table] VALUES('" + NameOfUser + "," + username + "," + userPIN + "," + category + "," + BeginTimePicker.Text + "," + EndTimePicker.Text + "',@img)"; 
SqlCommand cmd = new SqlCommand(sqlInsertString, conn); 

Es macht es viel einfacher zu folgen.

Es ist leicht, jemanden zu schlagen, aber ich glaube, dass, wenn es eine schlechte Frage ist, anhalten und die andere Person helfen mit, wie eine Frage zu strukturieren,

Nur eine kurze bearbeiten

Wenn die ID auf auto increment gesetzt ist, gibt es dort keine Probleme. Ich würde niemals Nullen in meinem Primärschlüssel zulassen.

In Bezug auf den Rest Ihrer Tabelle überprüfen Sie Ihre Testdaten, um zu sehen, ob Sie einen Wert haben, der optional sein kann, dann sollte das natürlich null sein.

+0

Benutzer-ID wird als automatisches Inkrement in SQL-Server festgelegt, so dass es nicht erforderlich ist, es in der Abfrage einzufügen, denke ich. Ansonsten glaube ich, dass ich einen Wert für jede Spalte eingeben werde. Bitte korrigiere mich wenn ich falsch liege? –

Verwandte Themen