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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> а есть ли способ? 
:(
    Опции темы
Гость_Wanderer2019
Дата 15.6.2005, 15:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте! ПОдскажите plz... Есть ли способ определить все имена баз данных и имена таблиц, находящихся на определенном SQL сервере?
  Вверх
AntonSaburov
Дата 15.6.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

Репутация: 6
Всего: 118



Во-первых, постарайтесь в следующий раз не создавать две одинаковые темы.

Во-вторых, такая возможность очень исльно зависит от SQL-сервера, который будет использоваться. И такое лучше уже спрашивать в разделе по базам данных.

Например для MS SQL можно сделать так:

exec sp_helpdb - получить список баз данных.
exec sp_tables @table_type="'TABLE'" - получить список пользователских таблиц
PM MAIL WWW ICQ   Вверх
arilou
Дата 15.6.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Wanderer2019,

Выкладываю код предназначенный для работы с БД. Надеюсь, пригодится не только тебе:

Код

/// <summary>
    /// Опции БД для Sql Server'a
    /// </summary>
    public class SqlServerOptions    {

        #region настройки БД для Sql Server 
        private string _Instance = string.Empty;
        /// <summary>
        /// Имя сервера
        /// </summary>
        public string Instance
        {
            get {  return _Instance; }
            set { _Instance = value; }    
        }

        private string _Database = string.Empty;
        /// <summary>
        /// Имя БД
        /// </summary>
        public string Database
        {
            get {  return _Database; }
            set { _Database = value; }    
        }

        private string _UserName = string.Empty;
        /// <summary>
        /// Имя пользователя для подсоединения
        /// </summary>
        public string UserName
        {
            get {  return _UserName; }
            set { _UserName = value; }    
        }

        private string _Password = string.Empty;
        /// <summary>
        /// Пароль
        /// </summary>
        public string Password
        {
            get {  return _Password; }
            set { _Password = value; }    
        }

        private bool _TrustedConnection = false;
        /// <summary>
        /// Указывает, использовать ли trusted connection при подсоединении к Sql Server
        /// </summary>
        public bool TrustedConnection
        {
            get {  return _TrustedConnection; }
            set { _TrustedConnection = value; }    
        }

        private bool _UseExistingDatabase = false;
        /// <summary>
        /// Указывает, использовать ли существующую БД
        /// </summary>
        public bool UseExistingDatabase
        {
            get {  return _UseExistingDatabase; }
            set { _UseExistingDatabase = value; }    
        }
        #endregion

        #region создание connection string

        public string BuildConnectionString()
        {
            if(this.TrustedConnection)
                return string.Format(SqlHelper.TRUSTED_CONN_STRING_FORMAT,
                    Instance, Database);
            else
                return string.Format(SqlHelper.NOTTRUSTED_CONN_STRING_FORMAT,
                    Instance, Database, UserName, Password);
        }

        #endregion

    }

    public enum ConnTestEnum
    {
        Success,
        GenericFail,
        DBExists,
        DBNotFound
    }

    /// <summary>
    /// Внутренний класс для выполнения операций с Sql Server'ом с 
    /// помощью SQLDMO
    /// </summary>
    public class SqlHelper
    {
        public const string NOTTRUSTED_CONN_STRING_FORMAT = 
            "server={0};Trusted_Connection=false;database={1};uid={2};pwd={3}",
            TRUSTED_CONN_STRING_FORMAT = 
            "server={0};Trusted_Connection=true;database={1};uid=;pwd=",
            DEFAULT_DB_NAME = "master";
        
        #region проверка возможности подключения к Sql Server'у
        /// <summary>
        /// Проверяет, возможно ли подключиться к Sql Server'у
        /// </summary>
        /// <param name="options"></param>
        /// <returns>False в случае неудачи, иначе True</returns>
        public static ConnTestEnum TestConnection(SqlServerOptions options)
        {
            SqlConnection conn = new SqlConnection();
            string dbname = string.Empty;
            ConnTestEnum result = ConnTestEnum.Success;
            
            if(options.UseExistingDatabase)
                dbname = options.Database;
            else
                dbname = DEFAULT_DB_NAME;

            if(options.TrustedConnection)
                conn.ConnectionString = string.Format(TRUSTED_CONN_STRING_FORMAT, 
                    options.Instance, dbname);
            else
                conn.ConnectionString = string.Format(NOTTRUSTED_CONN_STRING_FORMAT,
                    options.Instance, dbname, options.UserName, options.Password);

            try
            {
                conn.Open();

                // если человек выбрал режим "don't use existing database", то
                // необходимо убедиться, что такой БД нет на сервере, иначе будут 
                // ошибки
                if(dbname == DEFAULT_DB_NAME)
                {
                    conn.Close();
                    conn.ConnectionString = options.BuildConnectionString();

                    try
                    {
                        conn.Open();
                        result = ConnTestEnum.DBExists;
                    }
                    catch(SqlException)
                    {
                        result = ConnTestEnum.Success;
                    }
                }
                    
                return result;
            }
            catch(SqlException ex)
            {
                if(ex.ToString().IndexOf("Cannot open database requested in login") > 0)
                    return ConnTestEnum.DBNotFound;
                else
                    return ConnTestEnum.GenericFail;
            }
            catch(Exception)
            {
                throw;
            }
            finally
            {
                if(conn.State == ConnectionState.Open)
                    conn.Close();

                conn.Dispose();
            }
        }
        #endregion

        #region проверка существования SQL-DMO
        /// <summary>
        /// Проверяет, установлена ли на машине биб-ка SQL-DMO
        /// </summary>
        /// <returns></returns>
        public static bool CheckSQLDMO()
        {
            try
            {
                SQLDMO.SQLServer2Class server = new SQLDMO.SQLServer2Class();
                server = null;
                return true;
            }
            catch(COMException)
            {
                return false;
            }
        }

        #endregion
        
        #region Connect/Disconnect
        /// <summary>
        /// Подсоединяется к Sql Server'у
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public static SQLDMO.SQLServer2Class Connect(SqlServerOptions options)
        {
            SQLDMO.SQLServer2Class server = new SQLDMO.SQLServer2Class();

            server.LoginSecure = options.TrustedConnection;

            try
            {
                if(options.TrustedConnection)
                    server.Connect(options.Instance, null, null);
                else
                    server.Connect(options.Instance, options.UserName, options.Password);
            }
            catch(COMException)
            {
                return null;
            }

            return server;
        }

        /// <summary>
        /// Отсоединяется от Sql Server'а
        /// </summary>
        /// <param name="server"></param>
        public static void Disconnect(SQLDMO.SQLServer2Class server)
        {
            if(server != null)
                server.DisConnect();
        }

        #endregion

        #region пакетные операции
        private static Exception _LastError = null;
        public static System.Exception LastError
        {
            get {  return _LastError; }
        }

        public enum BatchOperationResult
        {
            Success,
            DBNotFound,
            CantConnect,
            Exception,
            SyntaxError,
            DBExists
        }

        public const uint ERR_DBNOTFOUND = 0x8004038F,
            ERR_INVALID_SYNTAX = 0x8004009C,
            ERR_DB_ALREADY_EXISTS = 0x80040709;
        

        /// <summary>
        /// Выполняет пакетный скрипт с помощью SQLDMO
        /// </summary>
        /// <param name="options"></param>
        /// <param name="batchText"></param>
        /// <returns></returns>
        public static BatchOperationResult ExecuteBatch(SqlServerOptions options, 
            string batchText)
        {
            try
            {
                SQLDMO.SQLServer2Class server = Connect(options);

                if(server == null)
                    return BatchOperationResult.CantConnect;

                if(options.UseExistingDatabase)
                {
                    SQLDMO._Database db = server.Databases.Item(options.Database, null);

                    if(db == null)
                        return BatchOperationResult.DBNotFound;

                    db.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, 
                        batchText.Length);
                }
                else
                    server.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default,
                        batchText.Length);

                Disconnect(server);

                return BatchOperationResult.Success;
            }
            catch(COMException ex)
            {
                switch((uint)ex.ErrorCode)
                {
                    case ERR_DBNOTFOUND:
                        return BatchOperationResult.DBNotFound;
                    case ERR_INVALID_SYNTAX:
                        return BatchOperationResult.SyntaxError;
                    case ERR_DB_ALREADY_EXISTS:
                        return BatchOperationResult.DBExists;
                    default:
                        _LastError = ex;
                        return BatchOperationResult.Exception;
                }
            }
        }
        

        #endregion

        #region список серверов, баз, поиск БД EP
        /// <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;
            }
        }

        /// <summary>
        /// Получает список баз данных на Sql Server'e
        /// </summary>
        /// <param name="options"></param>
        /// <returns>null в случае, если невозможно приконнектиться к Sql Server'у</returns>
        public static string[] GetDatabaseList(SqlServerOptions options)
        {
            ArrayList result = new ArrayList();

            SQLDMO.SQLServer2Class server = Connect(options);

            if(server != null)
            {
                foreach (SQLDMO._Database db in server.Databases)
                    result.Add(db.Name);

                Disconnect(server);

                string[] dbList = new string[result.Count];
                result.CopyTo(dbList, 0);

                return dbList;
            }
            else
                return null;
        }

        #endregion

        #region создание новой БД
        public static bool CreateDatabase(SqlServerOptions options, string batchText)
        {
            SQLDMO.SQLServer2Class server = Connect(options);

            SQLDMO.Database2Class db = new SQLDMO.Database2Class();
            db.Name = options.Database;
            server.Databases.Add((SQLDMO._Database2)db);

            db.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_ContinueOnError, batchText.Length);
            return true;
        }
        #endregion

    }


P.S. Я достал его из своего проекта, поэтому если вдруг сюда попала ссылка на какой-то другой класс, то метод, в котором она встречается, тебе не понадобится.


AntonSaburov, IMHO, в том форуме вряд-ли дадут ответ, который сможет сразу заработать в .NET.
Добавлено @ 16:29
Правда, тут нету метода для получения списка таблиц. Но все это есть в SQL-DMO. RTFM SQL Server Books Online


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


Опытный
**


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

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



arilou Спасибо за класс. Все супер!

Вот сижу разбираюсь с SQLDMO и не пойму, если предположим я заранее знаю имя БД и мне надо получить список таблиц получается, что отследить это я могу только по схоности имен... т.е. получается что я не могу подключиться к конкретной базе???
т.к. метод connect принимает только 3 параметра хост. имя и пароль...
т.е. чтобы попасть на нужную базу нужно перебирать все и проверять имя??
или я чего то не понял... smile

типа например так:
Код

                foreach (SQLDMO._Database db in server.Databases)
                {
                    if(db.Name==options.Database)
                    {
                        foreach(SQLDMO._Table tb in db.Tables)
                        {
                            result.Add(tb.Name);
                        }
                    }
                }

Добавлено @ 23:55
все разобрался... smile
PM ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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