Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 测试SQL数据库连接_.net_Sql - Fatal编程技术网

.net 测试SQL数据库连接

.net 测试SQL数据库连接,.net,sql,.net,Sql,有没有办法测试特定的数据库服务器是否已连接?像ping操作 我知道一些替代方法-测试SQL连接打开。不使用这种方法的原因是我的应用程序在每t秒测试一次连接 谢谢您可以ping服务器: 但这不会告诉你DB是否启动。打开连接(进行身份验证等)可能是您的唯一方法。你为什么总是这样做?考虑到你很少接受答案,我不知道我为什么要这样做,但还是这样。你的问题提出了很多问题,很多都是隐含的。所以请容忍我 连接和Me 连通性可能意味着很多事情。正如@Paddy指出的,在较低的一层,PING将告诉您操作系统是否连

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

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

谢谢

您可以ping服务器:


但这不会告诉你DB是否启动。打开连接(进行身份验证等)可能是您的唯一方法。你为什么总是这样做?

考虑到你很少接受答案,我不知道我为什么要这样做,但还是这样。你的问题提出了很多问题,很多都是隐含的。所以请容忍我

连接和Me

连通性可能意味着很多事情。正如@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.sqlwmimagnamenet.dll
  • Microsoft.SqlServer.WmiEnum.dll
您可以使用本文了解如何设置项目。注意:您需要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()
  }
}

我想防止在数据库不可用的情况下在应用程序中执行操作,这就是为什么。因此,如果数据库未连接,应用程序将被锁定。为什么不在数据库关闭的情况下提供一些错误处理(我希望这种情况不经常发生),而不是使用资源不断ping此服务器进行检查?这似乎很有用,但不是很繁重的操作吗?对不起,我对SMO一无所知。所以不能再多说了,“这不是很重吗”——这取决于你的观点。它是和进程外的,很可能是网络调用,就像所有数据库连接一样。所以你要用毫秒来测量时间,而不是纳秒。但这比等待连接超时要快得多。然而,我坚持我的主张——连接是测试DB可用性的方法。将连接测试放在异步线程上,这样就不必关心等待时间。