![]() |
|
Модераторы: gambit |
![]()
|
|
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
Как закешировать в датасет часть первой таблицы(топ 1000) и соответствующую
часть второй таблицы(таблицы связаны по внешнему ключу) используя "один" запрос. Читал, что что-то подобное можно сделать с помощью OleDbDataAdapter и "SHAPE ... APPEND .... RELATE ...", но до конца не розабрался :( Может и без OleDbDataAdapter это возможно ..... |
|||
|
||||
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Pankon,
Приветствую. Если работаем с БД Access то использование OleDbDataAdapter как бы обязательно. Создаешь соединение, создаешь обьект команды, создаешь на их основе OleDbDataAdapter. Далее выполняешь метод Fill() для OleDbDataAdapter что бы заполнить таблицу в ДатаСет данными из БД.
Вся фишка в том что бы написать грамотно sql команду. Раз тебе надо взять данные из двух связанных таблиц используем JOIN , а так же оператор TOP 1000 для соответствующей таблицы. Если напишешь правильный запрос к БД, то получишь в ДатаСет таблицу с первыми 1000 записями. Успехов. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
||||
|
||||
| unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
Помимо запросов, ещё такая фича есть:
Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable); Заливка начиная с номера записи startRecord и всего maxRecords. -------------------- ![]() обычный день на винграде |
|||
|
||||
| thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Pankon,
Значит, используем sqlClient вместо OleDb.
так и в чем проблема? В данном случае тебе нужно будет два раза присвоить свойству команд sql-команду, сначала к одной таблице, потом ко второй. И соответственно два раза вызвать метод Fill() для ДатаАдаптер, что бы сначала создать и заполнить в ДатаСет первую таблицу, а потом и вторую. Раз тебе нужны первые 1000 записей, то в запросе к соответсвующей таблице используй оператор ТОР. Да и не забудь создать обьект relation между таблицами в ДатаСет. Усё. Успехов. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
||||
|
||||
| unicuum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
А как тебе использовать Fill? Вроде не должно тормозить систему, если берутся записи начиная с нулевой.
И потом соответственно ещё Relation добавить. Но оптимальный ли это вариант в целом, то есть вручную всё делать? -------------------- ![]() обычный день на винграде |
||||
|
|||||
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
unicuum,
Приветствую. Очень замечательный совет
А кто может гарантировать, что первая тысяча строк второй таблицы имеет какое-то отношение к первой тысяче строк первой таблицы? Pankon, При запросе ко второй таблице без INNER JOIN не обойтись. Потому как тебе надо из второй таблицы получить только те записи, которые имеют отношение к первым 1000 записям первой таблицы. И соответственно не забудь прикрутить оператор ТОР для первой таблицы, ведь тебе надо из второй таблицы получить только те записи, которые относятся к первой тысяче записей первой таблицы. И уже потом когда в ДатаСет будут созданы и заполнены данными две таблицы, создавай для них обьект relation. Теперь, надеюсь, все понятно. Успехов. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| farad |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: 3 Всего: 6 |
попробуй MSDN, тебе понравится
|
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
farad, пожалуйста выражайся яснее....
Это сообщение отредактировал(а) Pankon - 1.2.2008, 14:55 |
|||
|
||||
| farad |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: 3 Всего: 6 |
А что осилить страницу текста по сылке тяжело? Специально для вас адаптированный вариант:
|
||||
|
|||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
farad, уже прочитал....
Если бы ты сказал, что речь идет про "SHAPE ... APPEND .... RELATE ..." и ссылку, то было бы все понятней... Ну да ладно... все равно получай плюс ПС. Ха, тебе уже thomas тоже за то же рейтинг поднял ..... Не беда..... будешь иметь два плюса..... Это сообщение отредактировал(а) Pankon - 1.2.2008, 15:17 |
|||
|
||||
| farad |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: 3 Всего: 6 |
||||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: нет Всего: 5 |
Протестировал "SHAPE ... APPEND .... RELATE ..." на маленьких таблицах - то что надо...
Протестировал на больших таблицах.... результат удручающий.... Причем для первой таблицы сделал топ 1. Такое ащющение, что вторая таблица вначале ПОЛНОСТьЮ кэшируется на локальной мачине Как покажавает Task-Manager после запуска оперативнай память(~20 мин) забивается до предела, и затем, мое тестовое приложение дает исключение - переполненние опер.памяти Во время работы тестового приложение нашел в Enterprise Manager процесс для моего коннекта, там стоит "Select top 1 * From Table1;Select * From Table2". Так резултатов тестов я и не получил |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |