powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Доступные SQL-сервера
25 сообщений из 31, страница 1 из 2
Доступные SQL-сервера
    #32308218
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно просканировать локалку на доступные SQL-сервера. Как ента реализовать? Буду очь признателен за подсказку.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308243
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, через SQLDMO. Включаешь в проект ссылку на Microsoft SQLDMO Object Library и... (с использованием листбокса)

Dim i As Integer
Dim CountSQL As Integer
Dim Sql As SQLDMO.Application

Set Sql = New SQLDMO.Application
CountSQL = Sql.ListAvailableSQLServers.Count
MsgBox "Найдено " & CStr(CountSQL) & " SQL серверов."
For i = 1 To CountSQL
List1.AddItem Sql.ListAvailableSQLServers.Item(i)
Next i
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308272
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/30639&hl=%f1%ef%e8%f1%ee%ea
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308304
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромный спасиб tpg и Shkurenko Alexander за ответы, очь пригодилось...
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308310
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 tpg
да пользовался dmo неоднократно (например, определение имеющися баз на сервере, объектов в базе и тд. и тп.), но до этого чего нехватило... документации по dmo 0, всё методом тыка...
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308311
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так будет раз в 20 пошустрее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim i As Integer
Dim CountSQL As Integer
Dim Sql As SQLDMO.Application
Dim Srv As SQLDMO.NameList
    
Set Sql = New SQLDMO.Application
Set Srv = Sql.ListAvailableSQLServers
CountSQL = Sql.ListAvailableSQLServers.Count
For i =  1  To CountSQL
    List1.AddItem Srv.Item(i)
Next i
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308321
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что такое (что то туплю сегодня) - так ещё чуть-чуть пошустрее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim i As Integer
Dim CountSQL As Integer
Dim Sql As SQLDMO.Application
Dim Srv As SQLDMO.NameList
    
Set Sql = New SQLDMO.Application
Set Srv = Sql.ListAvailableSQLServers
CountSQL = Srv.Count
For i =  1  To CountSQL
    List1.AddItem Srv.Item(i)
Next i
А доку можно и в BOL-е почитать и MSDN-е.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308327
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был этот пример иль не был - но SQLDMO не нужно (и не на всяком клиенте он есть) - only API
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
Option Compare Database
Option Explicit

'This tip shows you how to retrieve a list of SQL Servers on your local LAN.
' http://c85.cemi.rssi.ru/Access/TipDetail.idc?TipID= 58 
'какие SQL-сервера есть в сети

Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long

Private Declare Function NetServerEnum Lib "netapi32" ( _
                                                       strServername As Any, _
                                                       ByVal level As Long, _
                                                       bufptr As Long, _
                                                       ByVal prefmaxlen As Long, _
                                                       entriesread As Long, _
                                                       totalentries As Long, _
                                                       ByVal servertype As Long, _
                                                       strDomain As Any, _
                                                       resumehandle As Long) As Long

Private Declare Function NetApiBufferFree Lib "Netapi32.dll" (ByVal lpBuffer As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Const SV_TYPE_SERVER As Long = &H2
Private Const SV_TYPE_SQLSERVER As Long = &H4
Private Const ñon_strNameYouDomain As String = "Knauf_moscow"    ' 232 ; 236 ; 255 ;  226 ; 224 ; 248 ; 229 ; 227 ; 238 ;  228 ; 238 ; 236 ; 229 ; 237 ; 224 ;
Private Type SV_100
    platform As Long
    name As Long
End Type

Public Sub GetSQLServers()
'
' You could change this to be a function returning
' a list of the SQL servers in a ADOR Recordset or an array etc.
'
' At present, it just does a debug.print of all the
' SQL servers on the network.
'
'
    Dim l As Long
    Dim entriesread As Long
    Dim totalentries As Long
    Dim hREsume As Long
    Dim bufptr As Long
    Dim level As Long
    Dim prefmaxlen As Long
    Dim lType As Long
    Dim domain() As Byte
    Dim i As Long
    Dim sv100 As SV_100

    level =  100 
    prefmaxlen = - 1 

    lType = SV_TYPE_SQLSERVER
    domain =  241 ;on_strNameYouDomain & vbNullChar
    l = NetServerEnum(ByVal  0 &, _
                      level, _
                      bufptr, _
                      prefmaxlen, _
                      entriesread, _
                      totalentries, _
                      lType, _
                      domain( 0 ), _
                      hREsume)

    If l =  0  Or l =  234 & Then
        For i =  0  To entriesread -  1 
            CopyMemory sv100, ByVal bufptr, Len(sv100)
            Debug.Print Pointer2stringw(sv100.name)
            bufptr = bufptr + Len(sv100)
        Next i
    End If
    NetApiBufferFree bufptr
    '
End Sub

Private Function Pointer2stringw(ByVal l As Long) As String
    Dim buffer() As Byte
    Dim nLen As Long
    '
    nLen = lstrlenW(l) *  2 
    If nLen Then
        ReDim buffer( 0  To (nLen -  1 )) As Byte
        CopyMemory buffer( 0 ), ByVal l, nLen
        Pointer2stringw = buffer
    End If
End Function


Правда этот пример Сайбейсовские сервера за мс скульные считает - хотя все они из одной п... родом. Возможно и еще что нить прихватит (оракл какой нибудь)
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308335
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 tpg
а такой цикл будет быстрее?


Dim Sql As SQLDMO.Application
Dim Srv As SQLDMO.NameList

Set Sql = New SQLDMO.Application
Set Srv = Sql.ListAvailableSQLServers

For Each i in srv
List1.AddItem i
Next i
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308382
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня (думаю из-за вариантного типа i) получилось на 0,01мс медленнее чем в предыдущем примере. Вообще то основной тормоз происходит в строке
Set Srv = Sql.ListAvailableSQLServers
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308388
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Senin Viktor
да нету у меня других серверов в локалке акромя sql. А скорость (в сравнении с dmo)?
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308405
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А скорость (в сравнении с dmo)?

Думаю, API будет гораздо быстрей. Проверить легко же.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308445
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну лана..... спасибки, вы - настоящие други....
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308907
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-DMO работаел лучше всего(корректней), едиснтвенный минус библиотеку с собой таскать :-(. API NetServerEnum не работает в Win9x :-( да и наименование ие оного не определяет (пр. comp01\TestSerever - выдаст результат comp01).
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308951
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SQL-DMO работаел лучше всего(корректней,

А не на основе ли то же айпи функции она и работает?
Код: plaintext
1.
2.
3.
4.
5.
6.
For a client running on the Microsoft® Windows®  95  or Windows  98  operating 
system, the SQLOLEDB enumerator cannot enumerate the list of servers running 
Microsoft SQL Server™  2000  because the enumerator uses the NetServerEnum 
API. This API is not available for the Windows  95  and Windows  98  operating 
systems (it is available only for the Microsoft Windows NT®  4 . 0  and Windows  2000  
operating systems).

source: //ms-help://MS.MSDNQTR.2003OCT.1033/oledbsql/9_ole_34_3tma.htm

>да и наименование ие оного не определяет (пр. comp01\TestSerever - выдаст результат comp01).

как и SQLDMO
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32308997
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все уже решили, ну и я свои 7 копеек вставлю с вашего позволения:

Код: plaintext
1.
2.
For Each i in srv 
List1.AddItem i 
Next 'i


В счетчике "i" не нужно. Next и без него работает, даже быстрее :). Как обычно - борьба за миллисекунды :).


Magnus
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32309287
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Senin Viktor

Пасибо за уточнение.

>> да и наименование ие оного не определяет (пр. comp01\TestSerever - выдаст результат comp01)
> как и SQLDMO

получить имена SQL Servers мне удалось только с помощью SQL-DMO, кстати его же использует Query Analyzer - диалог Connect to SQL Server-> кнопочка ... . Ну а при использовании NetServerEnum только имена компьютеров. Может попробуешь получить имена, с помощью NetServerEnum, а то вдруг я какую-нибудь мелочь пропустил.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #32309416
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Shkurenko Alexander
> Ну а при использовании NetServerEnum только имена компьютеров

Т.е. пример кода, который я привел возратил имена ПК?
Может там какая-нибудь заморочка из-за NamidPipes/TCP-IP ? У меня сервер по TCP общается NamedPipes отключено.
==
Константа lType = SV_TYPE_SQLSERVER должна по идее указать на возрат имен серверов. Если использовать lType = SV_TYPE_SERVER - то вернет имена всех ПК.
===
Все константы (из Netapi32.lib)

SV_TYPE_WORKSTATION All workstations
SV_TYPE_SERVER All computers that have the server service running
SV_TYPE_SQLSERVER Any server running with Microsoft SQL Server
SV_TYPE_DOMAIN_CTRL Primary domain controller
SV_TYPE_DOMAIN_BAKCTRL Backup domain controller
SV_TYPE_TIME_SOURCE Server running the Timesource service
SV_TYPE_AFP Apple File Protocol servers
SV_TYPE_NOVELL Novell servers
SV_TYPE_DOMAIN_MEMBER LAN Manager 2.x domain member
SV_TYPE_LOCAL_LIST_ONLY Servers maintained by the browser. See the following Remarks section.
SV_TYPE_PRINTQ_SERVER Server sharing print queue
SV_TYPE_DIALIN_SERVER Server running dial-in service
SV_TYPE_XENIX_SERVER Xenix server
SV_TYPE_SERVER_MFPN Microsoft File and Print for NetWare
SV_TYPE_NT Windows NT workstation or server
SV_TYPE_WFW Server running Windows for Workgroups
SV_TYPE_SERVER_NT Server that is not a domain controller
SV_TYPE_POTENTIAL_BROWSER Server that can run the browser service
SV_TYPE_BACKUP_BROWSER Server running a browser service as backup
SV_TYPE_MASTER_BROWSER Server running the master browser service
SV_TYPE_DOMAIN_MASTER Server running the domain master browser
SV_TYPE_DOMAIN_ENUM Primary domain
SV_TYPE_WINDOWS Windows 95 or later
SV_TYPE_ALL All servers
SV_TYPE_TERMINALSERVER Terminal Server
SV_TYPE_CLUSTER_NT Server clusters available in the domain
SV_TYPE_CLUSTER_VS_NT Cluster virtual servers available in the domain.
Windows 2000/NT: This value is not supported.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Доступные SQL-сервера
    #33574841
MarinaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Есть такой код :

Dim oSQLServerDMOApp As SQLDMO.Application
Dim namX As NameList
Dim intI%
Set oSQLServerDMOApp = New SQLDMO.Application

Set namX = oSQLServerDMOApp.ListAvailableSQLServers
If namX.Count <> 0 Then
For intI = 1 To namX.Count
contrSQLList.AddItem namX.Item(intI)
Next
End If

Всё чудесно работает, кроме того, что он не возвращает имена instance - ServerName\InstanceName. Я имею ввиду случай, когда на одной машине несколько инстансов... Посоветуйте, как быть?
Заранее спасибочки.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33574861
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33575926
MarinaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверила - инстансы не приносит. Возвращает то же, что и DMO .
Может, это зависит от настроек системы? Я заметила что DMO иногда приносит инстансы, а иногда - нет. Тот же самый код. Есть какие-нибудь идеи, с чем это может быть связано?
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33575959
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaKПроверила - инстансы не приносит. Возвращает то же, что и DMO
Что значит не приносит? У меня этот код работает несколько месяцев, вот доказательство:
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33575965
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaKПроверила - инстансы не приносит. Возвращает то же, что и DMO
Что значит не приносит? У меня этот код работает несколько месяцев, прилагаю доказательство.
Выложите свой проект.
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33582367
MarinaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это Ваш код
Public Function GetSQLServersList(contrSQLList As Object) As String
Const ODBC_ERR_MSG = "Error to call ODBC. Please install vertion of MDAC"

Dim retCode As Integer
Dim hDbc As Long
Dim hEnv As Long
Dim strCon As String
Dim strOutCon As String
Dim intConLenOut As Integer
Dim lngPz1 As Long
Dim lngPz2 As Long
Dim names() As String
Dim intI As Integer
strCon = "DRIVER={SQL Server};"
strOutCon = Space$(10000)
retCode = SQLAllocEnv(hEnv)
If retCode <> SQL_SUCCESS And retCode <> SQL_SUCCESS_WITH_INFO Then
MsgBox ODBC_ERR_MSG
Exit Function
End If
retCode = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hDbc)
If retCode <> SQL_SUCCESS And retCode <> SQL_SUCCESS_WITH_INFO Then
MsgBox ODBC_ERR_MSG
Exit Function
End If
retCode = SQLBrowseConnect(hDbc, strCon, Len(strCon), strOutCon, Len(strOutCon) + 2, intConLenOut)
strOutCon = Left$(strOutCon, intConLenOut)
lngPz1 = InStr(strOutCon, "Server={")
If lngPz1 > 0 Then
lngPz1 = lngPz1 + 8
lngPz2 = InStr(strOutCon, "}")
If lngPz2 > lngPz1 Then
GetSQLServersList = Mid$(strOutCon, lngPz1, lngPz2 - lngPz1)
End If
End If
retCode = SQLDisconnect(hDbc)
retCode = SQLFreeConnect(hDbc)
retCode = SQLFreeEnv(hEnv)
names = Split(GetSQLServersList, ",")
For intI = 0 To UBound(names) - 1
contrSQLList.AddItem names(intI)
Next
End Function
...
Рейтинг: 0 / 0
Доступные SQL-сервера
    #33583243
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, спасибо, это мой код. И он работает, как показано выше.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Доступные SQL-сервера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]