Ottieni il numero di riga su cui è terminata la richiesta di database con un errore

c# reflection sqlbulkcopy sql-server

Domanda

Io uso questo codice per inviare una richiesta SQL:

 SqlBulkCopy bulkCopy = new SqlBulkCopy(Connection);

 foreach (DataColumn column in dt.Columns)
 {
     bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
 }

 bulkCopy.DestinationTableName = "nsi." + classifierData.Info.TableName;
 bulkCopy.WriteToServer(dt);

e ottieni questa eccezione:

Ricevuta una lunghezza di colonna non valida dal client bcp per colid

C'è un modo per identificare quale riga sta causando l'errore?

Ho provato a usare questo, ma non funziona (i valori sono sempre gli stessi):

 FieldInfo currentRow = typeof(SqlBulkCopy).GetField("_currentRowLength", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowNumber = currentRow.GetValue(bulkCopy);

 FieldInfo _rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowN = _rowsCopiedField.GetValue(bulkCopy);

Per favore, aiutami chiunque ...

Risposta accettata

Credo che l'unico modo per identificare la riga in errore dal puramente SqlBulkCopy utilizza il NotifyAfter struttura + SqlRowsCopied evento + BatchSize = 1.

Da questi, ora è possibile avere facilmente una proprietà Index che si incrementa per ogni riga copiata correttamente e si sarà in grado di trovare l'indice per errore.

Ad esempio, viene generato un errore e si prova nuovamente con NotifyAfter = 1

bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;

Ovviamente, non è la migliore soluzione per quanto riguarda le prestazioni, ma troverai le tue informazioni.

MODIFICA : rispondi al commento

Ci dispiace, ma posso ottenere un valore di riga-colonna con errore?

Io non la penso così Non sappiamo esattamente quale colonna abbia un problema con il messaggio di errore.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché