ADO.NET向SQL参数插入多个值

时间:2017-01-16 12:38:38

标签: c# sql ado.net

我收到了Dictionary<string, string>,并希望将其值转发给SqlParameter内的数据库。这甚至可能吗?这就是我这样做的方式,我收到一个错误,即列名与表定义不匹配。

SqlParameter param = new SqlParameter();
param.ParameterName = "@Values";

var sb = new StringBuilder();
foreach (var item in data)
{
    sb.Append("'" + item.Value + "', ");
}
param.Value = sb.ToString().TrimEnd(',');

string insertString = $"insert into {tableName} values (@Values)";
SqlCommand command = new SqlCommand(insertString, connection);

command.Parameters.Add(param);
command.ExecuteNonQuery();

3 个答案:

答案 0 :(得分:2)

Sql server无法将您传递的单个变量解释为多个值 您可以使用多个变量生成查询,也可以使用表值参数 对于第一个选项,您必须更改构建查询的方式:

var command = new SqlCommand();

var insertString = $"insert into {tableName} values (";
var sb = new StringBuilder(insertString);
int i = 0;
foreach (var item in data)
{
    sb.Append("@P").Append(i).Append(",");
    command.Parameters.Add("@P" + i, SqlDbType.VarChar).Value = item.Value;
    i++;
}
command.Connection = connection;
command.CommandText = sb.ToString().TrimEnd(",") + ");";
command.ExecuteNonQuery();

注意:代码未经过测试,可能存在一些错误。

对于第二个选项,您必须使用存储过程。我从未尝试将表值参数传递给内联查询,我认为这是不可能的 This post(也在Alex K的评论中链接)解释了如何做到这一点。

答案 1 :(得分:0)

你t-SQL的“Values”部分中的每个值都必须用括号括起来。

所以,只需改变这一行:

public MainWindow()
{
    InitializeComponent();
    ListBox.ItemsSource = Load();
}

public List<Person> Load()
{
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load("UsersList");

    XmlElement xRoot = xDoc.DocumentElement;

    List<Person> users = new List<Person>();
    foreach (XmlNode xnode in xRoot)
    {
        Person user = new Person();
        if (xnode.Attributes.Count > 0)
        {
            XmlNode attr = xnode.Attributes.GetNamedItem("name");
            if (attr != null)
                user.Name = attr.Value;
        }

        foreach (XmlNode childnode in xnode.ChildNodes)
        {

            if (childnode.Name == "images")
            {
                user.Images = childnode.InnerText;

            }

            if (childnode.Name == "age")
            {
                user.Age = childnode.InnerText;
            }
        }
        users.Add(user);
    }

    return users;
}

为:

    sb.Append("'" + item.Value + "', ");

你的tSQL看起来像这样:

    sb.Append("('" + item.Value + "'),");  // note: no space after the ,

它需要看起来像这样(假设你的表中只有1列):

    insert into myTable values ('A', 'B', 'C',)

如果您的表包含多个列:

    insert into myTable values ('A'), ('B'), ('C')

答案 2 :(得分:0)

我认为最好的是在mssql中创建一个split函数(在互联网上有百万个例子)和一个存储。传递一个字符串逗号(例如)分隔给存储的Who调用该函数。很抱歉没有例子,但我的智能手机