Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
1-1084884672
DimonNew
2004-05-18 16:51
2004.05.30
TreeView


3-1083734716
Komar
2004-05-05 09:25
2004.05.30
Как работать с базами MySQL расположенные на другом компьютере?


9-1074453881
Jenea
2004-01-18 22:24
2004.05.30
Игра гонка. как зделать сталкновение


3-1084335200
Selax__
2004-05-12 08:13
2004.05.30
Не может найти gtintf.dll


1-1084436594
Inner
2004-05-13 12:23
2004.05.30
Срочно TTreeView подскажите!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский