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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнить по порядку несколько запросов. 
:(
    Опции темы
Экскалупатор
Дата 28.9.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



добрый всем день. подскажите как решить такую проблему. задача: получить из сервера SQL список баз данных, потом для каждой баз получить таблицы и Views. вот как я это сделал:
Код

using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                
                SqlCommand cmd = new SqlCommand(SQLCommands.SQL_ALL_GETALLDBS, conn);
                List<DBInfo> result = new List<DBInfo>();
                var reader = cmd.ExecuteReader();
                while (reader.Read()) //получаем базы
                {
                    string dbName = reader.GetString(0);
                    int dbId = reader.GetInt32(1);
                    result.Add(new DBInfo()
                    {
                        ID = dbId,
                        Name = dbName
                    });
                }
                conn.Close();

                //для каждой базы создаем запрос и выбираем таблицы
                foreach (var r in result)
                {
                    conn.Open();
                    cmd = new SqlCommand(string.Format(SQLCommands.SQL_ALL_GETDBTABLES_FORMAT_1ARG, r.Name), conn);
                    var readerTable = cmd.ExecuteReader();
                    List<TableInfo> listTable = new List<TableInfo>();
                    while (readerTable.Read()) //получаем таблицы для каждой базы
                    {
                        var name = readerTable.GetValue(0).ToString();
                        listTable.Add(new TableInfo() { Name = name });
                    }
                    r.Tables = listTable;
                    conn.Close();
                }

                //для каждой базы создаем запрос и выбираем Views
                foreach (var r in result)
                {
                    conn.Open();
                    cmd = new SqlCommand(string.Format(SQLCommands.SQL_ALL_GETDBVIEWS_FORMAT_1ARG, r.Name), conn);
                    var readerView = cmd.ExecuteReader();
                    List<ViewInfo> listView = new List<ViewInfo>();
                    while (readerView.Read())
                    {
                        var name = readerView.GetValue(0).ToString();
                        listView.Add(new ViewInfo() { Name = name });
                    }
                    r.Views = listView;
                    conn.Close();
                }


это все, в принципе работает, но меня смущает, что для выполнения каждого запроса мне нужно открывать соединение. хотя наверняка технически соединение не устанавливается, а выбирается из пула, но тем не менее, можно ли как то исправить мой вариант что бы было только одно подключение, и стоит ли вообще это делать? просто я думаю что на каждый conn.Open() и conn.Close(), тратиться время, и если баз будет много то могут начаться тормоза. или все будет нормально работать и так?
заранее всем спасибо.
PM MAIL ICQ   Вверх
Crypton
Дата 28.9.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



Код

using(SqlConnection Conn = new SqlConnection("строка подключения")) {
       Conn.Open();
       using(SqlCommand cmd1 = new SqlCommand("запрос", Conn)) {
              ...
              // когда юзаем читатель
              using(SqlDataReader r = cmd1.ExecuteReader()){
                   ...
              }
       }
       using(SqlCommand cmd2 = new SqlCommand("запрос", Conn)) {
              ...
       }
       using(SqlCommand cmd3 = new SqlCommand("запрос", Conn)) {
              ...
       }
       и так далее
}


Это сообщение отредактировал(а) Crypton - 28.9.2009, 16:59
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Экскалупатор
Дата 28.9.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



спасибо. все работает вроде бы так же как и мой способ. но я так понимаю что установленное соединение остается открытым до конца самого первого блока using? т.е. время на открытие и закрытие соединения не тратиться?
PM MAIL ICQ   Вверх
Crypton
Дата 28.9.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



Цитата

но я так понимаю что установленное соединение остается открытым до конца самого первого блока using? 

До конца последнего так-как там происходит уже уничтожение объекта SqlConnection в следствии чего и закрывается подключение.

Цитата

т.е. время на открытие и закрытие соединения не тратиться?

Нет, только один раз (на открытие и закрытие)
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Экскалупатор
Дата 29.9.2009, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



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

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

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

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


 




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


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

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