【问题标题】:ADO.NET insert multiple values to SQL parameterADO.NET 向 SQL 参数插入多个值
【发布时间】:2017-01-16 12:38:38
【问题描述】:

我收到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();

【问题讨论】:

标签: c# sql ado.net


【解决方案1】:

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

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 的评论中链接)解释了如何做到这一点。

【讨论】:

  • 这样容易发生SQL注入吗?
  • 仅当tableName 的值来自用户输入时。
  • 有没有办法在不进行硬编码的情况下修补该部分?
  • 我不知道。
  • 解决方案很棒......你只是错过了循环结束时的增量
【解决方案2】:

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

所以,只需更改这一行:

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

到:

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

你的 tSQL 看起来像这样:

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

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

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

如果你的表包含多列:

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

【讨论】:

  • 这是个好主意,但它不起作用。我得到Incorrect syntax near '@Values'. ...我想是因为它希望值首先被括在括号中
  • 猜我应该明确指定您需要将您的 insertString 更改为(如果您不使用存储过程,则不需要参数): string insertString = $"insert into {tableName} values {sb.ToString().TrimEnd(',')}";
  • 如果这样做,它可以被利用。我需要参数解决方案:)
【解决方案3】:

我认为最好的方法是在 mssql 中创建一个拆分函数(互联网上的数百万个示例)和一个存储的函数。将字符串逗号(例如)分隔给存储的谁调用该函数。对不起,没有例子,但我用我的智能手机

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多