Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Проблема в ADO   Найти похожие ветки 

 
Мунька   (2004-05-04 19:14) [0]

Для доступа к данным MS Access использую компонент TADOQuery. Проблема в следующем. Формирую SQL-запрос на удаление данных из таблицы, даю его на выполнение, естественно, что следующий шаг - отображение оставшихся данных. Вот тут и возникает проблема - при выполнении запроса SELECT * и т.д возвращается столько же данных, сколько и было до удаления. То есть результат удаления виден только, если я вручную нажимаю на своей форме кнопку "Обновить" (которую сама делала). Проблему я обходила лишь в том случае, когда между DELETE и SELECT проходило определенное время, около 2 секунд (Sleep(2000) ). Может быть есть другие возможности? Вместе с  TADOQuery использую TADOConnection, поскольку без него вообще мрачно.


 
sniknik ©   (2004-05-05 00:19) [1]

буферизация и задержки естественно есть, но вот 2сек это по моему слишком много, оправдано только если из разных коннектов делается (обьекты разные и данные одного в другом пока все буфера не скинуты недоступны).

> Вместе с  TADOQuery использую TADOConnection, поскольку без него вообще мрачно.
вы бы привели как, и какой для селекта и какой для удаления, а то чтото задержка подозрительно большая, чегото не так, именно впечатление что не используется TADOConnection (или разный для разных кверей).


 
SergP ©   (2004-05-05 00:27) [2]

Хм... работаю тоже с Access через ADO
Но таких проблем еще не возникало
а удаляю я так:
AdoConnection1.Execute("delete ..... ");

просто так удобнее...


 
Курдль ©   (2004-05-05 00:43) [3]

а удаляю я так:
Format C:
просто так удобнее...


 
sniknik ©   (2004-05-05 00:58) [4]

SergP ©   (05.05.04 00:27) [2]
проверь с двумя компонентами ADOCommand1 для удаления и ADODataSet/ADOQuery для запроса, но только без ADOConnection(!!!) в одном или лутше в обоих случаях, вместо этого строку коннекта прям в компонентах пропиши, будет то что описано. (и то 2сек чегото много)

Курдль ©   (05.05.04 00:43) [3]
да ты просто высокочастотное излучение на диск не пробовал! гораздо удобнее, и чище. ;о)


 
SergP ©   (2004-05-05 01:37) [5]

>sniknik ©   (05.05.04 00:58)

Может быть... не пробовал, да и я вам верю на слово...
Только вот  как я понял, вопрошающий все-таки юзает ADOConnection

>Курдль ©   (05.05.04 00:43)
Ну это вообще круто...

Хотя можно еще и нагреть винт до температуры Кюри. Быстрее будет. Например кинуть его в емкость с расплавленным железом... А то FORMAT C: долго выполняется...


 
sniknik ©   (2004-05-05 01:42) [6]

> Только вот  как я понял, вопрошающий все-таки юзает ADOConnection
тоже так думаю, да и написал он об этом, но всетаки как то не правильно юзает если такие тормоза.


 
Мунька   (2004-05-05 11:06) [7]

Дело в том, что на SELECT и DELETE действительно два разных ADOConnection - просто один, тот что на SELECT - в одной форме, а на DELETE - в другой, правда, та форма модальная - пока не удалит  или не отменит действие SELECT недоступен.
Код выглядит так
извлечение
bool  __fastcall TMainForm::SelectHistory(int UserId, int DeviceId)
{
    try{
  if(ADOQueryHistory->Active)
   ADOQueryHistory->Close();
 }
catch(...)
 { return false;}

   ADOConnectionHistory->Connected  = false;
   ADOConnectionHistory->ConnectionString = ConnectionADO;
   ADOConnectionHistory->Connected  = true;
   ADOQueryHistory->Connection = ADOConnectionUser;
   ADOQueryHistory->SQL->Clear();

   ADOQueryHistory->SQL->Add("SELECT * FROM TableHistory" );
   ADOQueryHistory->SQL->Add("WHERE UserId =" + IntToStr(UserId) );
   if (DeviceId!=-1)
   ADOQueryHistory->SQL->Add("AND DeviceId =" + IntToStr(DeviceId) );
   try{
       if(!ADOQueryHistory->Prepared )
        ADOQueryHistory->Prepared = true;
              ADOQueryHistory->Open();
      }
  catch(...)
  {
   return false;
  }

  return true;
}
//Далее - процедура вызова формы определения критериев удаления
void __fastcall TMainForm::ADeleteHistoryExecute(TObject *Sender)
{
FormDeleteHistory->UserId = UserId;
FormDeleteHistory->L_SecFirstName->Caption =  UserSecondName + " " +UserFirstName;  
FormDeleteHistory->LMiddleName->Caption =   UserMiddleName;
if(FormDeleteHistory->ShowModal()==mrOk)
{
 //Вторая задержка
  Sleep(800);
    SetDefSG_History();
    if (!SelectHistory(UserId) )
    return;
   InputHistoryToGrid();
   SG_History->Invalidate();
}
}
//И процедура удаления в FormDeleteHistory
void __fastcall TFormDeleteHistory::SB_DeleteClick(TObject *Sender)
{
TDateTime BDT, EDT;
AnsiString sqltxt = "DELETE FROM TableHistory " + AnsiString("\n");  
int dev_id = 0;
if (RB_PartHistory->Checked&&!CB_DateTime->Checked&&!CB_Device->Checked)
{
  MessageDlg( MsgCriteriaDelete, mtInformation, TMsgDlgButtons() << mbCancel, 0);
  return;
}
if (CB_DateTime->Checked)
 FormDateTimeInterval(BDT, EDT);
   if(CB_Device->Checked)
     if (cmb_Device->ItemIndex>=0 )
     dev_id = cmb_Device->Items->Strings[cmb_Device->ItemIndex].ToIntDef(0);

 //Формирование строки запроса
   sqltxt =  sqltxt  + "WHERE UserId =" + IntToStr(UserId);
  if (RB_PartHistory->Checked)
   {
    //&#207;&#238; &#228;&#224;&#242;&#229;
    if(CB_DateTime->Checked)
       sqltxt += " AND (DateTimeEvent BETWEEN :DTEB AND :DTEE) ";
    //Если еще и устройство выбрано
    if(CB_Device->Checked)
       sqltxt += " AND DeviceId = " + IntToStr(dev_id);
   }
   //Ожидающий курсор на форм
  Cursor = crSQLWait;
 ADOConnectionDel->Connected = false;
 ADOConnectionDel->ConnectionString = ConnectionADO;
 ADOConnectionDel->Connected = true;
 ADODelHist->Connection = ADOConnectionDel;
   if (ADODelHist->Active)
  ADODelHist->Active = false;

  ADODelHist->SQL->Clear();
  ADODelHist->SQL->Add(sqltxt);
  try
  {

    if(CB_DateTime->Checked)
    {
      ADODelHist->Parameters->ParamByName(WideString("DTEB"))->Value = BDT;
      ADODelHist->Parameters->ParamByName(WideString("DTEE"))->Value = EDT;
    }
   if (!ADODelHist->Prepared)
       ADODelHist->Prepared = true;
  ADODelHist->ExecSQL() ;
 ADOConnectionDel->Connected = false;
  }
  catch(...)
  {
   ModalResult = mrCancel;
   return;
  }
 //Первая задержка, сразу после удаления
 Sleep(1000);
  ModalResult = mrOk;
}

Без первой и второй задержек не работает толком.


 
sniknik ©   (2004-05-05 11:17) [8]

> Дело в том, что на SELECT и DELETE действительно два разных ADOConnection
ну раз причина ясна то что сделать надо? правильно исправить. про модули данных в курсе?


 
Мунька   (2004-05-05 11:23) [9]

Конечно в курсе.. только что-то там тоже было не очень хорошее - в предыдущей программе, поэтому и отказалась от них..а вспомнила тогда вопрос есть 100 процентная гарантия, что TADOConnection не расконектиться сам по себе, то есть я ему дала
ADOConnectionDel->Connected = true, а он вдруг станет false?
И еще, если вдруг ADOConnectionDel->Connected == false, то что станет с открытыми активными TADOQuery (я имею ввиду те запросы, которые и держу открытыми, там где был какой-либо SELECT)?


 
Мунька   (2004-05-05 11:36) [10]

Такс проверяем... удаление и выборка на одном коннекте


 
SergP ©   (2004-05-05 13:16) [11]


> что TADOConnection не расконектиться сам по себе


А с чего это вдруг ему должно захотеться расконектиться самому по себе?


 
Мунька   (2004-05-05 13:24) [12]

С того же, с чего такие тормоза на разных коннектах. Сейчас пишу еще одну процедуру удаления из двух таблиц - сначала с подчиненной, затем с главной, вот и проверю, как себя все поведет на одном конекте. Кстати, вроде проблема уходит. Но.. вот что удивительно, без объекта TADOConnection, через строку коннекта - мрачно все (из опыта другой программы), как только в таблице 2 записи SELECT их не видит.


 
sniknik ©   (2004-05-05 13:33) [13]

все проблемы от недостатка знаний.
> Но.. вот что удивительно, без объекта TADOConnection, через строку коннекта - мрачно все
без конекта он не может, если ты не задаш явно, создастся автоматом на каждый обьект.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
1-1084878707
_test_
2004-05-18 15:11
2004.05.30
imagelist + timage


1-1084720501
Lammo
2004-05-16 19:15
2004.05.30
Использование PChar в dll


6-1081330846
Ozone
2004-04-07 13:40
2004.05.30
TIdTCPClient


4-1082210450
сщвук
2004-04-17 18:00
2004.05.30
Task bar


1-1084649582
Yong
2004-05-15 23:33
2004.05.30
Как изменить размер текста?