等待批量插入存储过程完成
Posted
技术标签:
【中文标题】等待批量插入存储过程完成【英文标题】:Wait for Bulk Insert stored procedure to finish 【发布时间】:2021-10-14 10:10:37 【问题描述】:我有一个存储过程,它实际上将条目批量插入数据库,完成后,它返回输出参数。
当我从 .NET Core Web 应用程序调用我的过程时,它不会等待过程完成并在下一步中重定向页面。如何让我的代码等待存储过程完成?
注意:当从 SQL Server Management Studio 运行时,如果我在操作方法中设置断点,存储过程可以正常工作。
这是我调用存储过程的方式;
public IActionResult Import(ImportTransactionsVM TransactionsVM)
int ReportResult = 0;
DataPathParam = new SqlParameter("@pDataFilePath", FilesHandlerHelper.ImportFile(_hostingEnvironment, TransactionsVM.ReportFile));
FileTypeParam = new SqlParameter("@pFileType", TransactionsVM.BankType);
OutputParam = new SqlParameter("@pOutputValue", SqlDbType.Int)
//Direction of this parameter is output.
Direction = ParameterDirection.Output,
Value = 0
;
FormatPathParam = new SqlParameter("@pFormatFilePath", Path.Combine(_hostingEnvironment.ContentRootPath, "Data\\ImportFormats\\MigsReport.fmt"));
ReportResult = _dbContext.Database
.ExecuteSqlRaw("exec SP_ImportTransactionReports @pDataFilePath, @pFormatFilePath, @pFileType, @pOutputValue OUT", DataPathParam, FormatPathParam, FileTypeParam, OutputParam);
return RedirectToAction("Import", new result = OutputParam.Value );
我还使用了ExecuteSqlRawAsync
和await
,结果相同。
此外,存储过程实际上是批量插入记录。
谢谢
【问题讨论】:
听起来不太可能。您有什么证据表明它“不等待程序完成并重定向页面”?你能制作一个简短的、独立的复制品吗? @DavidBrowne-Microsoft 它只是重定向到导入操作而没有结果参数。但如果我调试它,它会按预期填充表格和输出参数。 可能是其他原因导致存储过程未设置输出参数。 旁注:您应该不为您的存储过程使用sp_
前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_
并使用其他东西作为前缀 - 或者根本不使用前缀!
【参考方案1】:
所以问题是当我在上传过程中复制文件时,正在导入的文件被锁定。
所以我改变了
File.CopyTo(new FileStream(FilePath, FileMode.Create));
到
var _FileStream = new FileStream(FilePath, FileMode.Create);
File.CopyTo(_FileStream);
_FileStream.Close();
感谢 @David Browne - Microsoft 为我指明了正确的方向。
【讨论】:
抱歉,我在您的代码中看不到任何 FileStream。 FilesHandlerHelper.ImportFile(_hostingEnvironment, TransactionsVM.ReportFile) 实际上是在上传文件以上是关于等待批量插入存储过程完成的主要内容,如果未能解决你的问题,请参考以下文章