Die Verwendung von Parametern in MySQL-INSERT-Anweisungen ist eine entscheidende Vorgehensweise zur Wahrung der Datenintegrität und zur Verhinderung von SQL-Injection-Angriffen. Sie sind jedoch auf Probleme mit Ihrem Code gestoßen, und wir sind hier, um Ihnen bei der Lösung zu helfen.
Ursprüngliches Problem:
In Ihrem ursprünglichen Code, Sie hat versucht, eine INSERT-Anweisung mit Parametern auszuführen, indem:
comm.Parameters.Add("@person", "Myname"); comm.Parameters.Add("@address", "Myaddress");
Die Fehlermeldung „Personenspalte darf nicht null sein“ zeigt jedoch an, dass Sie das Festlegen eines Werts für den Personenparameter versäumt haben.
Lösung:
Um dieses Problem zu beheben, müssen Sie den Parametern Werte zuweisen:
comm.Parameters.Add("@person", MySqlDbType.VarChar).Value = "Myname"; comm.Parameters.Add("@address", MySqlDbType.VarChar).Value = "Myaddress";
SQL-Injection-Schwachstelle:
Sie haben auch erwähnt, dass die Verwendung einer Literalzeichenfolge in der INSERT-Anweisung (z. B. „INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')") keinen Fehler erzeugt. Diese Vorgehensweise ist jedoch anfällig für SQL-Injection-Angriffe, bei denen böswillige Benutzer die Eingabe manipulieren können, um beliebige SQL-Befehle auszuführen.
Alternative Lösung:
Stattdessen können Sie Folgendes verwenden die AddWithValue-Methode, die die Parametrisierung automatisch übernimmt und SQL-Injection verhindert:
comm.Parameters.AddWithValue("@person", "Myname"); comm.Parameters.AddWithValue("@address", "Myaddress");
Fragezeichen verwenden:
Eine andere Möglichkeit besteht darin, Fragezeichen als Platzhalter für Parameter zu verwenden. wie:
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)"; comm.Parameters.Add("?person", "Myname"); comm.Parameters.Add("?address", "Myaddress");
Stellen Sie sicher, dass Sie den MySQL-Datentyp für jeden Parameter mithilfe der MySqlDbType-Enumeration angeben.
Indexbasierte Parameter:
Ihr Versuch, indexbasierte Parameter (z. B. cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a;) zu verwenden, ist ungültig. Der indexbasierte Ansatz gilt für gespeicherte Prozeduren, nicht für parametrisierte Abfragen.
Gelöster Code:
Letztendlich wurde Ihr Code mithilfe des folgenden Ansatzes aufgelöst:
cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)"; cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname"; cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress"; cmd.ExecuteNonQuery();
Dieser Code führt die INSERT-Anweisung erfolgreich aus und schützt gleichzeitig vor SQL-Injection.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich beim Einfügen von Daten in MySQL mit C# die Fehlermeldung „Personenspalte darf nicht Null sein'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!