如何在不使用存储过程的情况下使用C#中的MySQLCommand创建安全查询以在MySQL中执行批量插入?

在下面的示例中,我构建了一个查询来批量插入MySQL数据库:

const string QUERY = "INSERT INTO contacts (first_name,last_name) VALUES{0};"; public string BuildQuery(IEnumerable contacts) { List values = new List(); foreach (var contact in contacts) { values.Add(string.Format("('{0}','{1}')", contact.first_name, contact.last_name)); } return string.Format(QUERY, string.Join(",", values)); } 

结果可能如下所示:

 INSERT INTO contacts (first_name,last_name) VALUES("J","Kappers"),("A","Temple") 

如何编写不易出现SQL注入的更安全的查询?

 const string QUERY = "INSERT INTO contacts (first_name,last_name) VALUES" + BuildQuery(c, contacts); public string BuildQuery(MySQLCommand c, IEnumerable contacts) { List values = new List(); string query = null; int i = 0; foreach (var contact in contacts) { i++; query += "(@firstName" + i + ", @lastName" + i + ")"; c.Parameters.AddWithValue("@firstName" + i, contact.first_name); c.Parameters.AddWithValue("@lastName" + i, contact.last_name); if(i < contacts.Count) query += ","; } return query } 

你可以在这里看到一个相关的主题 ! 我一定是错过了一些微不足道的事情,但这对你来说是微不足道的。 当然,你知道当contacts没有元素时会发生什么。 我没有看到更多边缘案例。 顺便说一句,请注意,根据mysql允许的最大数据包大小,您可以添加多少这样的参数。 您可以更改它,或照顾不超过该限制。 干杯! 🙂

您可以像在普通SQL命令中一样转义MySQL命令参数。 以下是官方MySQL手册的示例

  private void PrepareExample() { MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (?val)", myConnection); cmd.Parameters.Add( "?val", 10 ); cmd.Prepare(); cmd.ExecuteNonQuery(); cmd.Parameters[0].Value = 20; cmd.ExecuteNonQuery(); } 

PS无论你选择什么 – 永远不要使用字符串操作来向SQL命令添加/插入参数。 这是SQL注入攻击的主要来源