• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы boden
  • Дата начала
B

boden

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

Мой код:
Код:
Код:
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 ..."
 
B

Barmutik

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

boden

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

DESCRIPTION:
Demonstrates a background query on a database.

DEMONSTRATES:
Multi-threaded SQL queries, thread synchronization using
Interlocked increment, user-defined resources and string
resources.
 
E

European

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

boden

А ты уверен что твой подход правильный? По каждому нажатию на кнопку создавать объекты БД и сессии,инициализировать их и только после этого выполнять запрос. Это если пользователь нажмет 50 раз кнопку, то 50 раз выполняться абсолютно ненужные действия
Предлагаете использовать уже имеющиеся объекты? Та же проблема с Ассеss violation. Причем, ладно бы переменная где то портилась, но значение db в момент вызова execute имеет правильное, нужное зачение.
(кстати, ты их не удаляешь),
разрушить проще чем создать))) мне бы для начала хотя бы их создать, чтоб работало. Все равно до момента разрушения прога еще не доживает
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!