在 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中文网其他相关文章!