首页 > 解决方案 > C# SQL ExecuteNonQuery 在查询完成之前返回控制

问题描述

我正在使用 C# 控制台应用程序每晚恢复数据库。我让 C# 应用程序调用存储过程来使用ExecuteNonQuery. 然后它在新恢复的数据库上运行第二个存储过程。有时(并非总是)第二个存储过程失败并出现错误:

无法打开数据库“dbnamehere”。它正处于恢复过程中。

我的理解是,在第一次完成ExecuteNonQuery之前,不应将控制权传递给第二次。ExecuteNonQuery那么,为什么会这样呢?解决方案是什么?

C#

command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = @"dbnamehere.dbo.sprocDailyRestore";
command.CommandTimeout = 3600;
command.ExecuteNonQuery();

SQL

ALTER DATABASE dbnamehere SET single_user WITH ROLLBACK IMMEDIATE;

RESTORE DATABASE dbnamehere 
FROM DISK = 'C:\mypathhere\filename.bak' 
WITH MOVE 'filename' TO 'C:\MSSQL\Data\dbnamehere_Primary_Data.mdf',
     MOVE 'ETLStaging_4D600DAC' TO 'C:\MSSQL\Data\dbnamehere_ETLStaging_Data.mdf',
     MOVE 'RealAnalytics_7AFB9B94' TO 'C:\MSSQL\Data\dbnamehere_Analytics_Data.mdf',
     MOVE 'filename_log' TO 'C:\MSSQL\Data\dbnamehere_Primary_Log.ldf', 
     REPLACE, NORECOVERY;

RESTORE DATABASE dbnamehere 
FROM DISK = 'C:\scheduled-tasks\RealPageDownloader\Repo\filename.diff' 
WITH MOVE 'filename' TO 'C:\MSSQL\Data\dbnamehere_Primary_Data.mdf',
     MOVE 'ETLStaging_4D600DAC' TO 'C:\MSSQL\Data\dbnamehere_ETLStaging_Data.mdf',
     MOVE 'RealAnalytics_7AFB9B94' TO 'C:\MSSQL\Data\dbnamehere_Analytics_Data.mdf',
     MOVE 'filename_log' TO 'C:\MSSQL\Data\dbnamehere_Primary_Log.ldf',
     REPLACE;


ALTER DATABASE dbnamehere SET multi_user;

我应该注意两个存储过程都是使用执行的,ExecuteNonQuery并且两个存储过程都位于与正在恢复的数据库不同的数据库中。

标签: c#sql-serverconsole

解决方案


推荐阅读