【问题标题】:How to know the state of an sql instance in a c# program如何在c#程序中知道sql实例的状态
【发布时间】:2011-11-04 11:53:27
【问题描述】:

我有一个数据库,一个镜像处于高安全模式(目前使用见证服务器,但计划将他取出),该数据库将用于存储 c# 程序收集的数据。

我想知道如何在我的程序中检查所有 SQL 实例的状态并导致/强制进行手动故障转移。

是否有任何 c# API 可以帮助我解决这个问题?

信息:我正在使用 sql server 2008

编辑:我知道我可以查询 sys.database_mirroring 但为此我需要启动并运行主体数据库,我想联系每个 sql 实例并检查它们的状态。

【问题讨论】:

    标签: c# sql-server sql-server-2008-r2


    【解决方案1】:

    使用SQL Server Management Objects (SMO)

    SQL Server 管理对象 (SMO) 是一组对象,旨在对管理 Microsoft SQL Server 的各个方面进行编程。 SQL Server 复制管理对象 (RMO) 是封装 SQL Server 复制管理的对象集合。

    我之前曾在托管应用程序中使用过 SMO - 效果很好。


    要找出实例的状态,请使用 Server 对象 - 它具有 StateStatus 属性。

    【讨论】:

    • 由于某种原因,状态始终为“现有”且状态为“离线”,如果 sql server 实例实际上已关闭,我无法看到状态,因为它会引发异常。 (我不介意这种行为......但它需要大约 5 秒才能抛出而不是立即执行)关于为什么会发生这种情况的任何想法?或者如何正确查看一台服务器是否关闭?
    • @RagnaRock - 按理说,如果 SMO 无法连接到它将抛出的实例。
    • 但是有没有更快的方法来检测服务器是否已关闭?等待 5 秒失败,对我来说似乎太长了。检测这种错误什么的特殊方法...
    • @RagnaRock - 为什么你需要这个更快?你检查了多少个实例?
    • 只有一个...但是我觉得花这么长时间检查连接性对我来说很不自然,我认为会有更合适和更快的方法
    【解决方案2】:

    玩了一会儿后,我找到了这个解决方案(如果这是一个合适的解决方案,我不是,所以请离开 cmets)

    using Microsoft.SqlServer.Management.Smo.Wmi;
    
    ManagedComputer mc = new ManagedComputer("localhost");
    foreach (Service svc in mc.Services) {
        if (svc.Name == "MSSQL$SQLEXPRESS"){
            textSTW.Text = svc.ServiceState.ToString();
        }
        if (svc.Name == "MSSQL$TESTSERVER"){
            textST1.Text = svc.ServiceState.ToString();
        }
        if (svc.Name == "MSSQL$TESTSERVER3") {
            textST2.Text = svc.ServiceState.ToString();
        }
    }
    

    这样我只是在寻找服务的状态(运行/停止)并且速度更快,我错过了什么吗?

    【讨论】:

    • 我在解决方案中发现了一个限制......它只适用于本地实例......对于远程实例,我们需要做其他事情才能访问服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多