如何利用C#获得网络中所有SQL Server服务器名称?谢谢!

解决方案 »

  1.   

    1. if you have Sql Client installed on the local machine, you could run "osql -L" command using System.Diagnostics.Process class2. use SQLDOM interop, see
    Enumerating SQL Servers Using C# and SQLDMO
    http://www.schkerke.com/blog/articles/EnumeratingSqlServersUsingCSharpAndSqlDmo.aspx
      

  2.   

    #region 得到所有本地网络中可使用的SQL服务器列表
    /// <summary>
    /// 得到所有本地网络中可使用的SQL服务器列表
    /// </summary>
    /// <param name="p_strServerList">服务器列表</param>
    /// <returns></returns>
    public static bool GetServers(ref string [] p_strServerList)
    {
    try
    {
    SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); 
    SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); 
    if(sqlServers.Count > 0)
    {
    p_strServerList = new string[sqlServers.Count];
    for(int i=0;i<sqlServers.Count;i++) 

    string srv = sqlServers.Item(i + 1); 
    if(srv != null) 

    p_strServerList[i] = srv;                         


    }
    return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    } #endregion #region 得到指定SQL服务器所有数据库的列表
    /// <summary>
    /// 得到指定SQL服务器所有数据库的列表
    /// </summary>
    /// <param name="p_strDataBaseList">数据库列表</param>
    /// <param name="p_strServer">服务器名</param>
    /// <param name="p_strUser">用户名</param>
    /// <param name="p_strPWD">密码</param>
    /// <returns></returns>
    public static bool GetDataBases(ref string [] p_strDataBaseList, string p_strServer, string p_strUser, string p_strPWD)
    {
    try
    {
    int i = 0; SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); 
    SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();                 
    srv.Connect(p_strServer,p_strUser,p_strPWD);  if(srv.Databases.Count > 0)
    {
    p_strDataBaseList = new string[srv.Databases.Count];

    foreach(SQLDMO.Database db in srv.Databases) 

    if(db.Name!=null) 
    {
    p_strDataBaseList[i] = db.Name;
    }
    i = i + 1;
    }
    }
    return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    } #endregion #region 得到所有的存储过程
    /// <summary>
    /// 得到所有的存储过程
    /// </summary>
    /// <param name="p_strProcedureList">存储过程列表</param>
    /// <param name="p_strServer">服务器名</param>
    /// <param name="p_strUser">用户名</param>
    /// <param name="p_strPWD">密码</param>
    /// <param name="p_strDataBase">数据库名</param>
    /// <returns></returns>
    public static bool GetProcedures(ref string [] p_strProcedureList, string p_strServer, string p_strUser, string p_strPWD, string p_strDataBase)
    {
    try
    {
    SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();                 
    srv.Connect(p_strServer,p_strUser,p_strPWD);  for(int i=0;i<srv.Databases.Count;i++) 

    if(srv.Databases.Item(i+1,"dbo").Name == p_strDataBase) 

    SQLDMO._Database db= srv.Databases.Item(i+1,"dbo"); 
    if (db.StoredProcedures.Count > 0)
    {
    p_strProcedureList = new string[db.StoredProcedures.Count]; for(int j=0;j<db.StoredProcedures.Count;j++) 

    p_strProcedureList[j] = db.StoredProcedures.Item(j+1,"dbo").Name; 

    break; 

    }
    } return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    }
    #endregion #region 得到所有的Tables集合
    /// <summary>
    /// 得到所有的Tables集合
    /// </summary>
    /// <param name="p_strProcedureList">Tables集合</param>
    /// <param name="p_strServer">服务器名</param>
    /// <param name="p_strUser">用户名</param>
    /// <param name="p_strPWD">密码</param>
    /// <param name="p_strDataBase">数据库名</param>
    /// <returns></returns>
    public static bool GetTables(ref string [] p_strTableList, string p_strServer, string p_strUser, string p_strPWD, string p_strDataBase)
    {
    try
    {
    SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();                 
    srv.Connect(p_strServer,p_strUser,p_strPWD);  for(int i=0;i<srv.Databases.Count;i++) 

    if(srv.Databases.Item(i+1,"dbo").Name == p_strDataBase) 

    SQLDMO._Database db= srv.Databases.Item(i+1,"dbo"); 
    if (db.Tables.Count > 0)
    {
    p_strTableList = new string[db.Tables.Count]; for(int j=0;j<db.Tables.Count;j++) 

    p_strTableList[j] = db.Tables.Item(j+1,"dbo").Name; 

    break; 

    }
    } return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    }
    #endregion #region 得到所有的Views集合
    /// <summary>
    /// 得到所有的Views集合
    /// </summary>
    /// <param name="p_strProcedureList">Views集合</param>
    /// <param name="p_strServer">服务器名</param>
    /// <param name="p_strUser">用户名</param>
    /// <param name="p_strPWD">密码</param>
    /// <param name="p_strDataBase">数据库名</param>
    /// <returns></returns>
    public static bool GetViews(ref string [] p_strViewList, string p_strServer, string p_strUser, string p_strPWD, string p_strDataBase)
    {
    try
    {
    SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();                 
    srv.Connect(p_strServer,p_strUser,p_strPWD);  for(int i=0;i<srv.Databases.Count;i++) 

    if(srv.Databases.Item(i+1,"dbo").Name == p_strDataBase) 

    SQLDMO._Database db= srv.Databases.Item(i+1,"dbo"); 
    if (db.Views.Count > 0)
    {
    p_strViewList = new string[db.Views.Count]; for(int j=0;j<db.Views.Count;j++) 

    p_strViewList[j] = db.Views.Item(j+1,"dbo").Name; 

    break; 

    }
    } return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    }
    #endregion
      

  3.   

    谢谢思归及cnming但我现在存在一个问题。1。利用SQLDMO能否读出SQLSVR7的服务器?
    2。我觉着是不是能否不用SQLDMO?就像是打开一个UDL文件或者在ODBC里面建一个数据源,点击下拉框就可以读出列表,并不要求一定要装有SQL SERVER。
    3。利用cnming的方法我似乎读不出结果,我自己本机上面装有SQL SVR,但没有读出来。
      

  4.   

    SQLDMO
    你不享有window API行吗如果享有api说句话
      

  5.   

    1。利用SQLDMO能否读出SQLSVR7的服务器?
    没试过,因为现在没有SQL 7
    3。利用cnming的方法我似乎读不出结果,我自己本机上面装有SQL SVR,但没有读出来。
    你是不是SQL 7?我在我的环境下试过,我的数据库安装就是靠这个获取的服务器列表,这些代码其实最初的来源来自于孟子。
      

  6.   

    INF: How to Enumerate Available SQL Servers Using SQLDMO
    http://support.microsoft.com/default.aspx?scid=287737
      

  7.   

    //利用cnming的方法我似乎读不出结果,我自己本机上面装有SQL SVR,但没有读出来。这个似乎我错了。我就觉得奇怪,为什么用查询分析器在登录对话框中点击按钮选择服务器也无法读出本机?我用的是SQLSVR2K+SP3。操作系统XPProfessional,有网卡,没有连入局域网。IBM ThinkPad,不知道是不是硬件的问题。
      

  8.   

    ping 127.0.0.1通不通?如果不通,设置一个虚拟网卡,然后再试试,此外,SQLDMO安装了没有?
      

  9.   

    PING得通我装了SQL2K,应当默认安装了SQLDMO吧。