На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Посоветуйте, пожалуйста, как лучше , работать с временными таблицами?
    Всем здравствуйте.
    Есть основная база Access. Для расчетов необходимо создавать временную таблицу, которую потом либо удалять либо чистить. Расчеты нужны не постоянно, но ежедневно. Есть несколько вариантов:
    1. Создать сразу таблицу, а чистить её до нужного расчета (на всякий случай) и после расчета.
    2. Создавать таблицу до расчета, а после - удалять. И так - с каждым расчетом. Или - создавать таблицу при запуске программы, а удалять - при выходе из нее. Но встает проблема проверки, существует ли таблица, пока только через MSysObjects нашел вариант.
    3. Создавать временную таблицу вообще в отдельном файле, т.е. в другой базе данных. Соответственно - при запуске программы файл создавать, при выходе - удалять. Не надо тогда проверять существование таблицы, т.к. файл стирается и создается принулительно. Такой вариант мне кажется более простым и удобным: основная база не будет увеличиваться в размерах и надежнее как-то кажется. Но насоклько это скажется на производительности - работа с тибалицами в разных базах?
    Если временную таблицу создавать в той же базе, то за несколько расчетов (от 10 до 15) база распухает примерно в 2 раза :(
    Еще проблема в том, что если взять вариант с созданием таблицы, то создавать её нужно только в том случае, если она не существует, и удалять - если существует. Как проверить? Анализировать выполнился запрос или нет не получается, т.к. он может либо просто не выполниться, либо выполниться некорректно.
    Какой вариант предпочтительнее?
    С базой работаю используя ADO, VC++
    Спасибо за советы
    Сообщение отредактировано: Kezya -
      для временного хранения я использую таблицу, структуру которой храню в основной базе. по кнопке заношу в нее данные, потом запросом ее подчищаю.
      еще использую для временного хранения представления view.
      но с ними возникает проблема: после работы с view - их нужно удалять, но на этапе отладки нередки ситуации, когда нужно удалять view до их использования (с проверкой конечно). я поднимал тему на форуме, как удалять view. резюме такое: нужно удалять view, а субд сама определит есть они или нет. мой Access97/2000 не определяет. удаляю (после удачного создания и работы с view's) вот так
      ExpandedWrap disabled
              
        q.sql.Clear;
        q.SQL.Add('DROP VIEW Temper2, Temper3');
        q.ExecSQL;

      т.е. при наличии VIEW я могу удалить все одним запросом.

      перед работой с запросами пытался удалять представления по одному, т.е.
      ExpandedWrap disabled
        q.SQL.Add('DROP VIEW Temper2');
      , если его нет (а его нет) - то система не хочет его удалять. как проверить наличие VIEW я не знаю.
        Цитата Kezya, 3.12.04, 07:47, 531135
        Какой вариант предпочтительнее?

        чаше ползуюс вариантам 1 но и другими тоже. все они хороши.
          Цитата Kezya, 3.12.04, 06:47, 531135
          Для расчетов необходимо создавать временную таблицу, которую потом либо удалять либо чистить

          Cоздавай массив и работай с ним.
            у меня клиент-серверное приложеньице, и я завел себе локально небольшую базу, и все временные таблицы храняться в ней, а не на серваке, удалять их я не удаляю, а просто чищу..
              Массив совсем не удобно, к сожалению. А так да, было бы быстрее гораздо.
              А если вынести таблицу в отдельный файл(т.е. в отдельную базу), почему бы тогда не создавать/удалять таблицу в ней, а просто чистить полностью через DELETE?
              Ну и наравне со сжатием основной базы сжимать и эту заодно.
                Цитата Kezya, 3.12.04, 13:02, 531510
                Ну и наравне со сжатием основной базы сжимать и эту заодно

                Ну так это долго.
                И еще вариант использование VIEW.
                  Цитата Bas,3.12.04, 14:17 @
                  Цитата Kezya, 3.12.04, 13:02, 531510
                  Ну и наравне со сжатием основной базы сжимать и эту заодно

                  Ну так это долго.
                  И еще вариант использование VIEW.

                  Долго сжимать? Т.е. получается проще удалять временную таблицу из другой базы и все?
                    2Kezya, после удаления (многократного) все равно база пухнет и ее нужно сжимать.
                      Цитата Kezya,3.12.04, 14:02 @
                      почему бы тогда не создавать/удалять таблицу в ней, а просто чистить полностью через DELETE?

                      я тебе это и советовал :)
                        Тогда я не понимаю, чем создание/удаление таблицы лучше простой очистки содержимого?
                        Я могу и ошибаться, но очистка меньше времени занимает?
                        :wacko:

                        Добавлено
                        PIL, Ага, я просто не ошидал, если честно, столь бурной дискуссии. Вариантов много, оказывается, ищу лучший :rolleyes:
                          прошу прощения за оффтоп, но сжатие меня заинтересовало..
                          в FoxPro - там было все просто - PACK, а как я могу сделать сжатие базы ACCESS со своей проги(VC++ +ADO)?
                            Сжатие делается так:
                            в stdafx.h подключаешь dll-ку:
                            #import "c:\Program Files\Common Files\System\ado\msjro.dll" no_namespace - например так :)


                            ExpandedWrap disabled
                                  try
                                  {
                                      CString strBasePath = "", strTmpPath = "";
                                      strBasePath = //путь до базы данных
                                      strBasePath += "main_base.mdb";
                                      strTmpPath += "base_tmp.mdb";
                                      IJetEnginePtr jet(__uuidof(JetEngine));
                                      CString strSrcConnection = "Data Source=" + strBasePath +
                                          ";Jet OLEDB:Database Password=" + sp + ";";
                                      CString strDestConnection = "Data Source=" + strTmpPath +
                                          ";Jet OLEDB:Database Password=" + sp + ";Jet OLEDB:Encrypt Database=True;";
                                      
                                      jet->CompactDatabase(_bstr_t(strSrcConnection), _bstr_t(strDestConnection));
                                  }
                                  catch(_com_error &e)
                                  {
                                      ::MessageBox(NULL, (LPCTSTR)e.Description( ), "", MB_OK) ;
                                      return FALSE;
                                  }

                            Все, база сжалась. Но она находится сжатая в другом файле (base_tmp.mdb). Остается только подменить старый файл новым. Причем здесь сжатие с сохранением пароля на открытие базы.

                            Добавлено
                            Мне кажется, или до этого была какая-то хрень с соседней темой: Как проверяете существование таблицы?, ADO/Delphi/Access by tomsksmile?
                              M
                              Как проверяете существование таблицы?, ADO/Delphi/Access by tomsksmile?
                              Разделена
                                И все же: временная таблица лучше в другой базе? или без разницы?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0402 ]   [ 15 queries used ]   [ Generated: 21.05.24, 18:29 GMT ]