J'utilise la bibliothèque Enterprise, mais l'idée est la même. J'ai un SqlStringCommand et SQLADO.NET Batch Insert avec plus de 2000 paramètres
est construit en utilisant StringBuilder dans les formes de
"insert into table (column1, column2, column3) values (@param1-X, @param2-X, @parm3-X)"+" "
où « X » représente une « boucle » environ 700 lignes
StringBuilder sb = new StringBuilder();
for(int i=0; i<700; i++)
{
sb.Append("insert into table (column1, column2, column3) values (@param1-"+i+", @param2-"+i, +",@parm3-"+i+") ");
}
suivie par la construction d'un objet de commande en y injectant tous les paramètres w/values.
Essentiellement, 700 lignes avec 3 paramètres, j'ai fini avec 2100 paramètres pour cette déclaration "un sql".
Il a fonctionné très bien pendant environ quelques jours et tout à coup j'ai eu cette erreur
===============================================================
A severe error occurred on the current command. The results, if any, should be discarded.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNon
Les pointeurs sont très appréciés.
Si vous avez 2100 paramètres, vous devez repenser votre processus. –
avec autant de données avez-vous atteint votre limite de DB? êtes-vous sur sql complet? – seanxe
Bonjour Durlai et seanxe: J'importe un fichier texte avec 800 enregistrements, je fais un traitement pour me débarrasser de certains éléments, je construis un objet IList et je les importe dans ma base de données au milieu d'une transaction. Je peux parcourir les dossiers et en insérer un à la fois, pas de problème. En fait, je l'ai fait, cela fonctionne très bien, mais comme la liste peut augmenter au fil du temps, je voudrais exécuter les déclarations dans un aller-retour au lieu de 700 allers-retours. – Liming