powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
25 сообщений из 29, страница 1 из 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
25 сообщений из 29, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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