具体情况是这样的,就是我一个windowsFrom程序连接服务器的时候,用户选择默认服务器登陆时,就会自动地在局域网内搜索指定的数据库服务器进行连接....

解决方案 »

  1.   

    sqldmo
    ms-help://MS.MSDNQTR.2003FEB.2052/sqldmo/dmoref_m_e_8lpl.htm
      

  2.   

    提供一个类给你,调用类的静态方法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; } }
      

  3.   

    '得到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了
      

  4.   

    to yuan135() 
    你的那GetServers()方法在SqlLocator 类里面,我怎么调用 啊
      

  5.   

    这样调用就可以了
    string[] strList = SqlLocator.GetServers();
      

  6.   

    那个我知道,我是说然后数据库连接语句怎么写
    string[] strList = SqlLocator.GetServers();
    一个一个去取??
      

  7.   

    上面加个using System.Runtime.InteropServices;就可以了
      

  8.   

    就是返回数组string[] strList = SqlLocator.GetServers();
    我怎么把它做我我的数据库参数啊
      

  9.   

    string[] strList = SqlLocator.GetServers();
    foreach(string srvName in strList){
        //srvName 就是你要的数据库参数啦!
    }
      

  10.   

    已经给你取出来了啊,就是字符串srvName啊!
      

  11.   

    上面那个代码我用了,当循环到foreach的时候出现
    未处理的“System.NullReferenceException”类型的异常出现在 WindowsApplication1.exe 中。其他信息: 未将对象引用设置到对象的实例。
    string[] strList 是空的,
    TO yuan135() 就是你开始给我的那段代码
      

  12.   

    我测试过,完全OK!
    strList是空的?网络设置是否正确,是否有SQL服务器?
      

  13.   

    string[] array = null;
    if (list.Length == 0) 
    {
    array = list.Split(',');
    }
    return array;
    你的这句话什么意思,是不是它干扰了
      

  14.   

    {=================================================================
      功  能: 返回网络中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的,自已改一下。