鑑於代碼和思想都是抄襲別人的, 這裏只能算作是轉載了
網上有很多獲取SQL SERVER服務器列表的文章, 但事實上很多都是使用SQLDMO, 我自己試了一下, 因爲本地裝了SQL SERVER, 所以用的挺好, 結果部署下去後, 沒有裝SQL SERVER的機子全部不能使用這個功能
也就是說, 要麼你裝個SQL SERVER(我沒有測試是否只要安裝服務端就好), 要麼就不能用SQLDMO, 說的難聽點, 用SQLDMO就是自娛自樂了.
廢話不多說, 直接上代碼了
原文是C#的代碼, 我把它轉成了VB, 方便像我這樣, 比較喜歡VB的同志....
Imports System.Runtime.InteropServices
Imports System.Text
Imports Microsoft.Win32
Imports System.IO
Imports System.Text
Imports Microsoft.Win32
Imports System.IO
Public Class GetServers
<DllImport("odbc32.dll")> _
Private Shared Function SQLAllocHandle(ByVal hType As Short, ByVal inputHandle As IntPtr, <Out()> ByRef outputHandle As IntPtr) As Short
End Function
<DllImport("odbc32.dll")> _
Private Shared Function SQLAllocHandle(ByVal hType As Short, ByVal inputHandle As IntPtr, <Out()> ByRef outputHandle As IntPtr) As Short
End Function
<DllImport("odbc32.dll")> _
Private Shared Function SQLSetEnvAttr(ByVal henv As IntPtr, ByVal attribute As Integer, ByVal valuePtr As IntPtr, ByVal strLength As Integer) As Short
End Function
Private Shared Function SQLSetEnvAttr(ByVal henv As IntPtr, ByVal attribute As Integer, ByVal valuePtr As IntPtr, ByVal strLength As Integer) As Short
End Function
<DllImport("odbc32.dll")> _
Private Shared Function SQLFreeHandle(ByVal hType As Short, ByVal handle As IntPtr) As Short
End Function
Private Shared Function SQLFreeHandle(ByVal hType As Short, ByVal handle As IntPtr) As Short
End Function
<DllImport("odbc32.dll", CharSet:=CharSet.Ansi)> _
Private Shared Function SQLBrowseConnect(ByVal hconn As IntPtr, ByVal inString As StringBuilder, ByVal inStringLength As Short, ByVal outString As StringBuilder, ByVal outStringLength As Short, <Out()> ByRef outLengthNeeded As Short) As Short
End Function
Private Shared Function SQLBrowseConnect(ByVal hconn As IntPtr, ByVal inString As StringBuilder, ByVal inStringLength As Short, ByVal outString As StringBuilder, ByVal outStringLength As Short, <Out()> ByRef outLengthNeeded As Short) As Short
End Function
Private Const SQL_HANDLE_ENV As Short = 1
Private Const SQL_HANDLE_DBC As Short = 2
Private Const SQL_ATTR_ODBC_VERSION As Integer = 200
Private Const SQL_OV_ODBC3 As Integer = 3
Private Const SQL_SUCCESS As Short = 0
Private Const SQL_NEED_DATA As Short = 99
Private Const DEFAULT_RESULT_SIZE As Short = 1024
Private Const SQL_DRIVER_STR As String = "DRIVER=SQL SERVER"
Private Const SQL_HANDLE_DBC As Short = 2
Private Const SQL_ATTR_ODBC_VERSION As Integer = 200
Private Const SQL_OV_ODBC3 As Integer = 3
Private Const SQL_SUCCESS As Short = 0
Private Const SQL_NEED_DATA As Short = 99
Private Const DEFAULT_RESULT_SIZE As Short = 1024
Private Const SQL_DRIVER_STR As String = "DRIVER=SQL SERVER"
Public Shared Function GetServers() As ArrayList
Dim list As String = String.Empty
Dim henv As IntPtr = IntPtr.Zero
Dim hconn As IntPtr = IntPtr.Zero
Dim inString As StringBuilder = New StringBuilder(SQL_DRIVER_STR)
Dim outString As StringBuilder = New StringBuilder(DEFAULT_RESULT_SIZE)
Dim inStringLength As Short = inString.Length
Dim lenNeeded As Short = 0
Try
If (SQL_SUCCESS = SQLAllocHandle(SQL_HANDLE_ENV, henv, henv)) Then
If (SQL_SUCCESS = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, CType(SQL_OV_ODBC3, IntPtr), 0)) Then
If (SQL_SUCCESS = SQLAllocHandle(SQL_HANDLE_DBC, henv, hconn)) Then
If (SQL_NEED_DATA = SQLBrowseConnect(hconn, inString, inStringLength, outString, DEFAULT_RESULT_SIZE, lenNeeded)) Then
If (DEFAULT_RESULT_SIZE < lenNeeded) Then
outString.Capacity = lenNeeded
If (SQL_NEED_DATA <> SQLBrowseConnect(hconn, inString, inStringLength, outString, lenNeeded, lenNeeded)) Then
Throw New ApplicationException("Unabled to aquire SQL Servers from ODBC driver.")
End If
End If
list = outString.ToString()
Dim start As Integer = list.IndexOf("{") + 1
Dim len As Integer = list.IndexOf("}") - start
If ((start > 0) AndAlso (len > 0)) Then
list = list.Substring(start, len)
Else
list = String.Empty
End If
End If
End If
End If
End If
Catch ex As Exception
list = String.Empty
Finally
If (hconn <> IntPtr.Zero) Then
SQLFreeHandle(SQL_HANDLE_DBC, hconn)
End If
If (henv <> IntPtr.Zero) Then
SQLFreeHandle(SQL_HANDLE_ENV, hconn)
End If
End Try
Dim arr() As String = Nothing
Dim arrList As New ArrayList
Dim arrList As New ArrayList
'個人比較喜歡ArrayList, 所以硬是轉了過來
If (list.Length > 0) Then
arr = list.Split(",")
For i As Byte = 1 To arr.Length
arrList.Add(arr(i - 1).ToString)
Next
arrList.Add(arr(i - 1).ToString)
Next
End If
Return arrList
End Function
End Class
由於編輯器的問題, 這裏有些地方多了換行