【问题标题】: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 });
}

我还使用了ExecuteSqlRawAsyncawait,结果相同。

此外,存储过程实际上是批量插入记录。

谢谢

【问题讨论】:

  • 听起来不太可能。您有什么证据表明它“不等待程序完成并重定向页面”?你能制作一个简短的、独立的复制品吗?
  • @DavidBrowne-Microsoft 它只是重定向到导入操作而没有结果参数。但如果我调试它,它会按预期填充表格和输出参数。
  • 可能是其他原因导致存储过程未设置输出参数。
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!

标签: c# sql-server stored-procedures .net-core


【解决方案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) 实际上是在上传文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
相关资源
最近更新 更多