Интервал времени Проверка, существует ли соединение с БД каждые 3 минуты на сервере, когда приложение работает на C # - PullRequest
0 голосов
/ 23 мая 2018

В начале моего приложения я успешно могу проверить, работает ли SQL Server, не запущен ли он, запустить конкретную службу, а затем проверить, подключена ли конкретная база данных.Но я хочу узнать, как проверить, подключена ли база данных через определенный интервал времени. Если база данных отключается, т.е., если база данных удаляется или переименовывается в бэкэнде во время работы приложения, то приложение должно автоматически завершиться.Как лучше всего этого добиться?

Как вызывать базу данных подключенной функции через определенные промежутки времени?Если он не подключен, он должен прекратить действие приложения.

namespace CLearning
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool isServiceRunning = false;

            // Applying the required visual styles - we need to do it before we display any single form on the screen. 
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            //Check specific SQL Server and database is running
            isServiceRunning = DataAccessContext.CheckSQLServiceStatus();

            if (isServiceRunning)
            {
                //SQL is running, checking for Local DB connection

                bool isLocalDAOConnected = DataAccessContext.CheckIsLocalDAOConnected();
                if (!isLocalDAOConnected)
                {
                    MessageBox.Show(
                        "Database connection is not available on the machine. The application will termiante.",
                        "No database connection available",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                    return;
                }

                Application.Run(new Form1());

            }
        }
    }
}

Класс DataAccess, который проверяет, работает ли сервер и подключена ли база данных, находится здесь

namespace CLearning.DataAccess
{
    public class DataAccessContext 
    {

        private static bool _isSQLServiceRunning = false;
        private static bool _isLocalDAOConnected = false;

        public static bool CheckSQLServiceStatus()
        {
          string myServiceName = "MSSQL$CLearning"; //service name of SQL Server Express
          string status; //service status (For example, Running or Stopped)

            //service status: For example, Running, Stopped, or Paused
            ServiceController mySC = new ServiceController(myServiceName);

            try
            {
                status = mySC.Status.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("SQL Service not found. It is probably not installed, application will terminate. [exception=" + ex.Message + "]");
                return _isSQLServiceRunning;
            }
            //service status: For example, Running, Stopped, or Paused
            _isSQLServiceRunning = true;
            //if service is Stopped or StopPending, you can run it with the following code.
            if (mySC.Status.Equals(ServiceControllerStatus.Stopped) | mySC.Status.Equals(ServiceControllerStatus.StopPending))
            {
                try
                {
                    mySC.Start();
                    var timeout = new TimeSpan(0, 0, 5);
                    mySC.WaitForStatus(ServiceControllerStatus.Running,timeout);
                    _isSQLServiceRunning = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error in starting the service: " + ex.Message);
                    _isSQLServiceRunning = false;
                }
            }
            return _isSQLServiceRunning;
        }

        public static bool CheckIsLocalDAOConnected()
        {
            try
            {
                GlobalConfig.Connection.TestConnection(); //SQL QUERY That checks for openning the connection
                return _isLocalDAOConnected = true;
            }
            catch (Exception)
            {
                return _isLocalDAOConnected;
            }
        }
    }
}

Пожалуйста, руководство.

Спасибо AA

1 Ответ

0 голосов
/ 23 мая 2018

Проверять, что база данных доступна каждые три минуты?

Из цепочки состояния делайте это каждые три минуты:

  1. Открыть соединение с сервером базы данных.
  2. Установите соединение для неблокирующих операций чтения с помощью SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  3. Выполните необработанный запрос вида SELECT TOP 1 somecolumn FROM a_key_table;
  4. Закройте соединение.

Сделайте всеэтот материал в try{}catch(){} блоке.Если вы получаете исключение, ваша база данных потерпела неудачу, как это важно - вы не можете прочитать строку из одной из важных таблиц вашего приложения.

Исключение скажет вам, что пошло не так (если вам нужно): время ожидания соединения, сбой аутентификации, невозможно прочитать таблицу и т. д.

...