提供一个类给你,调用类的静态方法GetServers()即可public class SqlLocator { [System.Runtime.InteropServices.DllImport("odbc32.dll")] private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle); [System.Runtime.InteropServices.DllImport("odbc32.dll")] private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength); [System.Runtime.InteropServices.DllImport("odbc32.dll")] private static extern short SQLFreeHandle(short hType, IntPtr handle); [System.Runtime.InteropServices.DllImport("odbc32.dll",CharSet= System.Runtime.InteropServices.CharSet.Ansi)] private static extern short SQLBrowseConnect(IntPtr hconn, System.Text.StringBuilder inString, short inStringLength, System.Text.StringBuilder outString, short outStringLength, out short outLengthNeeded); private const short SQL_HANDLE_ENV = 1; private const short SQL_HANDLE_DBC = 2; private const int SQL_ATTR_ODBC_VERSION = 200; private const int SQL_OV_ODBC3 = 3; private const short SQL_SUCCESS = 0; private const short SQL_NEED_DATA = 99; private const short DEFAULT_RESULT_SIZE = 1024; private const string SQL_DRIVER_STR = "DRIVER=SQL SERVER"; private SqlLocator(){} /// <summary> /// 获取网内的数据库服务器名称,是一个字符串数组。 /// </summary> /// <returns></returns> public static string[] GetServers() { string list = string.Empty; IntPtr henv = IntPtr.Zero; IntPtr hconn = IntPtr.Zero; System.Text.StringBuilder inString = new System.Text.StringBuilder(SQL_DRIVER_STR); System.Text.StringBuilder outString = new System.Text.StringBuilder(DEFAULT_RESULT_SIZE); short inStringLength = (short) inString.Length; short lenNeeded = 0; try { if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv)) { if (SQL_SUCCESS == SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(IntPtr)SQL_OV_ODBC3,0)) { if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn)) { if (SQL_NEED_DATA == SQLBrowseConnect(hconn, inString, inStringLength, outString, DEFAULT_RESULT_SIZE, out lenNeeded)) { if (DEFAULT_RESULT_SIZE < lenNeeded) { outString.Capacity = lenNeeded; if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString, lenNeeded,out lenNeeded)) { throw new ApplicationException("Unabled to aquire SQL Servers from ODBC driver."); } } list = outString.ToString(); int start = list.IndexOf("{") + 1; int len = list.IndexOf("}") - start; if ((start > 0) && (len > 0)) { list = list.Substring(start,len); } else { list = string.Empty; } } } } } } catch { list = string.Empty; } finally { if (hconn != IntPtr.Zero) { SQLFreeHandle(SQL_HANDLE_DBC,hconn); } if (henv != IntPtr.Zero) { SQLFreeHandle(SQL_HANDLE_ENV,hconn); } } string[] array = null; if (list.Length > 0) { array = list.Split(','); } return array; } }
'得到SQL服务器的列表 '必须安装SQL SERVER 2000 SP2 及以上版本Dim I As Short Dim sqlApp As New SQLDMO.Application() Dim ServerName As SQLDMO.NameList ServerName = sqlApp.ListAvailableSQLServers For i = 1 To ServerName.Count cbServer.Items.Add(ServerName.Item(i)) Next 得到指定SQL服务器所有数据库的列表:'得到指定SQL服务器所有数据库的列表Dim sqlApp As New SQLDMO.Application() Dim oServer As New SQLDMO.SQLServer() oServer.Connect('(local)', 'sa', 'sa') cboDatabase.Items.Clear() Dim db As SQLDMO.Database For Each db In oServer.Databases Me.cboDatabase.Items.Add(db.Name) Next 调用COM组件中的SQLDMO(SQL Distributed Management Objects做个循环判断下就OK了
to yuan135() 你的那GetServers()方法在SqlLocator 类里面,我怎么调用 啊
ms-help://MS.MSDNQTR.2003FEB.2052/sqldmo/dmoref_m_e_8lpl.htm
private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
[System.Runtime.InteropServices.DllImport("odbc32.dll")]
private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
[System.Runtime.InteropServices.DllImport("odbc32.dll")]
private static extern short SQLFreeHandle(short hType, IntPtr handle);
[System.Runtime.InteropServices.DllImport("odbc32.dll",CharSet= System.Runtime.InteropServices.CharSet.Ansi)]
private static extern short SQLBrowseConnect(IntPtr hconn, System.Text.StringBuilder inString,
short inStringLength, System.Text.StringBuilder outString, short outStringLength,
out short outLengthNeeded); private const short SQL_HANDLE_ENV = 1;
private const short SQL_HANDLE_DBC = 2;
private const int SQL_ATTR_ODBC_VERSION = 200;
private const int SQL_OV_ODBC3 = 3;
private const short SQL_SUCCESS = 0; private const short SQL_NEED_DATA = 99;
private const short DEFAULT_RESULT_SIZE = 1024;
private const string SQL_DRIVER_STR = "DRIVER=SQL SERVER";
private SqlLocator(){} /// <summary> /// 获取网内的数据库服务器名称,是一个字符串数组。 /// </summary> /// <returns></returns> public static string[] GetServers() { string list = string.Empty;
IntPtr henv = IntPtr.Zero;
IntPtr hconn = IntPtr.Zero;
System.Text.StringBuilder inString = new System.Text.StringBuilder(SQL_DRIVER_STR);
System.Text.StringBuilder outString = new System.Text.StringBuilder(DEFAULT_RESULT_SIZE);
short inStringLength = (short) inString.Length;
short lenNeeded = 0; try {
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv)) {
if (SQL_SUCCESS == SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(IntPtr)SQL_OV_ODBC3,0)) {
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn)) {
if (SQL_NEED_DATA == SQLBrowseConnect(hconn, inString, inStringLength, outString,
DEFAULT_RESULT_SIZE, out lenNeeded)) {
if (DEFAULT_RESULT_SIZE < lenNeeded) {
outString.Capacity = lenNeeded;
if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString,
lenNeeded,out lenNeeded)) {
throw new ApplicationException("Unabled to aquire SQL Servers from ODBC driver.");
}
}
list = outString.ToString();
int start = list.IndexOf("{") + 1;
int len = list.IndexOf("}") - start;
if ((start > 0) && (len > 0)) {
list = list.Substring(start,len);
}
else {
list = string.Empty;
}
}
}
}
}
}
catch {
list = string.Empty;
}
finally {
if (hconn != IntPtr.Zero) {
SQLFreeHandle(SQL_HANDLE_DBC,hconn);
}
if (henv != IntPtr.Zero) {
SQLFreeHandle(SQL_HANDLE_ENV,hconn);
}
}
string[] array = null; if (list.Length > 0) {
array = list.Split(',');
}
return array; } }
'必须安装SQL SERVER 2000 SP2 及以上版本Dim I As Short
Dim sqlApp As New SQLDMO.Application()
Dim ServerName As SQLDMO.NameList
ServerName = sqlApp.ListAvailableSQLServers
For i = 1 To ServerName.Count
cbServer.Items.Add(ServerName.Item(i))
Next 得到指定SQL服务器所有数据库的列表:'得到指定SQL服务器所有数据库的列表Dim sqlApp As New SQLDMO.Application()
Dim oServer As New SQLDMO.SQLServer()
oServer.Connect('(local)', 'sa', 'sa')
cboDatabase.Items.Clear()
Dim db As SQLDMO.Database
For Each db In oServer.Databases
Me.cboDatabase.Items.Add(db.Name)
Next 调用COM组件中的SQLDMO(SQL Distributed Management Objects做个循环判断下就OK了
你的那GetServers()方法在SqlLocator 类里面,我怎么调用 啊
string[] strList = SqlLocator.GetServers();
string[] strList = SqlLocator.GetServers();
一个一个去取??
我怎么把它做我我的数据库参数啊
foreach(string srvName in strList){
//srvName 就是你要的数据库参数啦!
}
未处理的“System.NullReferenceException”类型的异常出现在 WindowsApplication1.exe 中。其他信息: 未将对象引用设置到对象的实例。
string[] strList 是空的,
TO yuan135() 就是你开始给我的那段代码
strList是空的?网络设置是否正确,是否有SQL服务器?
if (list.Length == 0)
{
array = list.Split(',');
}
return array;
你的这句话什么意思,是不是它干扰了
功 能: 返回网络中SQLServer列表
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败 False
备 注:
版 本:
1.0 2002/10/02 22:44:00
=================================================================}
function GetSQLServerList(var List: Tstrings): Boolean;
var
i: Integer;
sRetValue: string;
SQLServer: Variant;
ServerList: Variant;
begin
Result := False;
try
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList := SQLServer.ListAvailableSQLServers;
List := Tstringlist.Create;
for i := 1 to ServerList.Count do
List.Add(ServerList.item(i));
Result := True;
finally
SQLServer := NULL;
ServerList := NULL;
end;
end;Delphi的,自已改一下。