设置批量大小时,SqlDataAdapter给出参数名称无效错误

时间:2013-04-12 00:36:10

标签: c# batch-processing sqldataadapter

我正在尝试批量插入/更新SqlDataAdapter。当我设置UpdateBatchSize = 1时,它可以工作,但将其设置为2会出现异常“指定的参数名称'Id'无效。”。

using (var sqlDataAdapter = new SqlDataAdapter
{
    UpdateBatchSize = 2
})
using (var connection = new SqlConnection("Data Source=server;Initial Catalog=DB;Integrated Security=True"))
using (var command = new SqlCommand("INSERT INTO Test (Id) VALUES (@Id)", connection)
{
    UpdatedRowSource = UpdateRowSource.None
})
{
    command.Parameters.Add("Id", SqlDbType.Int).SourceColumn = "Id";
    sqlDataAdapter.InsertCommand = command;

    var table = new DataTable("Test");
    table.Columns.Add("Id");
    table.Rows.Add(1);
    table.Rows.Add(2);
    sqlDataAdapter.Update(table);
}

2 个答案:

答案 0 :(得分:2)

在反编译SqlDataAdapter并使用堆栈跟踪后,我来到了这一行。

if (!SqlCommandSet.SqlIdentifierParser.IsMatch(sqlParameter.ParameterName))
    throw ADP.BadParameterName(sqlParameter.ParameterName);

事实证明,通常你可以从SqlParameter名称中省略@,但是在执行这个批处理时,它需要它。很奇怪。正确的行变为

command.Parameters.Add("@Id", SqlDbType.Int).SourceColumn = "Id";

答案 1 :(得分:0)

 {
   sqlDataAdapter.Update(table);

 }

这个参数对sqlDataAdapter无效,你需要输入DataSet名后跟表名,我觉得应该是这样的:

   {

   sqlDataAdapter.Update(youDataSet,"YourTable");
    }