mysql 将列表传递< string>到SQL参数

fdx2calv  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(213)

这个程序是用C#编写的,我试图传递一个List<string>作为参数。

  1. List<string> names = new List<string>{"john", "brian", "robert"};

字符串
在普通SQL中,查询将如下所示:

  1. DELETE FROM Students
  2. WHERE name = 'john' or name = 'brian' or name = 'robert'


当在C#代码中运行SQL命令时,我知道正确的方法是使用参数,而不是将所有内容连接到一个巨大的字符串中。

  1. command.CommmandText = "DELETE FROM Students WHERE name = @name";
  2. command.Parameters.Add(new MySqlParameter("@name", String.Format("'{0}'", String.Join("' or name = '", names)));
  3. command.NonQuery();


上面的方法不起作用。它没有抛出任何错误/异常,它只是没有按照我想要的方式工作。

我应该如何去做这件事?

我想循环遍历List<string>,然后只对每个名字执行。

  1. foreach(string name in names)
  2. {
  3. command.CommmandText = "DELETE FROM Students WHERE name = @name";
  4. command.Parameters.Add(new MySqlParameter("@name", name));
  5. command.NonQuery();
  6. command.Parameters.Clear();
  7. }


但这将需要很长时间,因为实际的List<string>是相当大的。我想尝试尽可能少地执行。
谢谢你,谢谢

atmip9wb

atmip9wb1#

您可以在IN子句中参数化列表中的每个值:

  1. List<string> names = new List<string> { "john", "brian", "robert" };
  2. string commandText = "DELETE FROM Students WHERE name IN ({0})";
  3. string[] paramNames = names.Select(
  4. (s, i) => "@tag" + i.ToString()
  5. ).ToArray();
  6. string inClause = string.Join(",", paramNames);
  7. using (var command = new SqlCommand(string.Format(commandText, inClause), con))
  8. {
  9. for (int i = 0; i < paramNames.Length; i++)
  10. {
  11. command.Parameters.AddWithValue(paramNames[i], names[i]);
  12. }
  13. int deleted = command.ExecuteNonQuery();
  14. }

字符串
类似于:

  1. "... WHERE Name IN (@tag0,@tag1,@tag2)"
  2. command.Parameters["@tag0"].Value = "john";
  3. command.Parameters["@tag1"].Value = "brian";
  4. command.Parameters["@tag2"].Value = "robert";


来源:https://stackoverflow.com/a/337792/284240

展开查看全部
8fsztsew

8fsztsew2#

你可以通过join,创建临时表来完成。

  1. StringBuilder sb = new StringBuilder();
  2. sb.Append("create table #names(name varchar(50)); ");
  3. sb.Append("insert into #names(name) values");
  4. for(int i = 0; i< names.Count; i++)
  5. {
  6. sb.Append($"('{names[i]}')");
  7. if (i == (names.Count - 1))
  8. {
  9. sb.Append(";");
  10. }
  11. else
  12. {
  13. sb.Append(",");
  14. }
  15. }
  16. command.CommmandText = @"sb.ToString()
  17. DELETE
  18. FROM Students s
  19. join #names n on s.name = n.name";

字符串

展开查看全部

相关问题