2017-01-08 3 views
1

Ich erhalte diesen Fehler, wenn ich versuche, eine neue Person zu meiner Listbox und in meine Datenbank hinzuzufügen.C# Spaltenname oder Anzahl der angegebenen Werte stimmt nicht mit dem Tabellendefinitionsfehler überein

Mein Code:

public void AddSpeler(string name, string club) 
     { 




     conn.Open(); 


      Speler speler = new Speler(); 
      speler.Name = name; 
      speler.Club = club; 


      string query = "INSERT INTO Speler OUTPUT Inserted.ID VALUES ('" + speler.Name + "', '" + speler.Club + "')"; 
      SqlCommand cmd = new SqlCommand(query, conn); 


      speler.ID = (int)cmd.ExecuteScalar(); 

      conn.Close(); 
     } 

Ich erhalte den Fehler auf Seiten:

"speler.ID = (int)cmd.ExecuteScalar(); 

Und ja, ich habe meine Primärschlüssel (ID) um eins zu erhöhen.

+1

Zuerst Parameter und keine Strings verketten, zweite verwenden sollten, wenn Sie die Spaltennamen nicht angeben, dann sollten Sie einen Wert für jede Spalte in der Datentabelle – Steve

Antwort

2

Wie im obigen Kommentar erwähnt, sollten Sie keine sql-Befehle schreiben, die Zeichenfolgen verketten. Dies ist bekanntermaßen eine Quelle von Fehlern und ein großes Sicherheitsrisiko genannt Sql Injection.

Der zweite zu reparierende Punkt ist die verwendete Syntax. In einer INSERT INTO-Anweisung sollten Sie die Spalte angeben, die den eingegebenen Werten entspricht. Wenn Sie nicht die Spaltennamen liefern, dann müssen Sie die Werte für jede Spalte in der Tabelle und in der genauen Reihenfolge schreiben, in der die Spalten

void AddSpeler(string name, string club) 
{ 
    conn.Open(); 
    Speler speler = new Speler(); 
    speler.Name = name; 
    speler.Club = club; 
    string query = @"INSERT INTO Speler (Name, Club) OUTPUT Inserted.ID 
        VALUES (@name, @club)"; 
    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = speler.Name; 
    cmd.Parameters.Add("@club", SqlDbType.NVarChar).Value = speler.Club; 
    speler.ID = (int)cmd.ExecuteScalar(); 
    conn.Close(); 
} 

Hier definieren Ich gehe davon aus, dass Ihre Tabelle Speler die Spalten enthält Name und Club, natürlich ändern Sie sie zu Ihren tatsächlichen Namen.

EDIT
Wenn Sie diese Methode von einer anderen Klasse aufrufen wollen, müssen Sie es so alle Anrufer öffentlich machen, dass eine Instanz der Klasse erstellt, wo die Methode definiert ist es verwenden können.

Übrigens, der Code in AddSpeler macht einige Dinge, die verschwendet werden, wenn Sie sie nicht zu Ihrem Aufrufer zurückgeben (void ??) Möglicherweise möchten Sie die im Code erstellte Instanz der Speler-Klasse so ändern das Verfahren zu

public Speler AddSpeler(string name, string club) 
{ 
    try 
    { 
     conn.Open(); 
     Speler speler = new Speler(); 
     ..... 

     .... 
     return speler; 
    } 
    catch(Exception ex) 
    { 
     // display the ex.Message to know why your code fails 
     MessageBox.Show(ex.Message); 
     conn.Close(); 
     return null; // no Speler returned if code fails 
    } 
} 
+0

liefern muss ich etwas ändern von 'SqlDbType.NVarChar', weil jetzt ein Fehler auftritt, dass SqlDbType in diesem aktuellen Kontext nicht vorhanden ist. –

+0

SqlDbType ist eine Enumeration, die im Namespace System.Data definiert ist. Wahrscheinlich müssen Sie nur die angeforderten _ using System.Data; _ am Anfang Ihrer Datei hinzufügen – Steve

+0

Allerdings sollte der NVarChar der Definition Ihrer Spalte entsprechen. Normalerweise werden die Zeichenketten NVarChar Spalten zugeordnet, aber überprüfen Sie Ihre Tabellendefinition – Steve

0

Das Problem ist, dass Sie die ID-Spalte in den bereitgestellten Werten überspringen möchten, so dass Sie dies angeben müssen.

string query = "INSERT Speler (Name, Club) OUTPUT Inserted.ID VALUES ('" + speler.Name + "', '" + speler.Club + "')"; 

Während dies den Fehler beheben, sollten Sie absolut nicht SQL-Strings verketten! Verwenden Sie stattdessen Parameter.

Verwandte Themen