利用API獲取局域網SQL SERVER服務器地址

鑑於代碼和思想都是抄襲別人的, 這裏只能算作是轉載了
 
網上有很多獲取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
 
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 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
    <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 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"
    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
 
        '個人比較喜歡ArrayList, 所以硬是轉了過來
        If (list.Length > 0) Then
            arr = list.Split(",")
            For i As Byte = 1 To arr.Length
                arrList.Add(arr(i - 1).ToString)
            Next
        End If
        Return arrList
    End Function

End Class
 
 
由於編輯器的問題, 這裏有些地方多了換行
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章