2013-09-09 3 views
1

У меня есть этот блок кода в моем C# приложении:Как изменить статус ярлыка, когда сервер SQL идет вниз

private bool connected 
public void ChangeStatusa() 
{ 
    if(connected) 
    { 
     label1.Text="Connected" 
    }else{ 
     label1.Text="Connected" 
    } 
} 

Я хочу автоматически выполнить этот код, когда сервер SQL отключен,

, и я хочу сделать эту работу в фоновом режиме, не влияя на производительность моего приложения.

По сути, я хочу создать систему в своем приложении, которая отвечает за проверку подключения к серверу sql и автоматически изменяет статус, когда соединение потеряно.

+2

windows service ?? – Sachin

+0

@Sachin sql server –

+0

Справочная работник – UnhandledExcepSean

ответ

0

Похоже, что таймер будет работать для этой цели. Фоновый поток в бесконечном цикле со спящим потоком также будет работать, но я не люблю ничего в бесконечном цикле.

См

C# Background Thread

Вот FXN проверить подключение

namespace answer1 
{ 
    using System.ComponentModel; 
    using System.Data.SqlClient; 

    internal class ConnectionCheck 
    { 
     private BackgroundWorker bw = new BackgroundWorker(); 

     private void CheckConnection() 
     { 
      string connetionString = null; 
      SqlConnection cnn; 
      connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; 
      cnn = new SqlConnection(connetionString); 
      try 
      { 
       cnn.Open(); 
       Console.WriteLine("Connection Open ! "); 
       cnn.Close(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Can not open connection ! "); 
      } 
     } 

     private void bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      while (true) 
      { 
       CheckConnection(); 
       System.Threading.Thread.Sleep(5000); 
      } 
     } 

     /// <summary> 
     /// This is the Main routine you call to execute the background thread 
     /// </summary> 
     public void RunBackgroundSQLCheck() 
     { 
      bw.DoWork += this.bw_DoWork; 
      bw.RunWorkerAsync(); 
     } 
    } 
} 
+0

Нет, я попробовал это, а также попробовал BackgroundWorker. они оба влияют на производительность приложений. –

+0

Thats unfortunate ... в противном случае ... просто проверьте его в точке, где вы выполняете SQL-вызов и откатываете по мере необходимости. –

2

Вы подключаетесь через TCP? если так что вы можете попробовать использовать прямой сокет-соединение с асинхронным получить: вот некоторый код:

class Program 
{ 
    static bool disc = false; 

    static void Main(string[] args) 
    { 
     dbtest dt = new dbtest(); 
     dt.Disconnected += new EventHandler(dt_Disconnected); 
     dt.Start("10.1.32.97", 1433); 

     while (!Console.KeyAvailable) 
     { 
      Console.WriteLine(disc?"disconnected":"tick"); 
      Thread.Sleep(2000); 
     } 

     dt.Stop(); 
    } 

    static void dt_Disconnected(object sender, EventArgs e) 
    { 
     disc = true; 
     Console.WriteLine("Disconnected"); 
    } 

} 

public class dbtest 
{ 
    byte[] buffer = new byte[10]; 
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    public event EventHandler Disconnected = null; 

    public void Start(string host, int port) 
    { 
     if(s!=null) 
     { 
      Stop(); 
     } 

     s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     s.Connect(host, port); 
     Console.WriteLine("Connected."); 
     s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, s); 
    } 

    public void Stop() 
    { 
     if (s != null) 
     { 
      s.Close(); 
      s.Dispose(); 
      s = null; 
     } 
    } 

    void ReceiveCallBack(IAsyncResult ar) 
    { 
     Socket s = ar as Socket; 

     if (s != null && s.Connected) 
     { 
      int rcvd = s.EndReceive(ar); 

      if (rcvd > 0) 
      { 
       s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, s); 
       return; 
      } 
     } 

     if(Disconnected!=null) 
      Disconnected(this, EventArgs.Empty); 
    } 
} 

Это только основные - я не знаю, как долго SQL Server будет держать розетку, hasn; т ответил. Возможно, добавьте счетчик - подключитесь к разъединению, чтобы узнать, действительно ли это реальное разъединение и т. Д. И т. Д.

+1

Отличное решение ... только забота будет о том, что машина может быть, но SQL Server в автономном режиме или плохая строка подключения или никаких прав ... похоже, единственный верный способ узнать, что у вас будет успешное соединение, - проверить, что через SQLConnection объект. –

Смежные вопросы