4

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);
}
4

2 に答える 2

2

SqlDataAdapter を逆コンパイルしてスタック トレースを使用すると、この行にたどり着きました。

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

したがって、通常は SqlParameter 名から @ を省略できますが、このバッチを実行するときは @ が必要です。非常に奇妙な。正しい行は次のようになります

command.Parameters.Add("@Id", SqlDbType.Int).SourceColumn = "Id";
于 2013-04-12T01:36:04.660 に答える
0
 {
   sqlDataAdapter.Update(table);

 }

このパラメーターは sqlDataAdapter に対して有効ではありません。DataSet 名の後にテーブル名を入力する必要があります。次のようにする必要があります。

   {

   sqlDataAdapter.Update(youDataSet,"YourTable");
    }
于 2013-04-12T00:47:24.043 に答える