Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пределение имен SQL серверов 
:(
    Опции темы
Wanderer2019
Дата 14.6.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 1
Всего: 17



Всем привет! Вопрос такой. Существует ли возможность определить именя серверов установленных на машине через приложение под Windows (на C#)... Т.е. предположим заход пользователь и ему не надо помнить имена всех SQL серверов... он просто выбирает из списка доступных. Можно ли такое сделать? Спасибо всем откликнувшимся!
PM ICQ MSN   Вверх
SergKO
Дата 15.6.2005, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



Попробуйте использовать 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;
        }

    }
}


PM MAIL   Вверх
arilou
Дата 15.6.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Есть еще один способ. Требует установленного 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;
            }
        }





--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
HellMasterHaiL
Дата 10.8.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



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

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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.