Автоматично свързване на SqlConnection

Всеки път, когато имах проблем с моята връзка със SQL Server (напр. някой превключи сървъра), приложението ми ще покаже съобщение за изключение в кутия за съобщения. Не знам кога връзката ще бъде налична, освен че продължавам да се опитвам да отворя връзката/изпълня заявка.

Затова създавам форма за изчакване, която ще се появи, ако връзката е недостъпна, продължавам да се опитвам да отворя връзката и се затваря, когато връзката отново е налична.

За да скрия замразяването от потребителя, използвам фонов работник.

Това е кодът на фоновия работник

    private void StartLoader(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 10; i++)
        {
            if (this.par.sqSuccess) //if no error, means connection is available, stop looping
            {
                break;
            }
            else
            {
                i -= 1;
            }

            System.Threading.Thread.Sleep(5000); //report progress every 5 second
        }

Това е събитие за промяна на напредъка на фоновия работник

this.cnn = new SqlConnection(this.par.Constr);

try
{
   this.cnn.Open(); //SqlConnection

   this.par.sqSuccess = true; //if no error, then I change this variable
}
catch (Exception ex)
{
   this.par.Exception = ex.Message;
}
finally
{
   if (this.cnn != null) { this.cnn.Dispose(); }
}
if (this.par.sqSuccess) { this.Close(); }

След като всичко приключи, опитах да спра услугата SQL Server от services.msc, след което се опитвам да се свържа.

Формата за изчакване ще се появи и ще продължи да върши работата си.

Няколко секунди след като опитах да се свържа, стартирах услугата отново и формата за изчакване се затвори, успех. Това е проблемът, когато изчакам малко повече, преди да стартирам услугата отново, формата за изчакване все още се затваря, но отнема известно време.

След като проверя всичко, изглежда, че опашката cnn.open() се издига и колкото по-дълго спирам услугата, толкова повече време отнема затварянето на формата за изчакване.

Търсих в Google и се опитах да добавя Connect Timeout=3; зад моя низ за свързване, тъй като съм сигурен, че моят thread.sleep(5000) няма да ги накара да се наредят на опашка, но все още не работи.

Някой ми каза да използвам cnn.OpenAsync();

След като прочетох документацията за OpenAsync, правя това.

    static async Task<ConnectionState> Method(SqlConnection cnn)
    {
        await cnn.OpenAsync();
        return cnn.State;
    }

И този

    private void SQLClientLoader_Load(object sender, EventArgs e)
    {
        do
        {
            this.cnn = new SqlConnection(this.par.Constr);

            try
            {
                ConnectionState cst = Method(cnn).Result;

                if (cst == ConnectionState.Open)
                {
                    this.par.sqSuccess = true;
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                this.par.sqSuccess = false;

                this.par.Exception = ex.Message;
            }
            finally
            {

            }
        } while ((bool)this.par.sqSuccess != true);
    }

Кодът по-горе замразява приложението ми всеки път, когато се изпълни кодът за зареждане на формуляр.

Имам нужда от проста инструкция как да изчакам процеса cnn.Open да завърши или да го отменя, ако отнема твърде много време.

Благодаря ви предварително


person vkstarry    schedule 12.09.2013    source източник
comment
Какво ще кажете за настройката на свойството Timeout на връзката?   -  person Jon La Marr    schedule 12.09.2013
comment
Зададох времето за изчакване на връзката, но все още не разбирам защо опашката cnn.Open се издига.   -  person vkstarry    schedule 13.09.2013


Отговори (1)


Можете да зададете свойството ConnectionTimeout за вашия SqlConnection във вашия код или във вашия ConnectionString. Няма нужда да използвате Async IMHO..

cnn.ConnectionTimeout = 5000

Така че това ще създаде около 10-секундно забавяне, ако връзката не работи (изчакване на връзката + Sleep(5000).

person Baral    schedule 12.09.2013
comment
Благодаря ви за отговора, имам Connect Timeout в моя низ за връзка и времето за изчакване е по-ниско от моя thread.sleep. Все още cnn. Отворете опашката. Някакво друго решение? - person vkstarry; 13.09.2013