Следующий код не работает (бросание «фатальные ошибки на reader.NextResult()»)Асинхронный SQL Bulk Copy и пакетная Выбор
Моя цель выполнить партию, а затем выберите для вставки данных каждого набора результатов асинхронно с помощью массовой копии.
Я думаю, проблема в том, что на reader.NextResult()
текущий набор результатов освобожден из памяти, но поскольку операция асинхронного ввода использует его, он генерирует фатальную ошибку (InvalidOperationException). Есть идеи?
var sqlQuery = new DbExtensions.SqlBuilder();
foreach (var table in tableBatch)
{
sqlQuery
.SELECT("*")
.FROM("[" + table.TableName + "]");
}
var selectCmd = sqlQuery.ToCommand(clientDb);
logger.Info("Executing select", batchSelectSize);
var reader = selectCmd.ExecuteReader();
var i = 0;
while (reader.HasRows)
{
logger.Info("Bulk insert");
var table = tableBatch.ElementAt(i);
var bulkCopy = new SqlBulkCopy(serverDb, SqlBulkCopyOptions.Default, tx);
bulkCopy.DestinationTableName = String.Format("[{0}]", table.TableName);
bulkCopy.EnableStreaming = table.EnableStreaming;
bulkCopy.WriteToServerAsync(reader);
i++;
reader.NextResult(); // fatal error occures (sometimes)
}
logger.Info("Waiting for bulk operations to complete");
Task.WaitAll();
logger.Info("Committing transaction");
tx.Commit();
Вы используете объекты ADO.NET одновременно. Это никогда не допускается. – usr
@usr на самом деле, это не * довольно * правда; если вы включили MARS, методы async позволяют конвейерно выполнять несколько операций в одном соединении. –
@MarcGravell, но разрешено ли вам начинать операции и читать результаты параллельно? Я сомневаюсь в этом. Только один поток может когда-либо обращаться к тем же объектам ADO.NET за один раз, AFAIK. – usr