有时,当我的客户打开或重新启动计算机并直接打开我的vb.net应用程序时,应用程序会在SQL Server完全启动之前打开。
这会导致许多意外行为。为了避免这种情况,我需要启动一个启动画面并检查其中的SQL Server状态,并且只有当SQL Server状态指示它已完全加载时,我才能运行整个应用程序。
问题是:如何检查SQL Server状态,是否已完成加载?整个SQL Server,而不是数据库。
答案 0 :(得分:0)
您可以在启动窗体中实例化一个计时器,检查它是否可以每秒(或您喜欢的任何时间间隔)登录数据库。我将启动窗体调用为模式,因此调用应用程序无法继续,直到启动窗体检测到连接并自行关闭。
至少您需要服务器名称来检查连接。如果它使用的是命名实例,那么服务器名称还应该包含格式为" myserver \ myinstance"的实例名称。
我已经在3个重载函数 IsConnected 中封装了连接检查逻辑。您可以在启动表单中使用这些函数来检查计时器滴答的连接。 (每个都取决于下一个)。您可以根据您可用的输入项目使用适合的任何函数重载。
对于第一次重载,如果应用程序在可以连接到数据库服务器的Windows安全上下文下运行,那么您不需要提供用户名和密码(作为空字符串传递),否则您需要提供登录数据库服务器所需的凭据。或者,您可以为其他重载提供自己的连接字符串或连接对象。
(启动表单中的代码)...
Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
If Me.IsConnected("(local)\SQL2008R2", "", "") Then Me.Close()
End Sub
Public Function IsConnected(ServerName As String, UserID As String, Password As String) As Boolean
Dim connStr As String = String.Format("Data Source={0}", ServerName)
If Not String.IsNullOrEmpty(UserID) Then
connStr &= String.Format(";User ID={0};Password={1}", UserID, Password)
Else
connStr &= ";Integrated Security=True"
End If
Return IsConnected(connStr)
End Function
Public Function IsConnected(Connection As String) As Boolean
Static conn As SqlConnection
If conn Is Nothing Then
conn = New SqlConnection(Connection)
conn.Open()
End If
Return IsConnected(conn)
End Function
Public Function IsConnected(ByRef Conn As SqlConnection) As Boolean
If Conn IsNot Nothing Then Return (Conn.State = ConnectionState.Open)
Return False
End Function
我从主应用程序调用启动窗体作为模式对话框,因此应用程序将被阻止,直到检测到连接为止。
(来自调用应用程序表单...)
frm_Splash.ShowDialog()