sto inserendo i dati tramite SqlBulkCopy
in questo modo:SqlBulkCopy avvia automaticamente una transazione?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
}
sarà questo automaticamente avvolgere in una transazione di SQL in modo che se qualcosa va storto a metà strada attraverso il DB sarà lasciato nello stesso stato in cui era prima della è iniziato l'inserimento di massa? O sarà inserita la metà dei dati?
vale a dire è necessario per me di chiamare esplicitamente con.BeginTransaction
O se io chiamo costruttore SqlBulkCopy
s' che prende una stringa, è che un modo migliore di ottenerlo si verifichi in una transazione?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
trovo il docs un po 'poco chiaro in questa materia come affermano inizialmente che
Per impostazione predefinita, un'operazione di copia di massa viene eseguita come un un'operazione isolata. L'operazione di copia di massa avviene in modo non transazionale, senza possibilità per il rotolamento indietro
ma poi stato
Per impostazione predefinita, un'operazione di copia di massa è la sua propria transazione. Quando si si desidera eseguire un'operazione di copia bulk dedicata, creare una nuova istanza di SqlBulkCopy con una stringa di connessione o utilizzare un oggetto SqlConnection esistente senza una transazione attiva. In ogni scenario, crea l'operazione di copia bulk e quindi esegue il commit o il rollback della transazione .
Quindi è necessario fare:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlTransaction tr = con.BeginTransaction(IsolationLevel.Serializable))
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, tr))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
tr.Commit();
}
}
}
Perché non provi? E quale parte della documentazione ti ha fatto pensare che lo avrebbe fatto? – TomTom
Questa parte: * Per impostazione predefinita, un'operazione di copia di massa è una sua transazione *, ma poi dice anche * L'operazione di copia di massa avviene in modo non transato, senza alcuna possibilità di ripristinarlo * così ... è una specie di confusione – Dan
Controllare la modifica. – mybirthname