c# - 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
并且两个存储过程都位于与正在恢复的数据库不同的数据库中。
解决方案
推荐阅读
- java - 仅当字段位于嵌套对象中时,Gson 才序列化空值
- excel - 使用固定字母和数字进行 Excel 数据验证
- javascript - 点击输入时Vue.js丢失数据
- java - 从 Java 应用程序的 postgresql 中选择并锁定随机行
- angular - Angular 9 Bootstrap 4 多步模式
- java - 检测到新图像时删除增强图像并添加新图像
- r - 在列表中添加长度不等的数字向量以及基于索引的偏移量?
- c - 测试 shellcode 的程序出现段错误
- python - Python中的并发是否意味着同时执行多个函数?
- google-bigquery - Big Query 中的排名函数