首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步SQL批量复制和批处理选择

异步SQL批量复制和批处理选择
EN

Stack Overflow用户
提问于 2014-09-15 19:35:18
回答 2查看 1.9K关注 0票数 2

以下代码不起作用(抛出“reader.NextResult()上的致命错误”)

我的目标是执行批处理选择,然后通过批量复制异步插入每个结果集的数据。

我认为问题在于,在reader.NextResult()上,当前的结果集是从内存中释放的,但是由于异步批量操作正在使用它,它抛出了一个致命错误(InvalidOperationException)。有什么想法吗?

代码语言:javascript
复制
                    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();
EN

回答 2

Stack Overflow用户

发布于 2014-09-15 19:41:17

是的,你没有await结果;你前进得太快了。这应该是:

代码语言:javascript
复制
await bulkCopy.WriteToServerAsync(reader);

代码语言:javascript
复制
await bulkCopy.WriteToServerAsync(reader).ConfigureAwait(false);

还要注意,Task.WaitAll()没有做任何有用的事情;您说的是“现在等待所有这些任务都完成”。

还要注意的是,如果你要使用async,你也可以从头到尾使用async

代码语言:javascript
复制
var reader = await selectCmd.ExecuteReaderAsync();
...
await bulkCopy.WriteToServerAsync(reader);
...
await reader.NextResultAsync();

(同样,如果需要,也可以在每个设备上都安装.ConfigureAwait(false) )

票数 2
EN

Stack Overflow用户

发布于 2014-09-15 19:41:26

是。您必须延迟NextResult,直到您确定WriteToServerAsync已完成其工作。正确执行此操作的最简单方法是将包含方法设置为async方法,并将其转换为await WriteToServerAsync,如下所示:

代码语言:javascript
复制
await bulkCopy.WriteToServerAsync(reader);

有关asyncawait的更多信息,请参阅async/await tutorials like this one from dotnetperls和/或Microsoft's own documentation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25847162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档