在PB中实现用WINDOWS API查找局域网内SQLSERVER服务器列表

leio 2006-06-30 03:58:51
在网上查了一些资料,拜读了不少VB、VC、DELPHI写的此类代码,但没找到PB写的。
因此,仿照上面几种语言的代码写了一个PB中可用的。

未做完全测试,仅在公司局域网内简单测试了一下,似乎不错,速度也很快。

需要此功能的可以试试,顺便也在其他系统环境下测试一遍。

我的电脑:XP + SQLSERVER 2000开发版 + PB9.03 build 8614
局域网内有另外三台电脑分别安装了SQLSERVER 2000(开发版、企业版)
测试结果:找出了所有的SQLSERVER的服务名称。
返回值ls_list,各个SQLSERVER服务器是用','分隔的,自己做个拆分函数就可以分解成多个SQLSERVER服务器名称了。

代码如下:

申明API函数:
function int SQLAllocHandle(int hType,long inputHandle,ref long outputHandle) library "odbc32.dll"
function int SQLSetEnvAttr(long henv,int attribute,long valueptr,int strLength) library "odbc32.dll"
function int SQLFreeHandle(int hType,long handle) library "odbc32.dll"
function int SQLBrowseConnect(long hconn,string instring,int instringlength,ref string outstring,int outstringlength,ref int outlengthneeded) library "odbc32.dll"

定义变量:
private int SQL_HANDLE_ENV = 1
private int SQL_HANDLE_DBC = 2
private int SQL_ATTR_ODBC_VERSION = 200
private int SQL_OV_ODBC3 = 3
private int SQL_SUCCESS = 0

private int SQL_NEED_DATA = 99
private int DEFAULT_RESULT_SIZE = 1024
private string SQL_DRIVER_STR = "DRIVER=SQL SERVER"


取SQLSERVER服务器函数主体:

string ls_list
long henv = 0
long hconn = 0
string inString
inString = SQL_DRIVER_STR
string outstring
outstring = fill(' ',DEFAULT_RESULT_SIZE)
integer inStringLength
inStringLength = len(inString)
integer lenNeeded = 0

integer li_start
integer li_len

integer li_return
li_return = SQLAllocHandle(SQL_HANDLE_ENV, henv, henv)
if (SQL_SUCCESS = li_return) then
li_return = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,0)
if (SQL_SUCCESS = li_return) then
li_return = SQLAllocHandle(SQL_HANDLE_DBC, henv, hconn)
if (SQL_SUCCESS = li_return) then
li_return = SQLBrowseConnect(hconn, inString, inStringLength, outString,DEFAULT_RESULT_SIZE,lenNeeded)
if (SQL_NEED_DATA = li_return ) then
if (DEFAULT_RESULT_SIZE < lenNeeded) then
outstring = fill(' ',lenNeeded)
li_return = SQLBrowseConnect(hconn, inString, inStringLength, outString,lenNeeded,lenNeeded)
if (SQL_NEED_DATA <> li_return) then
messagebox('Error',"Unabled to aquire SQL Servers from ODBC driver.")
return
end if
end if
ls_list = outString
li_start = pos(ls_list,"{") + 1
li_len = pos(ls_list,"}") - li_start
if ((li_start > 0) and (li_len > 0)) then
ls_list = mid(ls_list,li_start,li_len)
else
ls_list = ''
end if
end if
end if
end if
end if
if hconn <> 0 then
SQLFreeHandle(SQL_HANDLE_DBC,hconn)
end if
if henv <> 0 then
SQLFreeHandle(SQL_HANDLE_ENV,hconn);
end if
messagebox('SQLSERVER_NAME',ls_list)
return ls_list
...全文
411 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
uponly 2006-07-03
  • 打赏
  • 举报
回复
MARK
Paladin_china 2006-07-03
  • 打赏
  • 举报
回复
不错,速度还是蛮快的
我再看看那
lzheng2001 2006-07-03
  • 打赏
  • 举报
回复
方法1的速度应该快一点! 不错!
leio 2006-07-01
  • 打赏
  • 举报
回复
看到llang在http://community.csdn.net/Expert/topic/4851/4851050.xml?temp=.5199243
这个贴中贴出了另一种方法,这个方法代码简单,但是必须要安装SQLDMO(安装SQLSERVER客户端就可以了)。

integer i,li_count
long ll_status
OLEObject SQLSERVER,SERVERNAME
SQLSERVER=create OLEObject
SERVERNAME=create OLEObject
SQLSERVER.connecttonewobject("SQLDMO.Application")
SERVERNAME.connecttonewobject("SQLDMO.NameList")
SERVERNAME=SQLSERVER.ListAvailableSQLServers
li_count=SERVERNAME.Count
for i=1 to li_count
ddlb_1.additem(SERVERNAME.Item(i))
next



  • 打赏
  • 举报
回复
mark
wwq103 2006-06-30
  • 打赏
  • 举报
回复
mark一下,收藏学习
一手软一手硬 2006-06-30
  • 打赏
  • 举报
回复
辛苦了

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧