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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кеширование данных, subj 
V
    Опции темы
jonie
Дата 28.9.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Итак, я новичек в C#  8-)
Возникла простетская задачка :
имеется две таблицы , "соединенные" по ключу (1-N) (ms sql05)
Грузить данные из подчиненной таблицы стоит естественно только по условию из первой таблицы)...
Вот тут и возник вопрос : как кешировать данные ? (не стоит же грузить каждый раз данные, которые были ранее выбраны из бд (если возникает нужда в их повторном использовании))
Как это делается в .NET красиво?
----
как пример : имеем на форме combobox и listbox.
combobox ===> главная таблица
listbox - подчиненная, оторажает в зависимости от выбранного в combobox
грузить дважды при выборе одного и тогоже значения в combobox я не вижу смысла (обращение к бд . фырк))....
так как откешировать?

ламерский вопрос, я пологаю что DataSet вполне поможет, однако интересно как это делается в реальности 8) уж больно не хочу наступать на грабли 8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mr.DUDA
Дата 29.9.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Практика показывает что чем проще код, тем лучше (и быстрее). Поэтому если особой нужды в датасете нет, можно поюзать Dictionary.


--------------------
user posted image
PM MAIL WWW   Вверх
jonie
Дата 29.9.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



всеж предпочел бы датасет, ну так как то же можно сделать.... разве нет?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
tol05
Дата 29.9.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(jonie @  28.9.2007,  18:49 Найти цитируемый пост)
Вот тут и возник вопрос : как кешировать данные ? (не стоит же грузить каждый раз данные, которые были ранее выбраны из бд (если возникает нужда в их повторном использовании))
Как это делается в .NET красиво?

DataSet используй. Он для работы в отсоединенном от СУБД режиме и придуман.
Цитата(jonie @  28.9.2007,  18:49 Найти цитируемый пост)
однако интересно как это делается в реальности

через DataSet.
Цитата(jonie @  28.9.2007,  18:49 Найти цитируемый пост)
грузить дважды при выборе одного и тогоже значения в combobox я не вижу смысла (обращение к бд . фырк))....
так как откешировать?

ты или работаешь с данными DataSet-а, загруженными ранее, или вызываешь команды обновления DataSet-a и потом все равно с ним, обновленным, работаешь.
Я не понимаю в чем трудность? Тебе, jonie, DataSet-а мало? хочешь свои хранилища создать для данных. Зачем? 
Придумана прекрасная технология ADO.NET, кеширование организовано в ее корне, специально датасеты разработаны. Что еще нужно? Чтоб провайдер данных сам угадывал, случайно юзер кнопочку нажал (и обновлять данные из СУБД он на самом деле не хочет) или намеренно (ну тогда, что ж, прийдется обновить)? smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 29.9.2007, 17:28 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



tol05
Цитата

или вызываешь команды обновления DataSet-a и потом все равно с ним, обновленным, работаешь.

А чуть чуть поподробнее можно.
А то может я не  использую его возможностей по полной.

Если база используется несколькими пользователями, то при начале работы с программой каждый пользователь загрузил нужные ему данные в память(ДС) и работает, при этом периодически записывает в базу новые данные. Соответственно остальным пользователям периодически нужно обновлять имеющиеся у них данные.
И что бы не тянуть всю таблицу(ы) по-новой, лучше пополнить ДС только новыми строками.




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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата

Я не понимаю в чем трудность?

трудность как раз в
Цитата

И что бы не тянуть всю таблицу(ы) по-новой, лучше пополнить ДС только новыми строками.

как узнать что данные уже были в DataSet и лишь их дополнить???!



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jonie
Дата 29.9.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



в общем решение такое (для 2-х связанный таблиц, сгенерированный датасет строгий):
Код

ExampleDataSet ds = new ExampleDataSet();
parentTableAdapter pa = new parentTableAdapter();
pa.Fill(ds.parent); //заполняем главную
Console.WriteLine("parent::count= {0}", ds.parent.Rows.Count);
// GetchildRows() нам любезно сгенит из xsd студия
if (ds.parent.FindByp_id(1).GetchildRows().Length==0)
{
childTableAdapter cad = new childTableAdapter();
cad.ClearBeforeFill = false; //иначе он почистит старые данные)
cad.Fill(ds.child, 1);
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
tol05
Дата 1.10.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



thomas, я имел в виду что датасет является кешом данных для приложения (отделенное хранилище данных СУБД, данные для работы после заполнения датасета берутся из него и быстрее чем из СУБД)
потом кеш обновляется dataAdapter.Update(dataSet);

достаточно ли ясно (для "почти доцента") я изложил свои мысли?

по поводу высказываний типа "Ах, как было бы хорошо, если бы не..." и подобных:
читаем msdn "Updating Data Sources with DataAdapters "
Цитата

The Update method of the DataAdapter is called to resolve changes from a DataSet back to the data source. The Update method, like the Fill method, takes as arguments an instance of a DataSet, and an optional DataTable object or DataTable name. The DataSet instance is the DataSet that contains the changes that have been made, and the DataTable identifies the table from which to retrieve the changes.

When you call the Update method, the DataAdapter analyzes the changes that have been made and executes the appropriate command (INSERT, UPDATE, or DELETE). When the DataAdapter encounters a change to a DataRow, it uses the InsertCommand, UpdateCommand, or DeleteCommand to process the change. This allows you to maximize the performance of your ADO.NET application by specifying command syntax at design-time and, where possible, through the use of stored procedures. You must explicitly set the commands before calling Update. If Update is called and the appropriate command does not exist for a particular update (for example, no DeleteCommand for deleted rows), an exception is thrown.

...

The Update method resolves your changes back to the data source; however other clients may have modified data at the data source since the last time you filled the DataSet. To refresh your DataSet with current data, use the DataAdapter and Fill method. New rows will be added to the table, and updated information will be incorporated into existing rows. The Fill method determines whether a new row will be added or an existing row will be updated by examining the primary key values of the rows in the DataSet and the rows returned by the SelectCommand. If the Fill method encounters a primary key value for a row in the DataSet that matches a primary key value from a row in the results returned by the SelectCommand, it updates the existing row with the information from the row returned by the SelectCommand and sets the RowState of the existing row to Unchanged. If a row returned by the SelectCommand has a primary key value that does not match any of the primary key values of the rows in the DataSet, the Fill method adds a new row with a RowState of Unchanged.
ключевые слова: RowState, Update(), Fill()

P.S. Если таблица А меняется редко, а таблица В - часто, то и обновлять нужно не датасет целиком,
а таблицу В отдельно
Код

mySqlDataAdapter.Update(dataset.Tables["B"]);

но это нужно адаптеру указывать явно, иначе как адаптер сможет гарантировать, что пока он не обращался к СУБД, таблица А не менялась? Он должен затребовать из СУБД все данные и сравнить полученные со своими существующими.

Это сообщение отредактировал(а) tol05 - 1.10.2007, 09:01


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
jonie
Дата 1.10.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



вариант 2 :
добавить в первую таблицу доп столбец "была или нет подкачена данные дочерней таблицы".


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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