在 MySQL INSERT 語句中使用參數是維護資料完整性和防止 SQL 注入攻擊的關鍵實踐。但是,您在程式碼中遇到了問題,我們將隨時協助您解決這些問題。
原始問題:
在您的初始程式碼中,您嘗試使用下列參數執行INSERT 語句:
comm.Parameters.Add("@person", "Myname"); comm.Parameters.Add("@address", "Myaddress");
但是,錯誤訊息「Person 欄位不能為空」表示您錯過了為person 參數設定值。
解決方案:
要解決此問題,您需要為參數指定值:
comm.Parameters.Add("@person", MySqlDbType.VarChar).Value = "Myname"; comm.Parameters.Add("@address", MySqlDbType.VarChar).Value = "Myaddress";
SQL 注入漏洞:
您已經也提到在INSERT語句中使用文字字串(例如「INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')」)不會產生錯誤。然而,這種做法很容易受到 SQL 注入攻擊,惡意使用者可以操縱輸入來執行任意 SQL 指令。
替代解決方案:
相反,您可以使用AddWithValue 方法,自動處理參數化並防止 SQL注入:
comm.Parameters.AddWithValue("@person", "Myname"); comm.Parameters.AddWithValue("@address", "Myaddress");
使用問題標記:
另一個選項是使用問號作為參數的佔位符,例如:
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)"; comm.Parameters.Add("?person", "Myname"); comm.Parameters.Add("?address", "Myaddress");
確保使用MySqlDbType 枚舉為每個參數指定MySQL 資料類型。
基於索引參數:
您嘗試使用基於索引的參數(例如cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a; )無效。基於索引的方法適用於預存程序,而不是參數化查詢。
已解決的程式碼:
最終,您的程式碼已透過使用以下方法解決:
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();
此程式碼已成功執行INSERT語句,同時防止SQL 注入。
以上是為什麼使用 C# 向 MySQL 插入資料時出現「Person Column Cannot Be Null」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!