Master-Detail

Dimyan
Дата: 22.05.2005 11:34:02
Здравствуйте!
Решил перейти на написание клиенских приложений с Delphi на C#, но кое что никак немогу понять, поэтому простите за возможно глупые вопросы.
Почитав MSDN, разобрался как реализовать принцип отображения данных как Master-Detail
Сделал так:
_conn.Open();
System.Data.DataSet dsMain = new System.Data.DataSet();
adCars = new iAnywhere.Data.AsaClient.AsaDataAdapter();
adCars.SelectCommand = comCars;
adCars.Fill(dsMain, "Cars");

adOrders = new iAnywhere.Data.AsaClient.AsaDataAdapter();
adOrders.SelectCommand = comOrders;
adOrders.Fill(dsMain, "Orders");

DataRelation myDataRelation;
myDataRelation = new DataRelation("CarsOrd", dsMain.Tables["Cars"].Columns["id"], dsMain.Tables["Orders"].Columns["car_send_id"]);

dsMain.Relations.Add(myDataRelation);
dataGrid1.SetDataBinding(dsMain,"Cars");
dataGrid2.SetDataBinding(dsMain,"Cars.CarsOrd");
Все это прекрасно работат, но я никак немогу понять как можно реализовать следующие:
В таблицы которая является Master заполняется по условию, Detail естественно по связке Master-Detail, т.е. по логике Detail таблица всегда дожна содержать только данные по условию WHERE Detail.MasID = Master.ID. Правильно ли я понимаю что при изменении записи в dataGrid1 содержащим значения таблицы Master я должен всегда вызывать DataAdapter.Fill(Detail)? На какое событее Master таблицы мне делать DataAdapter.Fill(Detail)? Так же было бы неправильно делать перезаполнение Detail если идет просто перебор строк Master таблицы (например пользователь нажатием клавишь вверх или вниз гоняет курсор по гриду) как можно сделать задержку заполнения Detail?
Dimyan
Дата: 23.05.2005 17:04:44
Неужели мой вопрос на столько глуп что не заслуживает ответа :((
Просто перечитал довольно много, а описания моего вопроса нигде нет :(
Sa
Дата: 23.05.2005 17:28:17
Можно конечно сделать и вручную так как вы задумали....
но почему Detail сразу не загрузить необходимым количеством записей?

uid = Sa
Dimyan
Дата: 23.05.2005 17:41:47
Ну просто конкретно в этом форуме народ не советует загружать более 1000 записей а в моем случае это порядка 3000 (правда это в основном максимум)
Хорошо, если с 3000 записей в таблице датасета проблем небудет это даже очень удобно, но вот толко никак тогда немогу понять каким образом формировать SELECT, а точнее блок WHERE деталь таблицы :( Ведь записей в мастере всегда разное кол-во, т.е. получается я дожен перебирать по очереди все полученные в мастер строки (а точнее их id) и вставлять их в блок WHERE деталя по типу WHERE mas_id = "id 1ой строки мастера" AND .... AND mas_id = "id Nой строки мастера"?

И еще такой вопрос, можно ли дозаполнять таблицы, т.е. у меня данные в мастере отображаются по временному диапозону, т.е. два календаря и в интервале между установленной на них датой выбираются данные в мастер, если пользователь чуть расширил временной диапозон, то ведь глупо будет сбросить 3000 записей в детале и закачать снова 3050 записей, можно ли эти 50 записей просто добавить?
Sa
Дата: 23.05.2005 18:02:44
Порционно загружаются записи Master, к каждой записи Master соответствующие записи Detail.

Можно конечно делать и загрузку записей по требованию, но ИМХО не стоит так заморачиваться и дергать сервак.
Хотя я и не знаю какой объем информации вы загружаете. Попробуйте загрузите сразу все записи Master и Detail, посмотрите какая будет скорость. Проверте скорость на компьютере потенциального клиента (если существует такая возможность) и т.д.

uid = Sa
Dimyan
Дата: 23.05.2005 18:49:44
А вот еще такой вопрос: Правильно ли я понимаю что DataSet в ADO.Net является по сути snapshot'ом БД? Т.е. не практикуются создание таблиц в dataSet построеных по выборке с обьединением (Select ... from... join) а такие связи реализуются естественным путем через Relations, все бы нормально, но например в том же ADO (не .Net) можно выбрать данные по запросу с join и при изменении строки в наборе данных я могу просто сделать Refresh это одной строки. Как с обьединенными таблицами работают в ADO.Net? Т.е. я вижу два варианта и оба из них не очень хороших:
1) Закачивать локально все справочники, что не практично, т.к. например у меня одних клиентов около 15000 записей
2) Всетки делать Select с join но тогда при изменении записи ее прийдется сразу сохранять на сервер и перезаполнять DataSet.Table, потому что на сколько я понял нет возможности обновить только одну запись
Какие методы на практике применяют в таких случаях с ADO.Net?
Sa
Дата: 23.05.2005 22:30:55

А вот еще такой вопрос: Правильно ли я понимаю что DataSet в ADO.Net является по сути snapshot'ом БД? Т.е. не практикуются создание таблиц в dataSet построеных по выборке с обьединением (Select ... from... join)

В принципе можно так сказать, но практиковать можно все что угодно, так как DataSet отражает сущности, таким образом, каким ВЫ хотите их отражать и как ВАМ удобнее работать с ними. Часто я видел денормализованные БД и тогда нормализации добивались на клиенте в DataSet. Используя Inner Join напротив получаем денормализацию в DataSet.
DataSet не ссылается на какую-либу БД, т.е. DataSet не отвечает за получение и передачу данных, и вы вообще можете создать и сгенерировать DataSet программным путем.
Кратко - DataSet является snapshotом того что хотите ВЫ и совсем не обязательно реальной БД.

....
2) Всетки делать Select с join но тогда при изменении записи ее прийдется сразу сохранять на сервер и перезаполнять DataSet.Table, потому что на сколько я понял нет возможности обновить только одну запись
Какие методы на практике применяют в таких случаях с ADO.Net?
....

вручную, на стороне сервера, используя ХП, или на стороне клиента используя Command...... Т.е. обычно экземпляры класса DataAdapter, в этом случае, не используют и реализуют СВОЮ логику обработки строк.

uid = Sa
Dimyan
Дата: 24.05.2005 06:50:00

Sa пишет:
>
> вручную, на стороне сервера, используя ХП, или на стороне клиента
> используя *Command*...... Т.е. обычно экземпляры класса DataAdapter, в
> этом случае, не используют и реализуют СВОЮ логику обработки строк.
>
Дак я тогда не совсем понял, можно всетки в заполненом DataSet.Table
обновить только одну запись не перезаполняя всю Table?
И еще такой вопрос, каким образом вообще производится синхронизация
данных с сервером? У меня например база идет восновном на заполнение,
порядка 3-5 записей в минуту, логично перед каждым нажатием клиента
кнопочки для вставки новой записи, синхронизировать данные с сервером,
есть ли возможность синхронизации или только перезаполнение с помощью Fill?

Posted via ActualForum NNTP Server 1.2

Sa
Дата: 24.05.2005 08:29:00

можно всетки в заполненом DataSet.Table
обновить только одну запись не перезаполняя всю Table?

Мы можем редактировать записи в DataTable как угодно, и не только посредством элементов пользовательского интерфейса. Этот тезис вызывает сомнение ? :-)))


И еще такой вопрос, каким образом вообще производится синхронизация
данных с сервером?

есть ли возможность синхронизации или только перезаполнение с помощью Fill?

Не зная вашу задачу, предметную область, структуру БД, опыт работы и т.д. я не могу советовать определенную схему того «как делать синхронизацию».
Достаточно часто просто перезаполняют DataSet при помощи Clear и Fill или используют Fill(tmpDataSet) + myDataSet.Merge(tmpDataSet), либо используют myDataTable.LoadDataRow. Можно минуя DataAdapter, используя DataReader, «пробежаться» по записям, синхронизируя данные, в соответствии с логикой вашего приложения при этом пишем свой метод синхронизации.

Логика синхронизации всегда вытекает из того, каким образом вы реализуете взаимодействие пользователя с данными, как производится обновление данных, и т.д. т.е. я уверен, что универсальных хороших рецептов нет. Использование класса DataAdapter не является необходимым условиям для работы с данными в ADO.NET. Можно реализовать свой DataAdapter и использовать его или обойтись без оного - вариантов вагон и маленькая тележка.

Несомненно, поможет MSDN, литература, форум, практика, практика и практика.
Посмотрите различные методы ключевых классов ADO.NET, найдете много интересного.

uid = Sa
Dimyan
Дата: 24.05.2005 11:02:06

Спасибо большое за разьяснения, просто делфи меня в могилу скоро сгонит
:( Может у меня конечно случай про плохого танцора, но тем не менее. А
на C# я писал немного, мне язик сильно понравился, но вот ADO.Net сильно
уж технология другая (сам принцип я имею в виду), понимаю что вроде и
ничего необычайного, все спокойно реализуемо но и в тоже время
перевернуть в голове таким коренным оброзом устои доступа к данным -
тяжеловато :( От того так много возможно глупых вопросов, просто в том
же MSDN все подробно написано, но примеры какие то селиконовые, а найти
какой нибудь исходничек базейки небольшой но реальной никак немогу, чтоб
посмотреть хоть принципы, что когда и зачем :(

Posted via ActualForum NNTP Server 1.2