База Данных и потоки

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем boden, 4 апр 2007.

  1. boden

    boden Гость

    Суть: надо создать поток(и) из которого осуществлять чтение/запись в БД. Но я столкнулся с некоторыми проблемами. Прошу помощи.

    Мой код:
    Код:
    Код (Text):
    DWORD WINAPI SQL_Thread(LPVOID ptr)
    {
    // точка (А)

    return 0;
    }


    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // ------------ начало блока (А) -------------------
    TSession* s;
    TDatabase* db;

    s=new TSession(0);
    s->SessionName="my_session";
    s->Open();

    db=new TDatabase(0);
    db->DatabaseName="MY_DB";
    db->DriverName="MSACCESS";
    db->HandleShared=true;
    db->Exclusive=false;
    db->KeepConnection=false;
    db->Params->Text="DATABASE NAME=F:\\borland\\work\\data.mdb";
    db->LoginPrompt=false;
    db->SessionName="my_session";
    db->Open(); /// точка Х

    db->Execute("insert into images (`value`, `hash`,`system_id`) values(1111,1222,1)");
    // ------------ конец блока (А) --------------
    DWORD thr=0;
    CreateThread(NULL,0,&SQL_Thread,0,0,&thr);
    }
    Если исполнять этот код, как приведено, т.е. в основном потоке, то все зашибись, если перенести "блок А"(или, например, последнюю инструкцию с Execute) в "точку А" (в создаваемый поток), то прога падает в "точке Х"(если перенесена только строка с execute, то, соответственно, в точке с execute). Ошибка вылетает "Ассеss violation at .... write of address ..."
     
  2. Barmutik

    Barmutik Гость

    Если мне не изменяет память до операции с БД имеют проблемы с многопоточностью и указано что надо дёргать их синхронно в одном потоке...
     
  3. boden

    boden Гость

    Т.е. чего нить типа: в основной форме по таймеру проверять значение некоей переменной, в которую заносить значение из потоков!?.
    Хм.... я уже думал об этом, но был уверен, что есть более простой, правильный способ ((( А ведь процессы могут иметь параллельный доступ к БД... а потоки нет......
    Хм.... есть еще такой пример в samples "BKQUERY".... надеюсь это мой вариант и надеюсь, зватит ума в нем разобраться...
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: boden
    А ты уверен что твой подход правильный? По каждому нажатию на кнопку создавать объекты БД и сессии (кстати, ты их не удаляешь), инициализировать их и только после этого выполнять запрос. Это если пользователь нажмет 50 раз кнопку, то 50 раз выполняться абсолютно ненужные действия
     
  5. boden

    boden Гость

    Предлагаете использовать уже имеющиеся объекты? Та же проблема с Ассеss violation. Причем, ладно бы переменная где то портилась, но значение db в момент вызова execute имеет правильное, нужное зачение.
    разрушить проще чем создать))) мне бы для начала хотя бы их создать, чтоб работало. Все равно до момента разрушения прога еще не доживает
     
Загрузка...
Похожие Темы - База Данных потоки
  1. Zhuk
    Ответов:
    18
    Просмотров:
    1.955
  2. ALEXandr2033
    Ответов:
    0
    Просмотров:
    1.074
  3. Apoka5555
    Ответов:
    0
    Просмотров:
    1.574
  4. Anneta
    Ответов:
    1
    Просмотров:
    1.704
  5. Delete
    Ответов:
    4
    Просмотров:
    2.034

Поделиться этой страницей