Thisform.cboStep.AddItem("步驟1-選擇要連接的資料庫服務器")
Thisform.cboStep.AddItem("\步驟2-指定登錄用戶和密碼,并安裝資料庫")
Thisform.cboStep.AddItem("\步驟3-完成")
LOCAL oSQLDMO AS SQLDMO.Application
oSQLDMO=CREATEOBJECT("SQLDMO.Application") &&建立SQLDMO物件
oServerNameList=oSQLDMO.ListAvailableSQLServers()
IF oServerNameList.Count=0 &&未發現可用的服務器
Thisform.pgfStep.Page1.Optiongroup1.Option1.Enabled=.F.
Thisform.pgfStep.Page1.cboServer.Enabled=.F.
Thisform.pgfStep.Page1.Optiongroup1.Value=https://bbs.csdn.net/topics/2
Thisform.pgfStep.Page1.lblStep1.Caption="未找到可用的SQL Server服務器,您可以在"+;
"下面的文本框中自行輸入一個資料庫服務器名稱或IP地址。"
Thisform.pgfStep.Page1.txtServer.SetFocus
ELSE
Thisform.pgfStep.Page1.txtServer.Enabled=.F.
FOR i=1 TO oServerNameList.Count &&添加服務器名到下拉選項框串列
Thisform.pgfStep.Page1.cboServer.AddItem(oServerNameList.Item(i))
ENDFOR
Thisform.pgfStep.Page1.cboServer.Value=https://bbs.csdn.net/topics/oServerNameList.Item(1)
Thisform.pgfStep.Page1.lblStep1.Caption="您可以直接從下面的下拉選項框中直接選擇"+;
"一個服務器名稱,如果您所需要的服務器沒有被包含在串列中,可以直接在下面的文"+;
"本框中手工輸入。"
Thisform.pgfStep.Page1.cboServer.SetFocus
ENDIF
uj5u.com熱心網友回復:
列舉局域網內所有的 SQL Server 服務器實體名
*---------------------------------------
by:dkfdtf
出處:http://blog.csdn.net/dkfdtf/archive/2009/02/02/3859150.aspx
如果希望檢查一個指定名稱的 SQL Server 服務器是否存在,或希望給用戶一個自己挑選需要連接的 SQL 服務器的話,就需要先列舉出局域網內所有的 SQL Server 服務器實體名稱。我所知的方法有三種:
-----------------------------------------------------------------------------------------
1. 使用 SQLDMO 物件的 ListAvailableSQLServers 方法
loSqlDMO=Createobject("SQLDMO.Application")
loSvrs=loSqlDMO.ListAvailableSQLServers()
lnSvrsCount=loSvrs.Count
If lnSvrsCount=0
?"沒有找到可用的 SQL Server 服務器。"
Else
?"可連接的 SQL Server 服務器:"+Transform(lnSvrsCount)+"個,分別為:"
For Each lcSvr In loSvrs
?lcSvr
Endfor
Endif
Release loSqlDMO
此方法最簡單,功能也完整,可以列舉出預設和非預設實體名的所有 SQL Server 實體。缺點是運行代碼的機器上必須安裝了 sqldmo 物件組件,如果機器上已安裝了 sql server,或者你自行安裝了這個組件自然沒問題,然而如果是一普通的客戶端,它只需要連接到 SQL 服務器上取資料,或者你只是想在安裝 SQL Server 前檢查安裝環境,則可能因為沒有這個組件而無法達到目的。
-----------------------------------------------------------------------------------------
2. 使用 api 函式 NetServerEnum 列舉指定型別的服務器
#Define MAX_PREFERRED_LENGTH -1
#Define SV_TYPE_SQLSERVER 0x00000004
Declare Long NetServerEnum In netapi32 ;
string ServerName, Long nlevel, Long @ bufptr, Long prefmaxlen, ;
long @ entriesread, Long @ totalentries, Long servertype, ;
string domain, Long resume_handle
Declare Long NetApiBufferFree In netapi32 Long bufptr
Declare Long lstrlenW In win32api String @ lpString
Store 0 To lnBuff, lnReadNums, lnTotNums
If 0 == NetServerEnum( Null, 100, @ lnBuff, MAX_PREFERRED_LENGTH, ;
@ lnReadNums, @ lnTotNums, SV_TYPE_SQLSERVER, Null, 0) ;
and lnReadNums > 0
? '找到的 SQL Server 實體:'
For ii = 1 To lnReadNums
m.lnAddr = CToBin(Sys(2600, m.lnBuff + (m.ii-1)*8 + 4, 4), 'rs')
m.lcSrv = Sys(2600, m.lnAddr, 256)
? Left(Strconv(m.lcSrv, 6), lstrlenW(m.lcSrv))
Endfor
Else
? '沒有找到可用的 SQL Server 實體。'
Endif
If lnBuff > 0
NetApiBufferFree(lnBuff)
Endif
這只是一段簡單的代碼,沒有任何錯誤處理。這個 api 函式也可以檢測出所有可用(服務啟動)的 SQL Server 服務器,優點是速度快,不需要安裝任何附加的組件,缺點是無法列出非預設安裝時的實體名,而且有時 SQL 服務啟動后要很久才能探測到。
-----------------------------------------------------------------------------------------
3. 使用 ODBC api 函式列舉指定型別的服務器
#Define SQL_HANDLE_ENV 1
#Define SQL_HANDLE_DBC 2
#Define SQL_NULL_HANDLE 0
#Define SQL_SUCCESS 0
#Define SQL_SUCCESS_WITH_INFO 1
#Define SQL_NEED_DATA 99
#Define SQL_ERROR -1
#Define SQL_INVALID_HANDLE -2
#Define SQL_ATTR_ODBC_VERSION 200
#Define SQL_OV_ODBC3 3
#Define SQL_NTS -3
#Define ENUM_SERVERS_MAX_RET_LENGTH -1
lcDrvName = 'Driver={SQL Server}'
lcLookUpKey = 'SERVER:Server='
Declare short SQLAllocHandle In odbc32 ;
short HandleType, Long InputHandle, Long @ OutputHandlePtr
Declare short SQLSetEnvAttr In odbc32 ;
long EnvironmentHandle, Long nAttribute, Long ValuePtr, Long StringLength
Declare short SQLBrowseConnect In odbc32 ;
long ConnectionHandle, String InConnectionString, short StringLength1, ;
String @ OutConnectionString, short BufferLength, short @ StringLength2Ptr
Declare short SQLDisconnect In odbc32 As _SQLDisconnect ;
long ConnectionHandle
Declare short SQLFreeHandle In odbc32 ;
long HandleType, Long Handle
* Allocate the environment handle
hSQLEnv = 0
lnResult = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, @ hSQLEnv)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
* Set the environment attribute to SQL_OV_ODBC3
lnResult = SQLSetEnvAttr(hSQLEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
* Allocate a connection handle
hSQLHdbc = 0
lnResult = SQLAllocHandle(SQL_HANDLE_DBC, hSQLEnv, @ hSQLHdbc)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
szConnStrOut = Replicate(Chr(0), 256)
lnLen = 0
* Call SQLBrowseConnect for additional information
lnResult = SQLBrowseConnect( ;
hSQLHdbc, lcDrvName, SQL_NTS, ;
@ szConnStrOut, 256, @ lnLen)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_NEED_DATA)
ListSqlServersList(Left(szConnStrOut, lnLen), lcLookUpKey)
Endif
_SQLDisconnect(hSQLHdbc)
Endif
SQLFreeHandle(SQL_HANDLE_DBC, hSQLHdbc)
Endif
Endif
SQLFreeHandle(SQL_HANDLE_ENV, hSQLEnv)
Function ListSqlServersList(tcConnectString, tcLookUpKey)
Local ii, lcSvrs, lcSvr, lcMsg, laSvrs[1]
For m.ii = 1 To Getwordcount(tcConnectString, ';') + 1
lcSvrs = Getwordnum(tcConnectString, m.ii, ';')
If Atc(tcLookUpKey, lcSvrs) > 0
Exit
Else
lcSvrs = ''
Endif
Endfor
lcSvrs = Strextract(lcSvrs, '{', '}')
If Alines(laSvrs, lcSvrs, 1+4, ',') > 0
lcMsg = '找到下面的 SQL Server 實體:'
For m.ii = 1 To Alen(laSvrs)
lcMsg = lcMsg + Chr(13) + Transform(m.ii) + Chr(9) + laSvrs[m.ii]
Endfor
Messagebox(lcMsg)
Else
Messagebox('沒有找到可用的 SQL Server 實體。')
Endif
Endfunc
#Define SQL_HANDLE_ENV 1
#Define SQL_HANDLE_DBC 2
#Define SQL_NULL_HANDLE 0
#Define SQL_SUCCESS 0
#Define SQL_SUCCESS_WITH_INFO 1
#Define SQL_NEED_DATA 99
#Define SQL_ERROR -1
#Define SQL_INVALID_HANDLE -2
#Define SQL_ATTR_ODBC_VERSION 200
#Define SQL_OV_ODBC3 3
#Define SQL_NTS -3
#Define ENUM_SERVERS_MAX_RET_LENGTH -1
lcDrvName = 'Driver={SQL Server}'
lcLookUpKey = 'SERVER:Server='
Declare short SQLAllocHandle In odbc32 ;
short HandleType, Long InputHandle, Long @ OutputHandlePtr
Declare short SQLSetEnvAttr In odbc32 ;
long EnvironmentHandle, Long nAttribute, Long ValuePtr, Long StringLength
Declare short SQLBrowseConnect In odbc32 ;
long ConnectionHandle, String InConnectionString, short StringLength1, ;
String @ OutConnectionString, short BufferLength, short @ StringLength2Ptr
Declare short SQLDisconnect In odbc32 As _SQLDisconnect ;
long ConnectionHandle
Declare short SQLFreeHandle In odbc32 ;
long HandleType, Long Handle
* Allocate the environment handle
hSQLEnv = 0
lnResult = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, @ hSQLEnv)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
* Set the environment attribute to SQL_OV_ODBC3
lnResult = SQLSetEnvAttr(hSQLEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
* Allocate a connection handle
hSQLHdbc = 0
lnResult = SQLAllocHandle(SQL_HANDLE_DBC, hSQLEnv, @ hSQLHdbc)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)
szConnStrOut = Replicate(Chr(0), 256)
lnLen = 0
* Call SQLBrowseConnect for additional information
lnResult = SQLBrowseConnect( ;
hSQLHdbc, lcDrvName, SQL_NTS, ;
@ szConnStrOut, 256, @ lnLen)
If (lnResult == SQL_SUCCESS Or lnResult == SQL_NEED_DATA)
ListSqlServersList(Left(szConnStrOut, lnLen), lcLookUpKey)
Endif
_SQLDisconnect(hSQLHdbc)
Endif
SQLFreeHandle(SQL_HANDLE_DBC, hSQLHdbc)
Endif
Endif
SQLFreeHandle(SQL_HANDLE_ENV, hSQLEnv)
Function ListSqlServersList(tcConnectString, tcLookUpKey)
Local ii, lcSvrs, lcSvr, lcMsg, laSvrs[1]
For m.ii = 1 To Getwordcount(tcConnectString, ';') + 1
lcSvrs = Getwordnum(tcConnectString, m.ii, ';')
If Atc(tcLookUpKey, lcSvrs) > 0
Exit
Else
lcSvrs = ''
Endif
Endfor
lcSvrs = Strextract(lcSvrs, '{', '}')
If Alines(laSvrs, lcSvrs, 1+4, ',') > 0
lcMsg = '找到下面的 SQL Server 實體:'
For m.ii = 1 To Alen(laSvrs)
lcMsg = lcMsg + Chr(13) + Transform(m.ii) + Chr(9) + laSvrs[m.ii]
Endfor
Messagebox(lcMsg)
Else
Messagebox('沒有找到可用的 SQL Server 實體。')
Endif
Endfunc
這個 ODBC api 函式族兼顧了方法1和2的部分優點,同樣不需要任何附加的安裝組件,同時又可以列出所有預設和非預設安裝的實體名,只是速度跟方法 1 差不多。
uj5u.com熱心網友回復:
謝謝老師指導。試了好多次,還是用第一個方法解決了。可能組件安裝有問題。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/116654.html
標籤:VFP
上一篇:一條SQL陳述句加索引更慢了
下一篇:財智軟體資料庫打不開
