测试SQL Db连接

时间:2012-02-29 14:08:32

标签: .net sql

有没有办法测试特定数据库服务器是否已连接?就像ping操作一样。

我知道一些替代方法 - 测试SQL连接打开。不使用该方法的原因是我的应用程序在每t秒连续测试连接。

由于

2 个答案:

答案 0 :(得分:1)

不知道为什么我这样做,考虑到你很少接受答案,但是这里有。你的问题提出了许多问题,许多暗示。所以忍受我......

连接性&我

连接可能意味着很多事情。在@Paddy指出的更低层,PING将告诉您操作系统是否已连接到您可以访问的网络。但是可以连接计算机并且SQL可以停止,脱机或以其他方式发生故障。 SQL可以在线,但防火墙会阻止来自请求计算机的访问。请求计算机可能缺少权限。名单还在继续。

我的观点是:

  

打开与SQL Server的连接的能力是 方法 来测试连接性。

如果是我,我会在异步线程上放置一个小的ADO测试。测试将尝试使用短暂超时打开连接。

解决症状或问题?

SQL Server确实是作为高可用性产品而设计的,并且通常被认为是。这意味着,如果你的SQL访问量太大而你想要测试它(超出一般的错误处理程序),我建议你解决可用性问题。即使最基本的安装加上许多运气不好也应该允许95%或更高的正常运行时间。

使用SQL SMO进行测试

如果我在这一点上没有劝阻你,还有另一种选择。 SQL SMO(SQL DMO的替代品)是一系列允许以编程方式访问SQL Server管理的对象。

以下代码需要引用一些对象:

  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.Management.Sdk.Sfc.dll
  • Microsoft.SqlServer.SqlEnum.dll
  • Microsoft.SqlServer.SQLWmiManagmenet.dll
  • Microsoft.SqlServer.WmiEnum.dll

您可以使用此getting started文章了解如何设置项目。请注意,您需要WINDOWS权限(而不是SQL身份验证)才能连接到相关的SQL Server。

现在进入代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo.Wmi;

namespace SQL_SMO_Test {
 class Program {

    public const string SQL_SERVICE_BASENAME = "MSSQL";

    public static bool SQLServiceIsRunning (string SQLServerName ) {
      string[]           nameComponents;
      string             ComputerName;     
      string             InstanceName;     
      string             ServiceName;          
      ManagedComputer    mc;
      ServiceCollection  serviceList;

      //split up SQL Name
      nameComponents = SQLServerName.Split('\\');
      ComputerName   = nameComponents[0];
      InstanceName   = nameComponents.Length > 1 ? nameComponents[1] : "";
      ServiceName    = SQL_SERVICE_BASENAME + 
                           ((InstanceName.Length>0) ? "$" + InstanceName : "");

       //get WMI Computer object
       mc          = new ManagedComputer(ComputerName);
       serviceList = mc.Services;


       //find any SQL Services & See if it's our instance
       foreach (Service s in serviceList) {
          if (s.Type.Equals(ManagedServiceType.SqlServer) ) {
             Console.WriteLine("Service Found --" + s.Name);
             if ( (!ServiceName.Contains('$')) || s.Name == ServiceName ) {
                Console.WriteLine("..Correct Instance found" + s.Name);
                if (s.ServiceState.Equals(ServiceState.Running) ){
                    Console.WriteLine("....Service is Running");
                    return true;
                }
             }
          }
       } //end foreach()

       Console.WriteLine("service not found, or stopped");
       return false; //service not found, or stopped

    } //end SQLServiceIsRunning

                        /* format: servername\instanceIfAny */ 
    public static bool SQLIsRunning( string SQLServerName ) {
      Server  srv;

      Console.WriteLine("SERVICE RUNNING (" + SQLServerName + ") ?" );
      Console.WriteLine("------------------------------" );

      if (! SQLServiceIsRunning(SQLServerName) ) {
         return false;
      }
      Console.WriteLine("------------------------------" );

      srv = new Server(SQLServerName);
      try {
          Console.WriteLine("Status: " + srv.Status.ToString() );
          return true;
      } catch (Exception ex) {
          Console.WriteLine("Exception: " + ex.ToString() );
      }

       return false;

    } //end SQLIsRunning()


    static void Main(string[] args) {
      bool result = SQLIsRunning("MST-SQL01.mst.com");

      Console.WriteLine("-----------");
      Console.WriteLine("Press any key to close...");
      Console.ReadKey();


    } //end main()
  }
}

答案 1 :(得分:0)

您可以ping服务器:

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

但是这不会告诉你数据库是否已启动。打开连接(验证等可能是你唯一的方法)。你为什么要这样不断地进行民意调查?