Kodeeswaran V Duraisamy Ответов: 4

Проверка правильности SQL-соединения


У меня есть VB.NET применение. Это приложение постоянно находится в памяти и сведено к минимуму в области лотка, потому что мы используем его очень часто. Проблема возникает, когда мы ВПН заходим на сайт клиента. Эти VPN-соединения уничтожают все другие сетевые подключения к нашим машинам и от них.

Тогда каждый раз, когда мой VB.NET приложение обновляет свою базу данных, начинают возникать ошибки, потому что машина потеряла связь с SQL-сервером, однако они происходят не на уровне соединения, а только тогда, когда читатель пытается читать.

Я проверяю connection. open, но из-за пула соединений SQL я просто получаю предыдущее соединение, которое было действительным до того, как сеть была отключена. Есть ли в любом случае возможность проверить, является ли действительным фактическое SQL-соединение, прежде чем повторно выдавать соединение из пула?

Я создал отдельное приложение, чтобы протестировать решение этой проблемы. (ниже)
Если нет соединения с первой попытки, я получаю ошибку, но если первое соединение действительно, а затем я физически отключаю кабель локальной сети, я все равно получаю полностью успешное соединение. Мне нужно быть уверенным, что это соединение действительно допустимо, или создать исключение, которое я могу перехватить и обработать до попытки выполнения транзакций на SQL-сервере. Если нет, мне придется отключить Объединение, что немного замедлит процесс :-(
Imports System.Data.SqlClient
Public Class Form1
Public Conn As New SqlConnection

Private Sub OpenConnection
     if conn.state <> 1 then 'actually here the problem ***
        conn.open
     endif
End sub

End Class


*** - на самом деле соединение уже разорвано при отсоединении кабеля локальной сети, но оно показывает открытое

4 Ответов

Рейтинг:
31

bluesathish

Привет,
Для сломанной ссылки я надеюсь, что будет работать следующее условие,

If conn.State = ConnectionState.Broken Then
 'Do your codes
End If


С уважением,
Синеватый


Kodeeswaran V Duraisamy

нет, он не работает-conn. state все еще показывает open, но когда я что-то читаю, он выдает ошибку! вот в чем вопрос.

Рейтинг:
2

Kschuler

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

----------- Обновление ----------------

Вот примерно о чем я говорю:

Dim intErrorCount As Integer = 0
Try
    'Perform a read
Catch ex As Exception
    Select Case intErrorCount
        Case 0
            'Reopen the connection
        Case Else
            'Handle the error
            MsgBox("Error: " & ex.Message)
    End Select
    intErrorCount += 1
End Try


Почему это не работает для вас? Что происходит, когда вы пытаетесь получить доступ к БД, а соединение на самом деле не открыто? Он просто ошибается, верно?


Kodeeswaran V Duraisamy

я обновил вопрос - пожалуйста, пройдите через него.

Kschuler

Я обновил свое решение.

Рейтинг:
1

Kodeeswaran V Duraisamy

Я использую какой-то трюк, чтобы решить эту проблему

Private Sub OpenConnection
      Keep_Alive(conn)
End sub

Private Sub Keep_Alive(ByRef Conn As SqlConnection)
    On Error Resume Next
    Conn.Open()
End Sub


Рейтинг:
0

Azlan Ismun

Измените 192.168.1.125 на свой IP

Imports System.Net
Imports System.Net.Sockets

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If My.Computer.Network.Ping("192.168.1.125") = True Then
            MsgBox("Ping echo")
        Else
            MsgBox("No ping echo")
        End If
    End Sub


    Private Function IsSQLServerAvailable(ByVal ipaddress As String, ByVal Port As String) As Boolean
        Try
            Dim tcpCli1 As New TcpClient
            tcpCli1.SendTimeout = 15
            tcpCli1.Connect(ipaddress, Port)
            tcpCli1.Close()
            tcpCli1 = Nothing
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If IsSQLServerAvailable("192.168.1.125", "1433") = True Then
            MsgBox("Tested OK")
        Else
            MsgBox("Tested Not OK")
        End If
    End Sub
End Class


Richard MacCutchan

Ответ на этот вопрос был дан почти 3 года назад. Пожалуйста,не пишите в старых вопросах.