2013-04-12 2 views
3

J'essaie l'insertion/la mise à jour par lots de SqlDataAdapter. Lorsque je mets UpdateBatchSize = 1, cela fonctionne, mais le mettre à 2 donne l'exception "Nom du paramètre spécifié 'Id' n'est pas valide.".SqlDataAdapter donne une erreur non valide au nom du paramètre lors de la définition de la taille de lot

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

Répondre

2

Après décompilation SqlDataAdapter et en utilisant la trace de la pile, je suis arrivé à cette ligne.

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

Ainsi, il se, vous pouvez normalement omettre le @ d'un nom SqlParameter, mais en faisant ce lot, il l'exige. Très étrange. La ligne correcte devient

command.Parameters.Add("@Id", SqlDbType.Int).SourceColumn = "Id"; 
0
{ 
    sqlDataAdapter.Update(table); 

} 

ce paramètre est valide pour SQLDataAdapter, vous devez entrer le nom de DataSet suivi du nom de la table, je pense qu'il devrait être comme ça:

{ 

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