понедельник, 14 марта 2011 г.

Получение информации о базах данных из Microsoft SQL Server

В этой статье я расскажу как можно из .NET-программы получить информацию о существующих базах данных на SQL Server.

Первым делом надо подключиться к интересующему нас экземпляру сервера. Для этого создадим строку подключения. У меня она получилась такая:

SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder();
conStr.DataSource = @"SVAT-PC\SQLEXPRESS";
conStr.IntegratedSecurity = true;

Далее определим переменную строкового типа и запишем в нее наш запрос для получения списка всех существующих баз данных на сервере. После чего определим таблицу, в которую будет записан результат запроса.

string query = "SELECT name FROM sys.databases WHERE database_id > 4";
DataTable table = new DataTable("Dbs");

Далее выполним подключение к серверу и выполним наш запрос:

using (SqlConnection con = new SqlConnection(conStr.ToString()))
{
    con.Open();
 
    SqlDataAdapter adapter = new SqlDataAdapter(query, con);
    adapter.Fill(table);
 
    con.Close();
}

Теперь мы можем, пройдясь циклом по нашей таблице с результатом запроса и вытянуть из нее имена всех, существующих баз данных на интересующем нас сервере.

List<string> list = new List<string>();
for (int i = 0; i < table.Rows.Count; i++)
{
    list.Add(table.Rows[i][0].ToString());
}

Весь метод целиком будет выглядеть следующим образом:
            /// <summary>
            /// Получение списка БД.
            /// </summary>
            /// <returns>Список БД, хранимых на сервере.</returns>
            public List<string> GetDbList()
            {
                try
                {
                    SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder();
                    conStr.DataSource = @"SVAT-PC\SQLEXPRESS";
                    conStr.IntegratedSecurity = true;
 
                    string query = "SELECT name FROM sys.databases WHERE database_id > 4";
                    DataTable table = new DataTable("Dbs");
 
                    using (SqlConnection con = new SqlConnection(conStr.ToString()))
                    {
                        con.Open();
 
                        SqlDataAdapter adapter = new SqlDataAdapter(query, con);
                        adapter.Fill(table);
 
                        con.Close();
                    }
 
                    List<string> list = new List<string>();
                    for (int i = 0; i < table.Rows.Count; i++)
                    {
                        list.Add(table.Rows[i][0].ToString());
                    }
                    return list;
                }
                catch (Exception e)
                {
                    return null;
                }
            }
По такому же принципу мы теперь можем получить список всех таблиц из каждой полученной нами базы данных. Это легко сделать выполнив следующий запрос, применяя его к каждой базе данных из полученного нами списка.

string query = string.Format("USE {0};", DBname);
query += "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'";

Целиком метод для получения структуры каждой базы данных будет выглядеть следующим образом:

            /// <summary>
            /// Получить структуру БД.
            /// </summary>
            /// <param name="DBname">Имя БД</param>
            /// <returns>Набор таблиц, описывающих БД.</returns>
            public DataSet GetDBStruct(string DBname)
            {
                if (DBname != null && DBname != "")
                {
                    DataSet respond = new DataSet(DBname);
 
                    try
                    {
                            SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder();
                            conStr.DataSource = ServiceName;
                            conStr.InitialCatalog = DBname;
                            conStr.IntegratedSecurity = true;
                            string query = string.Format("USE {0};", DBname);
                                   query += "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'";
                            DataTable tables = new DataTable();
 
                            using (SqlConnection con = new SqlConnection(conStr.ToString()))
                            {
                                con.Open();
 
                                SqlDataAdapter adapter = new SqlDataAdapter(query, con);
                                adapter.Fill(tables);
 
                                con.Close();
                            }
 
                            query = string.Format("USE {0};", DBname);
                            
                            foreach (DataRow row in tables.Rows)
                            {
                                query += string.Format("select TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}'; ", row["TABLE_NAME"]);
                            }
 
                            using (SqlConnection con = new SqlConnection(conStr.ToString()))
                            {
                                con.Open();
 
                                SqlDataAdapter adapter = new SqlDataAdapter(query, con);
                                adapter.Fill(respond);
 
                                con.Close();
                            }
                            return respond;
                    }
                    catch (Exception e)
                    {
                        return null;
                    }
                }
                return null;
            }
Результатом метода будет заполненный DataSet с набором таблиц, в которых будет находиться информация о существующих в базе данных таблицах и информация о колонках.
Так же есть способ получить информацию о конкретной таблице из интересующей базы данных. Выглядит это так:
            /// <summary>
            /// Получение структуры таблицы.
            /// </summary>
            /// <param name="DbName">Имя БД.</param>
            /// <param name="TableName">Имя таблицы.</param>
            /// <returns>Структура таблицы.</returns>
            public DataSet GetTableStruct(string DbName, string TableName)
            {
                try
                {
                    SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder();
                    conStr.DataSource = @"SVAT-PC\SQLEXPRESS";
                    conStr.IntegratedSecurity = true;
 
                    string query = string.Format("USE {0};", DbName);
                           query += string.Format("select TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}'", TableName);
                           DataSet table = new DataSet(DbName + "/" + TableName);
 
                    using (SqlConnection con = new SqlConnection(conStr.ToString()))
                    {
                        con.Open();
 
                        SqlDataAdapter adapter = new SqlDataAdapter(query, con);
                        adapter.Fill(table);
 
                        con.Close();
                    }
                    return table;
                }
                catch (Exception e)
                {
                    return null;
                }
            }
Вот таким образом мы можем получить информацию о всех базах данных на сервере, а так же узнать какие таблицы входят в них и из каких столбцов они состоят.

Комментариев нет:

Отправить комментарий