我在C#中有一个服务应用程序,它从一个数据库查询数据并将其插入另一个SQL数据库。
有时,MSSQLSERVER服务因未知原因崩溃,我的应用程序也会崩溃。我想做一个SQL恢复机制,我检查以确保在写入数据库之前sqlconnection状态正常,但我是如何做到的?
我尝试停止MSSQLSERVER服务,即使MSSQLSERVER服务停止,sqlconnection.State也始终打开。
答案 0 :(得分:1)
第一:解决你的真正问题。 SQL Server应该非常非常稳定。
第二:考虑在客户端应用程序和服务器上使用MSMQ(或SQL Service Broker)来排队更新。
答案 1 :(得分:1)
从根本上调用SQL命令之前检查连接状态的一般策略是行不通的。如果服务在连接检查后崩溃,但在调用SQL命令之前会发生什么?
您可能需要弄清楚当数据库关闭时抛出什么异常,并在适当的代码层从该异常中恢复。
答案 2 :(得分:0)
我认为你选择的方法不是很好。
如果您的应用程序是某种预定作业,请让它崩溃。没有数据库 - 无法完成任何工作。在这种情况下崩溃是可以的。下次运行并且db启动它会完成它的工作。您也可以实施重试。
如果您的应用程序是内部的Windows服务和某种计划的计时器,您只需通过处理SqlExcpetion确保您的服务不会崩溃。再次重试,直到服务器启动。
此外,您可能希望使用分布式事务。为了保证复制过程的完整性,但是否需要,取决于要求。
[编辑] 回复重试问题。
var attemptNumber = 0;
while (true)
{
try
{
using (var connection = new SqlConnection())
{
connection.Open();
// do the job
}
break;
}
catch (SqlException exception)
{
// log exception
attemptNumber++;
if (attemptNumber > 3)
throw; // let it crash
}
}
答案 3 :(得分:0)
手动它是一些硬修复损坏的SQL数据库,特别适合那些技术上不牢固的人。这些类型的人可以使用任何第三方应用程序。谷歌上有很多可用的。好的是,他们中的许多人提供免费试用版,在免费版中你可以修复你的数据库,并可以看到恢复的原始结果的预览。这是我从谷歌获得的应用程序。 http://www.softmagnat.com/sql-database-recovery.html