![]() |
Модераторы: 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. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |