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

fdx2calv  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(184)

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

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

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

DELETE FROM Students
WHERE name = 'john' or name = 'brian' or name = 'robert'


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

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


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

我应该如何去做这件事?

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

foreach(string name in names)
{
    command.CommmandText = "DELETE FROM Students WHERE name = @name";
    command.Parameters.Add(new MySqlParameter("@name", name));
    command.NonQuery();
    command.Parameters.Clear();
}


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

atmip9wb

atmip9wb1#

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

List<string> names = new List<string> { "john", "brian", "robert" };
string commandText = "DELETE FROM Students WHERE name IN ({0})";
string[] paramNames = names.Select(
    (s, i) => "@tag" + i.ToString()
).ToArray();

string inClause = string.Join(",", paramNames);
using (var command = new SqlCommand(string.Format(commandText, inClause), con))
{
    for (int i = 0; i < paramNames.Length; i++)
    {
        command.Parameters.AddWithValue(paramNames[i], names[i]);
    }
    int deleted = command.ExecuteNonQuery();
}

字符串
类似于:

"... WHERE Name IN (@tag0,@tag1,@tag2)"

command.Parameters["@tag0"].Value = "john";
command.Parameters["@tag1"].Value = "brian";
command.Parameters["@tag2"].Value = "robert";


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

8fsztsew

8fsztsew2#

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

StringBuilder sb = new StringBuilder();

        sb.Append("create table #names(name varchar(50)); ");
        sb.Append("insert into #names(name) values");
        for(int i = 0; i< names.Count; i++)
        {
            sb.Append($"('{names[i]}')");
            if (i == (names.Count - 1))
            {
                sb.Append(";");
            }
            else
            {
                sb.Append(",");
            }
        }
        command.CommmandText = @"sb.ToString() 
                                DELETE 
                                 FROM Students s
                                 join #names n on s.name = n.name";

字符串

相关问题