Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296

Подключение к БД используя sql-server, форма подвисает во время запроса

02.04.2012, 19:14. Показов 4928. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане. Столкнулся с такой проблемой. Пишу многооконное приложение для работы с БД. Соединение с БД делаю так
C#
1
2
conect = new SqlConnection(@"Data source=.\sqlexpress; integrated security=SSPI; database=kyrs");
conect.Open();
и потом с помощью SqlCommand и SqlDataAdpter выполняю некоторые запросы.
Добавил в конструктор формы новый параметр типа SqlConnection, для того что бы постоянно не создавать новое подключение. Но дело в том что приложение подвисает (системных ресурсов хватает) и при чем на каждой форме, когда я выполняю какой-либо запрос. По чему так ?
Я думал если я буду передавать старое соединение с БД в каждый модуль, то прога не будет зависать.
Посоветуйте что можно сделать для улучшения! Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2012, 19:14
Ответы с готовыми решениями:

ODBC SQL Server Driver. Истекло время ожидания запроса
В SQL Server 2008 делаю перегонку данных из одной таблицы в другую по определенному условию. Количество записей в таблице 13 000, есть...

Реализация select запроса используя хранимую процедуру - sql server
Здравствуйте в программе на с# имеется запрос такого типа: private void button1_Click(object sender, EventArgs e) { ...

Подключение Android-приложения к SQL Server (MS SQL)
Здравствуйте, не получается подключить андроид приложение к sql server 2008. Перерыл все в инете, всеми способами не смог. Было б хорошо...

20
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
02.04.2012, 20:13
Не думаю что это сильно зависит от подключения. Попробуйте тут посмотреть.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
02.04.2012, 20:16  [ТС]
Цитата Сообщение от freeba Посмотреть сообщение
Не думаю что это сильно зависит от подключения. Попробуйте тут посмотреть
Та дело скорее всего и не в подключении.
Может я не так делаю общее соединение для всех форм. Подскажите может есть какой другой способ, может он и увеличит быстродействие.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
02.04.2012, 20:18
Используем строго-типизированные датасеты и не паримся. Если запросы не очень сложные производительность будет вполне на уровне.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
02.04.2012, 20:21  [ТС]
подскажите как ним пользоваться, на msdn нашет только для LINQ. Приведите пример пожалуйста для sql.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
02.04.2012, 20:27
Тут описывается для vs2005, но в принципе верно и для 2010
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
02.04.2012, 23:48  [ТС]
Цитата Сообщение от freeba Посмотреть сообщение
Тут описывается для vs2005, но в принципе верно и для 2010
не понял как его инициализировать.

Добавлено через 2 часа 28 минут
Подскажите как создать типизированный dataset и потом выполнят запросы с его использованием??

Добавлено через 39 минут
Разобрался с типизированным DataSet, но все равно подвисает. Походу это так и есть. Ничего не изменилось .
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
03.04.2012, 10:31
Цитата Сообщение от to Посмотреть сообщение
не понял как его инициализировать.

Добавлено через 2 часа 28 минут
Подскажите как создать типизированный dataset и потом выполнят запросы с его использованием??

Добавлено через 39 минут
Разобрался с типизированным DataSet, но все равно подвисает. Походу это так и есть. Ничего не изменилось .
Потенциально 2 узких места:
1) Выборка данных (выполнение запроса)
2) Перено данных на клиент

Попробуйте сначала разобраться где узкое место находится, там и видно будет что делать.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
03.04.2012, 11:51  [ТС]
Цитата Сообщение от sigmov Посмотреть сообщение
Попробуйте сначала разобраться где узкое место находится, там и видно будет
Решил проблему так, использую типизированный DataSet и при загрузки главной формы создаю конект. Всем остальным формам добавляю еще одно свойство SqlConnection и просто передаю его, то есть постоянно использую одно подключение к БД.
Получаеться что программа только в начале на пару секунд подвисает, почти не заметно, а потом работает как часы.

Добавлено через 10 минут
Хотел спросить а в каком виде лучше использовать запросы, что бы они быстрее работали?
я использую так
C#
1
2
3
4
5
SqlCommand comand = this.connect.CreateCommand();
SqlCommand comd_count = this.connect.CreateCommand();
comand.CommandText = add;
comand.Parameters.Add("@Id", SqlDbType.Int);
comand.Parameters["@Id"].Value = k + 1;
Добавлено через 1 час 4 минуты
Возник еще такой вопрос, а как же связать дочернюю и родительскую таблицы через типизированный DataSet? не могу понять как их связовать, пришел с Delphi там все намного легче.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
03.04.2012, 12:56
Цитата Сообщение от to Посмотреть сообщение
Решил проблему так, использую типизированный DataSet и при загрузки главной формы создаю конект. Всем остальным формам добавляю еще одно свойство SqlConnection и просто передаю его, то есть постоянно использую одно подключение к БД.
Получаеться что программа только в начале на пару секунд подвисает, почти не заметно, а потом работает как часы.
Значит, вероятно, вы не закрывали подключение вовремя.
Нужно вызывать SqlConnection.Close() когда закончили работу с БД на главной форме.
Поставьте ключ Pooling = True и установите размер пула >0.
В этом случае закрытые соединения не будут "умирать" сразу а будут помещаться в Pool и извлекаться из него же по мере надобности.

Хотя ваш вариант тоже будет работать. Его недостаток - через одно соединение нельзя выполнять более 1 запроса одновременно.

Добавлено через 10 минут
Хотел спросить а в каком виде лучше использовать запросы, что бы они быстрее работали?
я использую так
C#
1
2
3
4
5
SqlCommand comand = this.connect.CreateCommand();
SqlCommand comd_count = this.connect.CreateCommand();
comand.CommandText = add;
comand.Parameters.Add("@Id", SqlDbType.Int);
comand.Parameters["@Id"].Value = k + 1;
Это хороший вариант.
Но лучше всего использовать хранимые процедуры.

Добавлено через 1 час 4 минуты
Возник еще такой вопрос, а как же связать дочернюю и родительскую таблицы через типизированный DataSet? не могу понять как их связовать, пришел с Delphi там все намного легче.
Почитайте ADO.NET Девида Сеппа.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
03.04.2012, 23:39  [ТС]
Я тут чуть-чуть почитал и понимаю так - если мы используем не типизированный DataSet то нам нужно устанавливать релейшины, а если типизированный то не нужно. Ну вот только как пользоваться типизированным нигде не могу найти.

Добавлено через 2 часа 32 минуты
или я что-то не так понимаю?

Добавлено через 1 час 51 минуту
Уважаемые форумчане вот нашел в одной книги такое
C#
1
this.dataGrid1.SetDataBinding(gr,"");
но у меня в С# нет такого компонента!
Какое свойство можно использовать у DataGridView?
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
03.04.2012, 23:51
Попробуйте вот по этому разобраться.
http://msdn.microsoft.com/ru-r... 84432.aspx
Как не странно до сих пор не встречал нормальных мануалов по работе с типизированным датасетом и настройкой контролов под него.
А хотя нет видел Гудка))) (это видео курс), но лично мне такой подходи к изучению не нравится - лучше читать книги (быстрее).
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.04.2012, 00:17  [ТС]
спасибо гляну сейчас!
Если бы кто-то код скинул с примерчиком как соеденить 2 таблице, при чем уже связанные в БД!

Добавлено через 23 минуты
дайте примерчик, пожалуйста!
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
04.04.2012, 00:19
Примерчик как с помощью типизированного датасета отобразить на форме два грида один из которых должен отобразить связанные записи?
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.04.2012, 00:21  [ТС]
Цитата Сообщение от _katon_ Посмотреть сообщение
Примерчик как с помощью типизированного датасета отобразить на форме два грида один из которых должен отобразить связанные записи?
Да. Когда мы перемещаемся по одному гриду, то во втором гриде остаються только связанные записи
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
04.04.2012, 00:26
Ура! нашел!
Смотреть видеоролик

вот это был мой первый урок по типизированным датасетам, а там дальше я уж сам разобрался. Не больше 10 мин и ты в курсе как настроить)) и кодить не надо ничего
1
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.04.2012, 09:04  [ТС]
спасибо, сейчас посмотрю!

Добавлено через 8 часов 36 минут
Цитата Сообщение от sigmov Посмотреть сообщение
Значит, вероятно, вы не закрывали подключение вовремя.
Нужно вызывать SqlConnection.Close() когда закончили работу с БД на главной форме.
Поставьте ключ Pooling = True и установите размер пула >0.
В этом случае закрытые соединения не будут "умирать" сразу а будут помещаться в Pool и извлекаться из него же по мере надобности.
Пул соединение вы имеете в виду так:
C#
1
conn = new SqlConnection(@"Data source=.\sqlexpress; integrated security=SSPI; database=kyrs; Pooling=true; Connection LifeTime=60");
А как мне получить это соединение где-то в другой форме??
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
05.04.2012, 07:14
Точно так же.
Просто подключаетесь с той же строкой в другом месте и соединение не открывается заного, а берется из Pool'а.
И уберите [Connection LifeTime=60]
1
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
05.04.2012, 17:54  [ТС]
спасибо попробую!

Добавлено через 35 минут
Попробовал)
Цитата Сообщение от sigmov Посмотреть сообщение
И уберите [Connection LifeTime=60]
А по чему? Это же время которое будет храниться пул соединение, по умолчанию равно 0. И кстати, если я явно не пишу [Pooling=true], он выполняет это не явно, по умолчанию. Получается я и до этого работал с пулами просто не подозревал этого)

Ну не порадовало меня пул соединение) Моему приложению не нужно будет работать с кучей пользователей он простенькое и требует быстрого доступа к базе. Потому считаю что для моего варианта лучше всего использовать одно соединение и передавать его в новые модули. Это на много повысит производительность.

Добавлено через 7 часов 3 минуты
Возник еще такой вопрос, как поместить в dataset таблицу, имя которой будет выбрано в combobox, получить то что выбрано в комбобоксе могу, а вот добавить в dataset ту таблицу что надо не знаю как.
Думал так
C#
1
2
3
4
5
6
7
8
9
10
11
string tab = "SELECT * FROM @t";
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand comand=new SqlCommand();
            comand.CommandText = tab;
            comand.Parameters.Add("@t", SqlDbType.NVarChar, 20);
            comand.Parameters["@t"].Value=comboBox1.GetItemText(comboBox1.Items[comboBox1.SelectedIndex]);
            DataSet ds = new DataSet();
            da.SelectCommand = comand;
            comand.Connection = conn;
            da.Fill(ds, comboBox1.GetItemText(comboBox1.Items[comboBox1.SelectedIndex]));
            dataGridView3.DataSource = da;
но так ошибка, выдает что переменная @t не объявлена
Подскажите как это можно сделать? спасибо!
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
05.04.2012, 19:34
по правилам один вопрос на тему.
я бы просто сделал массив с запросами и по выбору таблицы в комбобоксе делал бы соотвествующий запрос.
хотя опять таки по каждый раз выбирая ты будешь грузить данные. потому рекомендую загрузить все таблицы при загрузке, а при выборе в комбобоксе делать новую привязку в гриде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2012, 19:34
Помогаю со студенческими работами здесь

[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection
Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection Вот такую ошибку выдает. В DSN...

Форма из таблицы SQL Server
Всем привет! Помогите, пожалуйста в следующей ситуации. В таблице БД хранится имя формы и метод Show. Делаю запрос к таблице в rs...

Вывод запроса SQL Server в C#
Всем привет. Подскажите как вывести результат запроса SQL в Label? Вот сам запрос : SELECT COUNT (*) FROM .. WHERE ИТОГО >= 300 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru