Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > пределение имен SQL серверов


Автор: Wanderer2019 14.6.2005, 19:14
Всем привет! Вопрос такой. Существует ли возможность определить именя серверов установленных на машине через приложение под Windows (на C#)... Т.е. предположим заход пользователь и ему не надо помнить имена всех SQL серверов... он просто выбирает из списка доступных. Можно ли такое сделать? Спасибо всем откликнувшимся!

Автор: SergKO 15.6.2005, 05:25
Попробуйте использовать ODBC

Код

using System;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace BrowserSQL
{
    public class BrowseSQL
    {

        [DllImport("odbc32.dll")]
        private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
        [DllImport("odbc32.dll")]
        private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
        [DllImport("odbc32.dll")]
        private static extern short SQLFreeHandle(short hType, IntPtr handle); 
        [DllImport("odbc32.dll",CharSet=CharSet.Ansi)]
        private static extern short SQLBrowseConnect(IntPtr hconn, StringBuilder inString, 
            short inStringLength, 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";
        
        public BrowseSQL()
        {
        }

        public static String[] GetServers()
        {
            string[] ret_list = null;
            string scan_str = string.Empty;
            IntPtr henv = IntPtr.Zero;
            IntPtr hconn = IntPtr.Zero;
            StringBuilder inp_str = new StringBuilder(SQL_DRIVER_STR);
            StringBuilder out_str = new StringBuilder(DEFAULT_RESULT_SIZE);
            short inp_str_length = (short) inp_str.Length;
            short len = 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, inp_str, inp_str_length, out_str, 
                                DEFAULT_RESULT_SIZE, out len))
                            {
                                if (DEFAULT_RESULT_SIZE < len)
                                {
                                    out_str.Capacity = len;
                                    if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inp_str, inp_str_length, out_str, 
                                        len,out len))
                                    {
                                        throw new ApplicationException("Поиск SQL-серверов невозможен.");
                                    }    
                                }
                                scan_str = out_str.ToString();
                                int start = scan_str.IndexOf("{") + 1;
                                int lnght = scan_str.IndexOf("}") - start;
                                if ((start > 0) && (lnght > 0))
                                {
                                    scan_str = scan_str.Substring(start,lnght);
                                }
                                else
                                {
                                    scan_str = string.Empty;
                                }
                            }                        
                        }
                    }
                }
            }
            catch  (Exception ex)
            {
                scan_str = string.Empty;
            }
            finally
            {
                if (hconn != IntPtr.Zero)
                {
                    SQLFreeHandle(SQL_HANDLE_DBC,hconn);
                }
                if (henv != IntPtr.Zero)
                {
                    SQLFreeHandle(SQL_HANDLE_ENV,hconn);
                }
            }
    
            if (scan_str.Length > 0)
            {
                ret_list = scan_str.Split(",".ToCharArray());
            }

            return ret_list;
        }

    }
}


Автор: arilou 15.6.2005, 11:10
Есть еще один способ. Требует установленного SQL-DMO (SQL Client Tools). В проект надо добавить reference на COM библиотеку SQL-DMO Objects.

Код

/// <summary>
        /// Возвращает список доступых Sql Server'ов
        /// </summary>
        /// <remarks>
        /// В случае, если на текущей машине не установлен по крайней мере Sp2 для Sql Server 2000,
        /// метод возвращает null
        /// </remarks>
        /// <returns></returns>
        public static string[] GetServerList()
        {
            try
            {
                SQLDMO.ApplicationClass app = new SQLDMO.ApplicationClass();
                SQLDMO.NameList nameList = app.ListAvailableSQLServers();

                ArrayList names = new ArrayList();
                
                foreach (string server in nameList)
                    names.Add(server);

                string[] srvList = new string[names.Count];
                names.CopyTo(srvList, 0);

                app = null;
                return srvList;
            } 
            catch(InvalidCastException) // pre-SP2 Sql Server generates exception (QueryInterface failed)
            {
                return null;
            }
        }



Автор: HellMasterHaiL 10.8.2007, 16:07
Народ, как можно заюзать SQLDMO без установленных тулсов SQL'я?
ну вот надо чтобы она работала на клиентских машинах, гне вообще нету ни SQL ни MSDE....
простая регистрация библиотеки не помогает(

з.ы. от SQLDMO нужно не только список серверов или баз...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)