none
Проверка соединения из ASP.NET C# к MS SQL Server RRS feed

  • Вопрос

  • Делаю проверку соединения из ASP.NET C# к MS SQL Server так:

    public
    static bool checkConnection()
    {
       
    SqlConnection conn = new SqlConnection("mydatasource");
       
    try
       
    {
             conn
    .Open();
             
    return true;
       
    }
       
    catch (Exception ex) { return false; }
    }

    Даже если поставить "conn.ConnectionTimeout = 10", то всё-равно почему-то 1 минуту "conn.Open" выполняется. А мне надо, чтобы за 10 секунд выполнялось.
    17 апреля 2013 г. 12:20

Ответы

  • Дело в том, что тут у вас проблема уровнем высше. Поэтому решение на уровне conn.Open() ничего не даст, т.е. тут вам ничего не сделать. единственно решение, на мой взгляд, это попытка несколько раз отправить или получить данные. Если попытка удачная то успех, иначе пытаемя читать/писать данные ещё раз. Примерно так вам нужно сделать.

    Я сделал так. Перед любым запросом вызываю функцию "IsConnectedToInternet". Если соединения нет, то вызываю "throw new TimeoutException()". Всё работает как мне надо:

        public static bool IsConnectedToInternet(string ServerAddress)
        {
            Ping p = new Ping();
            try
            {
                PingReply reply = p.Send(ServerAddress, 5000);
                if (reply.Status == IPStatus.Success)
                    return true;
            }
            catch
            {
                return false;
            }
            //
            return false;
        }

    • Помечено в качестве ответа Andrey Solopko 23 апреля 2013 г. 5:55
    23 апреля 2013 г. 5:55

Все ответы

  • Во-первых соединение с базой очень ценный ресурс, поэтому сразу полсле открытия его следует закрыть, раз вы ничего не делаете. Во-вторых, не очень понятно зачем это? и ещё поясните это: "Даже если поставить "conn.ConnectionTimeout = 10", то всё-равно почему-то 1 минуту "conn.Open" выполняется. А мне надо, чтобы за 10 секунд выполнялось."
    17 апреля 2013 г. 13:06
    Модератор
  •             bool result = false;
    //var.1
                SqlConnection con = new SqlConnection("****");
                try
                {
                    con.Open();
                    result = true;
                }
                catch { }
                finally 
                {
                    con.Dispose();
                }
    //var.2
                using (SqlConnection con = new SqlConnection("****"))
                {
                    try
                    {
                        con.Open();
                        result = true;
                    }
                    catch { }
                }
    Вот 2 варианта того чо вы хотите сделать. На сколько я понимаю даже если установить параметр ConnectionTimeout  в строке соединения то он не может быть меньше чем таймаут для вашей сетевой карты.
    17 апреля 2013 г. 14:43
  • Привет

    А Management Studio или Server Explorer как долго подключаются к вашей базе данных? И как "далеко" от веб приложения она находится (т.е. на том же сервере или на удаленном)?


    Для связи [mail]


    17 апреля 2013 г. 18:58
    Модератор
  • //var.1
    //var.2
    Вот 2 варианта того чо вы хотите сделать. На сколько я понимаю даже если установить параметр ConnectionTimeout  в
     строке соединения то он не может быть меньше чем таймаут для вашей сетевой карты.
    А чем это отличается от того, что я написал?
    18 апреля 2013 г. 7:20
  • Во-первых соединение с базой очень ценный ресурс, поэтому сразу полсле открытия его следует закрыть, раз вы ничего не делаете. Во-вторых, не очень понятно зачем это? и ещё поясните это: "Даже если поставить "conn.ConnectionTimeout = 10", то всё-равно почему-то 1 минуту "conn.Open" выполняется. А мне надо, чтобы за 10 секунд выполнялось."

    Зачем что? Мне надо проверить соединение. Если не проверять, то таймаут минуту длится, для одной БД. А у меня несколько баз данных. На каждой по минуте - и клиент отваливается, потому что у него тоже свой таймаут.
    18 апреля 2013 г. 7:24
  • "А чем это отличается от того, что я написал?" - тем, что вы не закрываете соединее. и через некоторое время количество объектов в пуле закончится и вы дальше не сможете открывать их.
    18 апреля 2013 г. 7:27
    Модератор
  • А Management Studio или Server Explorer как долго подключаются к вашей базе данных? И как "далеко" от веб приложения она находится (т.е. на том же сервере или на удаленном)?

    Management Studio пытается подключиться около минуты. Все БД - удаленные, в разных частях города. А связь плохая, то есть, то нет. Если связь есть, то соединяется за несколько секунд.
    18 апреля 2013 г. 7:29
  • Дело в том, что тут у вас проблема уровнем высше. Поэтому решение на уровне conn.Open() ничего не даст, т.е. тут вам ничего не сделать. единственно решение, на мой взгляд, это попытка несколько раз отправить или получить данные. Если попытка удачная то успех, иначе пытаемя читать/писать данные ещё раз. Примерно так вам нужно сделать.
    21 апреля 2013 г. 9:27
    Модератор
  • "А чем это отличается от того, что я написал?" - тем, что вы не закрываете соединее. и через некоторое время количество объектов в пуле закончится и вы дальше не сможете открывать их.

    Про закрывание соединения - это частности. Код, что я написал показывает принцип проверки.
    23 апреля 2013 г. 5:50
  • Дело в том, что тут у вас проблема уровнем высше. Поэтому решение на уровне conn.Open() ничего не даст, т.е. тут вам ничего не сделать. единственно решение, на мой взгляд, это попытка несколько раз отправить или получить данные. Если попытка удачная то успех, иначе пытаемя читать/писать данные ещё раз. Примерно так вам нужно сделать.

    Я сделал так. Перед любым запросом вызываю функцию "IsConnectedToInternet". Если соединения нет, то вызываю "throw new TimeoutException()". Всё работает как мне надо:

        public static bool IsConnectedToInternet(string ServerAddress)
        {
            Ping p = new Ping();
            try
            {
                PingReply reply = p.Send(ServerAddress, 5000);
                if (reply.Status == IPStatus.Success)
                    return true;
            }
            catch
            {
                return false;
            }
            //
            return false;
        }

    • Помечено в качестве ответа Andrey Solopko 23 апреля 2013 г. 5:55
    23 апреля 2013 г. 5:55
  • Здравствуйте Андрей,

    Пожалуйста, перестаньте помечать вторичными учетками свои вопросы как полезные. И в целом пользуйтесь одной учетной записью, как указано в правилах форума. 

    Спасибо

    26 апреля 2013 г. 12:17
    Модератор