powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
29 сообщений из 29, показаны все 2 страниц
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32745351
Фотография _ChaiNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как человек, пришедший из среды Access ADP, блуждаю в раздумьях: «Как правильно подключаться к серверу?». В ADP было все просто – одно (ну или почти одно:)) подключение на проект, CurrentProject.Connection и пользуешься.
Почитав теорию обнаружил, что ADO.Net предлагает отсоединятся от источника. Может для веба это и хорошо, но по моему скромному представлению в локальных проектах это приводит к задержкам при подключении. Хранить же датасет на клиенте представляется абсурдным из-за его размера.
Я пошел по старому пути, создав одно подключение в основной форме, передавая его в дочерние, т.е. клиент постоянно «висит» подключенным. Насколько это правильно в концепции ADO.Net? А как быть с пользовательскими контролами использующими данные с сервера?
Спасибо.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32745460
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32745998
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_ChaiNikПочитав теорию обнаружил, что ADO.Net предлагает отсоединятся от источника. Может для веба это и хорошо, но по моему скромному представлению в локальных проектах это приводит к задержкам при подключении.[quot]Лучше все таки наверно отключаться каждый раз. Как плюс - не придется писать логику проверки на случай обрыва соединения.
[quot _ChaiNik]Хранить же датасет на клиенте представляется абсурдным из-за его размера. [quot]
А зачем его хранить на клиенте?
[quot _ChaiNik]Я пошел по старому пути, создав одно подключение в основной форме, передавая его в дочерние, т.е. клиент постоянно «висит» подключенным. Насколько это правильно в концепции ADO.Net?[quot] Вопрос не в правильности "концепции ADO.Net", а в правильности концепции твоей программы. Если ты считаешь что нужно постоянное соединение - то пусть оно и будет постоянным.
[quot _ChaiNik]А как быть с пользовательскими контролами использующими данные с сервера?А что с пользовательскими контролами?
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746031
Vova_GVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делаю также. Осбенных неудобств не замечаю. И даже сам считаю - так правильнее.
Есть только одно - в один момент может выполняться только одна комманда.
Причем если использовать DataReader и при выполнении произошла ошибка,
то выполнить вторую команду уже нельзя - ошибка Connection Busy или что- то
подобное. Поэтому везде где у меня используется DataReader использую try...catch или finally где делаю
if (DRdr!=null){DRdr.Close();}
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746045
Vova_GVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Еще хочу добавить. Я не передаю Connection в другие формы. Я делаю его static в главной форме и всегда могу к нему обратиться из любой формы как
CMainFm.SqlCnn
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746110
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vova_GVPЯ делаю также. Осбенных неудобств не замечаю. И даже сам считаю - так правильнее.
Есть только одно - в один момент может выполняться только одна комманда.
Причем если использовать DataReader и при выполнении произошла ошибка,
то выполнить вторую команду уже нельзя - ошибка Connection Busy или что- то
подобное. Поэтому везде где у меня используется DataReader использую try...catch или finally где делаю
if (DRdr!=null){DRdr.Close();}
Вот про это и речь. Лучше уж открывать соединение каждый раз и закрывать когда оно больше не нужно. А для скорости работы можно разрешить использовать пул соединений.

--
WBR,
Roman S. Golubin
--
Стек легко преобразуется в очередь при помощи автомата Калашникова.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746191
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vova_GVPДа. Еще хочу добавить. Я не передаю Connection в другие формы. Я делаю его static в главной форме и всегда могу к нему обратиться из любой формы как
CMainFm.SqlCnn
Котлеты с мухами мешать не стоит - данные должны быть в одном месте, UI - в другом. Логично предположить, что соединение не имеет ни какого отношения к форме.
Лучше вынести всю работу с соединением с сервером в отдельный класс. Например, Application:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Application {

...

  public static SqlConnection Connection{
    get{
      SqlConnection connection = new SqlConnection(connectionString);
      try{
        connection.Open();
      }catch{
         // Здесь обработка ошибок соединения с сервером 
      }
      return connection;
    }
  }

...

}
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746234
VOVA_GVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну это уже вкуса, не спорю - можно и отдельным классом, но смысл использования одного Connection на все приложение от этого не меняется :)
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746311
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VOVA_GVPНу это уже вкуса, не спорю - можно и отдельным классом Не во вкусе дело. После тебя этот проект другие люди сопровождать будут и им будет не очень понятно, исходя из каких соображений ты запихал соединение в форму. ИМО, обработку данных и UI вообще в отдельные библиотеки разносить надо.
VOVA_GVPНо смысл использования одного Connection на все приложение от этого не меняется :)
Смотри внимательно, что выше написано - каждый раз при вызове статичного Connection создается _НОВОЕ_ соединение. В продолжение примера:

[scr c#]

void DoWork(){
SqlConnection conn = Application.Connection;

// Здесь выполняем действия с соединением

conn.Close();
}

[/src]
Таким образом несколько потоков одновременно могут выполнять свою работу. У каждого - свое собственное соединение, которое, когда оно станет не нужно, поток закрывает сам.

Плюсы:
1. Не надо гадать, оборвано ли, по какой либо причине, соединение или нет. Просто устанавливаем новое соединение и работаем с ним.
2. Не надо ждать, пока соединение перестанут использовать другие потоки.

Минусы:
1. Время затраченное на создание нового соединения. (При помещении соединений в пул оно практически равно нулю).
2. Не забывать закрывать соединения после использования ;-))


--
WBR,
Roman S. Golubin
--
Стек легко преобразуется в очередь при помощи автомата Калашникова.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746371
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не увидил у автора треда упоминаний о многопоточном приложении или асинхронных операциях. Т.е. можно обойтись и одним экземпляром, просто открывая/закрывая соединение.

а так, да:
1) не держать клиента подключенным постоянно, просто на всякий случай. Открыли соединение, поработали и закрыли.

2) если приложение многопоточное и потоки работают с СУБД - то каждому потоку свое соединение. Иначе будут проблемы.

3) желательно всегда точно знать сколько соединений с СУБД у вас открыто в любой произвольно взятый момент времени.

4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746401
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A еще лучше - создавать класс не только для соеденения, а для всех операций с данным, т.е. Data Access Layer. Отдельный класс, который будет сам управлять соеденениями, сохранять данные, делать выборки и т.д.

Т.е. в общем случае структура приложения такова : UI->Bisness Rules Layer->Data Access layer.

Интерфейс вызывает методы основного класса, например Save(), далее следует проверка бизнес логики и вызов Save() из DAL.

ЗЫ Инкапсуляция, инкапсуляция, инкапсуляция....

Magnus
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746435
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Magnus23
Как говаривал Хам Трамвайный - как приятно послушать умных людей:) А ещё лучше делать ремотинг - тогда на клиенте в общем случае кроме фреймворка ничего ставить не надо - особенно, когда приложение одновременно может работать с разными СУБД.

Ведь отсоединённые датасет это же такой мощный инструмент - зачем конекшн держать ПОСТОЯННО - ума не приложу....
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746755
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey KudinovЯ не увидил у автора треда упоминаний о многопоточном приложении или асинхронных операциях. Т.е. можно обойтись и одним экземпляром, просто открывая/закрывая соединение.
Я так же не увидел упоминаний о немногопоточности... просто общий случай. Понятно, что случаи могут быть разные.
Alexey Kudinov
3) желательно всегда точно знать сколько соединений с СУБД у вас открыто в любой произвольно взятый момент времени.
Для чего, если не секрет?
Alexey Kudinov
4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл.
Вероятно, ты хотел сказать, что для каждого "логического" соединения свой файл, а еще точнее, для каждого сервера. Иначе файлов наплодится... ;-)

--
WBR,
Roman S. Golubin
--
Стек легко преобразуется в очередь при помощи автомата Калашникова.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746794
вопрос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а время на открытие конекшена?
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746832
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Roman S. Golubin
Для чего, если не секрет?
Для "прозрачности". Для поиска ошибок и проблем. Причем это больше связано с проблемами, которые могут возникнуть на стороне сервера, чем на стороне клиента. Блокировки, deadlock-и. Когда приложение начинает со страшной силой размножать соединения, его трудно отлаживать и зачастую трудно администрировать (на сервере). Т.е. когда я говорил "точно знать", я не имел ввиду держать в программе какой-то счетчик открытых соединений, а хорошо понимать (програмисту) сколько соединений открыто и зачем.

Вероятно, ты хотел сказать, что для каждого "логического" соединения свой файл, а еще точнее, для каждого сервера. Иначе файлов наплодится... ;-) Тут зависит от того, а сколько этих потоков. Если их 3-4 - то для для каждого потока. А если их 300-400 - то да, как-то логически объединять.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32746839
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросНу а время на открытие конекшена?
Как уже говорили, елси использовать пулинг - практически равно нулю.

Да, даже если и без пулинга. Я так во всех проэктах делаю. И не разу еще небыло проблем из-за не обходимости открывать каждый раз соеденение.

Одно дело затраты на открытие соеденения и другое дело затраты ресурсов с обоих сторон(и сервера и клиента) на его поддержку.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32747030
Фотография _ChaiNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем! Тема коннекта раскрыта :)

2 Roman S. Golubin

А под "пользовательскими контролами" я имел ввиду некие универсальные контролы, пользуемые во множестве проектов, например выбор элемента справочника. Им тож надо показывать куда подключаться и откуда данные брать...
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32747304
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Kudinov

4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл.

Про profiler слышали? А про transaction log?
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32747327
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri Alexey Kudinov

4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл.

Про profiler слышали? А про transaction log?
Вероятно имелось ввиду, что подобный лог можно использовать для симуляции ошибок в дополнение к баг-репорту юзеров.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32747353
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23 funikovyuri Alexey Kudinov

4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл.

Про profiler слышали? А про transaction log?
Вероятно имелось ввиду, что подобный лог можно использовать для симуляции ошибок в дополнение к баг-репорту юзеров. В т.ч. и для этого. Просто это действительно очень удобно - работает приложение, а ты сидишь и смотришь в Far-e на файлик, как там запросы бегут. Многое гораздо легче отлаживается. Кроме того, его можно запустить и в собранном приложении регулируя включение/выключение лога например настройкой в реестре. И у пользователей для диагностики.

По поводу профайлера, ODBC логирования и прочих стандартных средств - это не замена им, а в дополнение. Да и стандартные средства не всегда доступны.

Использовал во многих проектах, неизменно доволен.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32749691
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HummerА ещё лучше делать ремотинг - тогда на клиенте в общем случае кроме фреймворка ничего ставить не надо - особенно, когда приложение одновременно может работать с разными СУБД.
Да, но речь шла о подключении клиентов MSSQL, насколько я понял. И при чем тут ремотинг? Или ты знаешь, как через ремотинг к MSSQL подключаться?

А при подключении клиента к серверу приложения - да, .Net remoting рулит.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32749871
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Roman S. Golubin
Не совсем понял - я и имел в виду сервер приложений, к которому коннектиться клиент, а сам сервер уже отдаёт клиенту данные по запросу. Именно поэтому и написал про разные СУБД - получаем выигрыш в простоте распространения программы...

Может просто выразился неточно.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32749913
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Hummer:
А я имел в виду сервер приложений, который коннектится к MSSQL ;-))
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32749927
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Roman S. Golubin
:)
Ну дык и я о том же - классическая трёхзвенка....
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32788281
Фотография _ChaiNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вновь возвращаюсь к этой теме, т.к. начал разбираться с Microsoft Data Access Application Block for .NET Вроде как это и есть Data layer, и вроде как удобно. Пока.
А кто-нибудь использует его в своих проектах? Достаточно функциональности или приходится дописывать Data retrieving в обход этого класса? Поделитесь, плиз.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #32788492
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как показывает практика, практически ни одно готовое решение не удовлетворяет на 100%. Использую в текущем проекте несколько AppBlock'ов, и все приходилось немного докручивать/дописывать.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #38476225
Евгений_lea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Я из вашего спора так и не понял какой вариант лучше.
У меня проект построен на двухзвенке. Список объетов обновляется по таймеру.
Создан отдельный класс для соединения со сервером MSSQL и чтения данных.
Изначально открывал соединение, после выполнения команд закрывал.
Но с таймером переполняется пул, а так предполагаю, что соединение долго закрывается.
Пробывал держать одно постоянно открытое соединение, конфликт получается при мультипоточности.
То есть надо постоянно держать открытое соединение для каждого потока.

Подскажите как выйти из ситуации.
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #38477114
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений_leaНо с таймером переполняется пул, а так предполагаю, что соединение долго закрывается.С чего вдруг такие выводы?
Евгений_leaПробывал держать одно постоянно открытое соединение, конфликт получается при мультипоточности.Используйте lock .
...
Рейтинг: 0 / 0
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
    #38477153
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений_leaПодскажите.Спустя 9 лет? Вряд ли они подскажут.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]