Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
1

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

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

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

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

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

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

[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 Вот...

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

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

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

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

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

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

Попробуйте сначала разобраться где узкое место находится, там и видно будет что делать.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
03.04.2012, 11:51  [ТС] 9
Цитата Сообщение от 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
579 / 366 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
Завершенные тесты: 2
03.04.2012, 12:56 10
Цитата Сообщение от 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  [ТС] 11
Я тут чуть-чуть почитал и понимаю так - если мы используем не типизированный DataSet то нам нужно устанавливать релейшины, а если типизированный то не нужно. Ну вот только как пользоваться типизированным нигде не могу найти.

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

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

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

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

Добавлено через 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
579 / 366 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
Завершенные тесты: 2
05.04.2012, 07:14 18
Точно так же.
Просто подключаетесь с той же строкой в другом месте и соединение не открывается заного, а берется из Pool'а.
И уберите [Connection LifeTime=60]
1
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
05.04.2012, 17:54  [ТС] 19
спасибо попробую!

Добавлено через 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
Learx
1048 / 855 / 194
Регистрация: 31.03.2010
Сообщений: 2,506
05.04.2012, 19:34 20
по правилам один вопрос на тему.
я бы просто сделал массив с запросами и по выбору таблицы в комбобоксе делал бы соотвествующий запрос.
хотя опять таки по каждый раз выбирая ты будешь грузить данные. потому рекомендую загрузить все таблицы при загрузке, а при выборе в комбобоксе делать новую привязку в гриде
0
05.04.2012, 19:34
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2012, 19:34

Ошибка SQL запроса #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax t
Помогите пожалуйста! CREATE TABLE `tickets` ( `id` int(4) NOT NULL auto_increment, `user`...

Обработка результата запроса из MS SQL SERVER
Добрый день. Потихоньку делал для себя проект. Столкнулся с проблемой. Когда я возвращаю результат...

Подключение к SQL Server
Как мне подключиться локально к серверу(там вместо названия сервера должно быть написано local)....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.