Несколько вопросов по ADO.NET

Gold
Дата: 01.03.2005 19:50:15
Привет. До этого я программировал клиентов на Delphi, а сейчас приходиться разбираться с ADO.NET, в частности с датасетом и датаадаптером, и мне многие его концепции непонятны:

1) Не могу найти аналога дельфийскому DataSet.Refresh (и RefreshSQL соттветственно). Т.е. мне надо перечитать одну конкретную запись из таблицы в объект DataTable. Как мне это сделать?

2) Как осуществляется вставка записей мне непонятно. Например у меня есть таблица с миллионом записей. Я один раз заполнил DataSet и вставил на клиенте 5 записей в эту таблицу. В это же время ещё несколько граждан вставили тоже по несколько записей и теперь мы свои изменения пытаемся влить в базу. Мне не понятно как адо разруливает создание уникальных ключей. Если АДО генерирует их сам, то как он обеспечивает уиникальность ключей у меня и у соседей. Если же ключи создаються на сервере, то как мне после вставки изменений узнать значения вставленных ключей ?

3) Возможно ли чтобы DataSet заполнялся по мере необходимости? В дельфи считывалось столько записей, сколько нужно для отображения в связанных с датасетом контролах. Если контролос нет, то при вызове DataSet.Open из базы считывается только одна запись. Таким образом если у меня есть таблица с 100 миллионами записей и она отображается в DBGrid, то по умолчанию на клиента будут грузиться не все 100 миллионов, а столько, сколько требует грид. Как это работает в адо?
Стр
Дата: 01.03.2005 20:08:58
автор
не могу найти аналога ...


1. не ищи аналогов там, где их нет :)

2. полностью забудь опыт программирования с обычным ADO вообще и в Delphi в частности.

для начала посмотри:

ADO.NET for the ADO Programmer
JeSert
Дата: 02.03.2005 13:24:24
Gold
посмотри форум по 3 вопросу описывались по "листные запросы" - типа того не помню.
и что тебе сдесь помешало считывать нужную информацию в DataSet?
это дело простых запросов(для начала)
Артем1
Дата: 02.03.2005 13:41:33
Стр
...2. полностью забудь опыт программирования с обычным ADO вообще и в Delphi в частности...


Ну не полностью, но в целом поддерживаю.

Касательно первого вопроса. Можно считать одну строку в отдельный датасет и затем сделать им Merge. Это будет похоже на Resync по эффекту :).

Касательно второго вопроса - мне понравился один прикольный способ для master-detail датасетов, но и для однотабличных сойдет. В ключевой колонке назначается автоинкремент 0 и идет в минус. А при сохранении у адаптера вызывается команда на сохранение, которая может сделать селект сохраняемой строки после ее обновления (или вставки) уже со всеми ключами и т.п. Эта команда настраивается тобой-же, т.е. можно и хп замутить.
Sa
Дата: 02.03.2005 14:29:28
Gold

сейчас приходиться разбираться с ADO.NET, в частности с датасетом и датаадаптером, и мне многие его концепции непонятны

читайте литературу, постепенно сориентируетесь.

Gold

1) Не могу найти аналога дельфийскому DataSet.Refresh (и RefreshSQL соттветственно). Т.е. мне надо перечитать одну конкретную запись из таблицы в объект DataTable. Как мне это сделать?

Одно из главных преимуществ DataSet состоит в том, что он не зависит от источника данных. Т.е. нет обратной связи DataSet <-> Database, и нигде в DataSet вы не найдете сведений откуда были получены данные, либо из БД, либо из XML, либо сгенерированы вручную, таким образом не может быть и речи о существовании метода Refresh в классе DataSet.

Функциональность по обновлению данных реализуется разными способами вручную, варианты реализации можно посмотреть здесь на форуме и на форуме C#.

Gold

2) Как осуществляется вставка записей мне непонятно. Например у меня есть таблица с миллионом записей. Я один раз заполнил DataSet и вставил на клиенте 5 записей в эту таблицу. В это же время ещё несколько граждан вставили тоже по несколько записей и теперь мы свои изменения пытаемся влить в базу. Мне не понятно как адо разруливает создание уникальных ключей. Если АДО генерирует их сам, то как он обеспечивает уиникальность ключей у меня и у соседей. Если же ключи создаються на сервере, то как мне после вставки изменений узнать значения вставленных ключей ?

Как вы запрограммируете так и будет эта ситуация разруливаться :-) ADO.NET здесь не принимает решений, в случае чего просто поймаете исключение.
Артем1

мне понравился один прикольный способ для master-detail датасетов, но и для однотабличных сойдет. В ключевой колонке назначается автоинкремент 0 и идет в минус.

Это рекомендуемая практика, когда, отсоединено от источника данных, идет генерация псевдоключей, а при вставке данных значения псевдоключей подменяются реальными данными, (автоинкремент может быть любым, в минус - обеспечивается "согласованность" с уже имеющимися ID)

Gold

3) Возможно ли чтобы DataSet заполнялся по мере необходимости? В дельфи считывалось столько записей, сколько нужно для отображения в связанных с датасетом контролах. Если контролос нет, то при вызове DataSet.Open из базы считывается только одна запись. Таким образом если у меня есть таблица с 100 миллионами записей и она отображается в DBGrid, то по умолчанию на клиента будут грузиться не все 100 миллионов, а столько, сколько требует грид. Как это работает в адо?

Мое ИМХО, если 100 млн. записей в гриде - это ошибка проектирования, рядовой пользователь не сможет переварить столько. Если же и вызовется "доброволец", то реализуйте ему порционную загрузку данных.
P.S. у вас везде слово ADO, а я говорю про ADO.NET, так как форум у нас так называется ADO.NET :-)

uid = Sa
Gold
Дата: 07.03.2005 16:42:24
Спасибо всем за ответы. По ходу дела оказалось что у нас люди DataSet вобще не используют. Считывают данные датаридером в свои классы и работают со своими классами. Тоже интересный способ, только вот привязку этик классов к контролам делать дольше.
Сахават Юсифов
Дата: 15.03.2005 15:36:58
DataSet - мечта удава. БД в памяти. Которую можно передать между приложениями.