Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закешировать в датасет части таблиц, OleDbDataAdapter  
V
    Опции темы
Pankon
  Дата 30.1.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Как закешировать в датасет часть первой таблицы(топ 1000) и соответствующую 
часть  второй таблицы(таблицы связаны по внешнему ключу) используя "один" запрос.

Читал, что что-то подобное можно сделать с помощью OleDbDataAdapter  и "SHAPE ... APPEND .... RELATE ...", но до конца не розабрался :(

Может и без OleDbDataAdapter  это возможно .....



PM MAIL   Вверх
thomas
Дата 30.1.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Pankon
Приветствую.
Если работаем с БД Access то использование OleDbDataAdapter как бы обязательно.

Создаешь соединение, создаешь обьект команды, создаешь на их основе OleDbDataAdapter. Далее выполняешь метод Fill() для OleDbDataAdapter что бы заполнить таблицу в ДатаСет данными из БД.

Цитата

Как закешировать в датасет часть первой таблицы(топ 1000) и соответствующую 
часть  второй таблицы(таблицы связаны по внешнему ключу) используя "один" запрос.

Вся фишка в том что бы написать грамотно sql команду. Раз тебе надо взять данные из двух связанных таблиц используем JOIN , а так же оператор TOP 1000 для соответствующей таблицы.
Если напишешь правильный запрос к БД, то получишь в ДатаСет таблицу с первыми 1000 записями.

Успехов.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Pankon
Дата 31.1.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(thomas @  30.1.2008,  18:53 Найти цитируемый пост)
Если работаем с БД Access
 sorry, забыл сказать MS SQL Server 2000

Цитата(thomas @  30.1.2008,  18:53 Найти цитируемый пост)
Раз тебе надо взять данные из двух связанных таблиц используем JOIN
 JOIN возвращает одну таблицу, а мне нужно две связанные таблицы запихнуть в Dataset

PM MAIL   Вверх
unicuum
Дата 31.1.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Помимо запросов, ещё такая фича есть:

Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable);

Заливка начиная с номера записи startRecord и всего maxRecords.


--------------------
user posted image
обычный день на винграде
PM   Вверх
thomas
Дата 31.1.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Pankon
Цитата

MS SQL Server 2000

Значит, используем sqlClient вместо OleDb.
Цитата

мне нужно две связанные таблицы запихнуть в Dataset

так и в чем проблема? В данном случае тебе нужно будет два раза присвоить свойству команд sql-команду, сначала к одной таблице, потом ко второй.
И соответственно два раза вызвать метод Fill() для ДатаАдаптер, что бы сначала создать и заполнить в ДатаСет первую таблицу, а потом и вторую.
Раз тебе нужны первые 1000 записей, то в запросе к соответсвующей таблице используй оператор ТОР. Да и не забудь создать обьект relation между таблицами в ДатаСет.
Усё.

Успехов.  smile 




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Pankon
Дата 31.1.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(thomas @  31.1.2008,  14:44 Найти цитируемый пост)
Да и не забудь создать обьект relation между таблицами в ДатаСет.
 и тогда из второй таблице получу тольке те записи, которые соответствуют записям из первой таблици(топ 1000)? (правда не знаю  smile )

PM MAIL   Вверх
unicuum
Дата 31.1.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(thomas @  31.1.2008,  14:44 Найти цитируемый пост)
Раз тебе нужны первые 1000 записей, то в запросе к соответсвующей таблице используй оператор ТОР. Да и не забудь создать обьект relation между таблицами в ДатаСет.

А как тебе использовать Fill? Вроде не должно тормозить систему, если берутся записи начиная с нулевой.

Код

Me.OleDbDataAdapter1.Fill(dataSet, 0, 1000, "tblTable1")
Me.OleDbDataAdapter1.Fill(dataSet, 0, 1000, "tblTable2")

И потом соответственно ещё Relation добавить. Но оптимальный ли это вариант в целом, то есть вручную всё делать?


--------------------
user posted image
обычный день на винграде
PM   Вверх
thomas
Дата 31.1.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



unicuum
Приветствую.
Очень замечательный совет
Код

Me.OleDbDataAdapter1.Fill(dataSet, 0, 1000, "tblTable1")
Me.OleDbDataAdapter1.Fill(dataSet, 0, 1000, "tblTable2")

А кто может гарантировать, что первая тысяча строк второй таблицы имеет какое-то отношение к первой тысяче строк первой таблицы?


Pankon
При запросе ко второй таблице без INNER JOIN не обойтись. Потому как тебе надо из второй таблицы получить только те записи, которые имеют отношение к первым 1000 записям первой таблицы. И соответственно не забудь прикрутить оператор ТОР для первой таблицы, ведь тебе надо из второй таблицы получить только те записи, которые относятся к первой тысяче записей первой таблицы.

И уже потом когда в ДатаСет будут созданы и заполнены данными две таблицы, создавай для них обьект relation.

Теперь, надеюсь, все понятно.
Успехов.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Pankon
Дата 1.2.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



thomas, я понял так, 
первый fill с -
"Select top 1000 key1, * From Table1"

а второй fill с 
"Select * From Table2 inner join INNER JOIN  (SELECT * FROM Table2) t2 ON Table1.key1= t2.key1"

Но это не совсем то, что я хотел.
В первом посте я говорил -  используя "один" запрос для обоих таблиц. 
По нескольким причинам:
1. между первым fill и вторым fill данные в таблицах могут изменится, соответственно, второй fill "вытянет" из второй таблицы уже не "валидные" данные  для закэшированных данных из первой. (сразу скажу, что блокировать таблицы нельзя).

2. нужно оптимизировать обращение к базе данных, поэтому и хотелось вначале закэширивать данные, а потом "обрабатывать".  В нашем же случае - два  fill  -   два запроса к БД - ничего, как мне кажется, не оптимизируют. Кроме того, второй  запрос с JOIN  содержит такой же  "подзапрос" как и первый fill, - два одинаковых запроса к таблице1  smile 
    
PM MAIL   Вверх
farad
Дата 1.2.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: 3
Всего: 6



попробуй MSDN, тебе понравится
PM MAIL   Вверх
Pankon
Дата 1.2.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



farad, пожалуйста выражайся яснее....

Это сообщение отредактировал(а) Pankon - 1.2.2008, 14:55
PM MAIL   Вверх
farad
Дата 1.2.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: 3
Всего: 6



Цитата(Pankon @  1.2.2008,  14:44 Найти цитируемый пост)
 засаряешь форум...
А что осилить страницу текста по сылке тяжело? Специально для вас адаптированный вариант:
Цитата(MSDN)

В следующем примере с помощью поставщика данных MSDataShape создается сегментированный столбец заказов для каждого заказчика, имеющегося в списке заказчиков. Затем этими данными заполняется объект DataSet.

Код

OleDbConnection nwindConn = new OleDbConnection("Provider=MSDataShape;Data Provider=SQLOLEDB;" +
                                  "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

OleDbDataAdapter custDA = new OleDbDataAdapter("SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +
                                      "  APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " +
                                      "  RELATE CustomerID TO CustomerID)", nwindConn);

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");


По завершении работы метода Fill объект DataSet будет содержать две таблицы: Customers и CustomersOrders, где CustomersOrders представляет собой столбец с разделами. В таблицу Customers добавлен дополнительный столбец с именем Orders, а в таблицу CustomersOrders — дополнительный столбец с именем CustomersOrders. Столбец Orders в таблице Customers установлен в режим автоматического приращения. Объект DataRelation с именем CustomersOrders создан на основе добавленных в таблицы столбцов, причем Customers — это родительская таблица.


PM MAIL   Вверх
Pankon
Дата 1.2.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



farad, уже прочитал....
Если бы ты сказал, что речь идет про "SHAPE ... APPEND .... RELATE ..." и ссылку, то было бы все понятней...
Ну да ладно... все равно получай плюс  smile 


ПС. Ха, тебе уже thomas тоже за то же рейтинг поднял ..... Не беда..... будешь иметь два плюса.....

Это сообщение отредактировал(а) Pankon - 1.2.2008, 15:17
PM MAIL   Вверх
farad
Дата 1.2.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: 3
Всего: 6



Цитата(Pankon @  1.2.2008,  14:44 Найти цитируемый пост)
farad, пожалуйста выражайся яснее....
 Согласен, был неконкретен. Учту на будущее. smile  А плюсы я люблю  smile 

PM MAIL   Вверх
Pankon
  Дата 1.2.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Протестировал "SHAPE ... APPEND .... RELATE ..."  на маленьких таблицах - то что надо...

Протестировал на больших таблицах.... результат удручающий....
Причем для первой таблицы сделал топ 1.

Такое ащющение, что вторая таблица вначале ПОЛНОСТьЮ кэшируется на локальной мачине  smile . 
Как покажавает Task-Manager после запуска оперативнай память(~20 мин) забивается до предела, и затем, мое тестовое приложение дает исключение - переполненние опер.памяти
Во время работы тестового приложение нашел в Enterprise Manager процесс для моего коннекта, там стоит "Select top 1 * From Table1;Select * From Table2".

Так резултатов тестов я и не получил   smile 








PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.