Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление записей из dbf [D6]


wild_arg ©   (2004-04-07 17:12:00) 

Необходимо через ADO удалить все записи из некоего файла, типа "таблица.dbf".
Пробовали через ADOQuery, типа "Delete from Таблица.dbf"- он в dbf-нике помечает все записи на удаление.
ADOTable.DeleteRecords- тоже ничего не дал, вообще выкинул какую-то ошибку

Можно как-то реально удалить все записи?


Anatoly Podgoretsky   (2004-04-08 10:09:00) [1]

Так ты не удалить хочешь, а упаковать таблицы, тогда кажется только VFP драйвер может.


AndrewK   (2004-04-08 09:58:00) [2]

Ну или переформулирую вопрос:  Как упаковать таблицу dbf средствами Delphi через ADO?


AndrewK   (2004-04-08 09:21:00) [3]

Вот такая процедура выдает сообщение Operation is not allowed in this context


procedure TfrmDlgExportCompanyToLotus.ExportCompanyList;
var I : Integer;
   vODBC : TADOTable;
   vStep, vCurPos : Real;
begin
 dbConn.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN='+Trim(edtODBC.Text)+';DriverId=533;FIL=dBase 5.0;MaxBufferSize=2048;PageTimeout=5;"';
 dbConn.Connected := True;

 Gauge.MaxValue := 100;
 Gauge.Progress := 0;
 vCurPos        := 0;

 with DM.spOpen('_exp_spCompanyListToLotus', []) do
 try
   btnOK.Enabled      := False;
   btnCancel.Enabled  := False;
   Screen.Cursor      := crHourGlass;
   vStep              := 100 / RecordCount;
   vODBC              := TADOTable.Create(nil);
   vODBC.Connection   := dbConn;
   vODBC.TableName    := Trim(edtTableName.Text);
   vODBC.Open;
   vODBC.DeleteRecords;
   First;
   for I := 1 to RecordCount do begin
     vODBC.Insert;
     vODBC.FieldByName('M_ID').AsInteger   := FieldByName('M_ID').AsInteger;
     vODBC.FieldByName('S_ID').AsInteger   := FieldByName('S_ID').AsInteger;
     vODBC.FieldByName('M_SNAME').AsString := FieldByName('M_SNAME').AsString;
     vODBC.FieldByName('S_SNAME').AsString := FieldByName('S_SNAME').AsString;
     vODBC.FieldByName('S_FNAME').AsString := FieldByName('S_FNAME').AsString;
     vODBC.FieldByName('TZ').AsString      := FieldByName('TZ').AsString;
     vODBC.Post;
     vCurPos := vCurPos + vStep;
     Gauge.Progress := Round(vCurPos);
     Application.ProcessMessages;
     Next;
   end;
 finally
   vODBC.Close;
   vODBC.Free;
   Free;
   dbConn.Connected  := False;
   Gauge.Progress    := 0;
   vCurPos           := 0;
   Screen.Cursor     := crDefault;
   btnOK.Enabled     := True;
   btnCancel.Enabled := True;
 end;

end;


А вот такая процедура ошибок не выдает, но и не удаляет (только помечает все записи как удаленные)

procedure TfrmDlgExportCompanyToLotus.ExportCompanyList;
var I : Integer;
   vODBC : TADOTable;
   vStep, vCurPos : Real;
begin
 dbConn.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN='+Trim(edtODBC.Text)+';DriverId=533;FIL=dBase 5.0;MaxBufferSize=2048;PageTimeout=5;"';
 dbConn.Connected := True;

 Gauge.MaxValue := 100;
 Gauge.Progress := 0;
 vCurPos        := 0;

 with TADOQuery.Create(nil) do
 try
   Connection := dbConn;
   SQL.Text := 'Delete * from '+Trim(edtTableName.Text);
   ExecSQL;
 finally
   Free;
 end;

 with DM.spOpen('_exp_spCompanyListToLotus', []) do
 try
   btnOK.Enabled      := False;
   btnCancel.Enabled  := False;
   Screen.Cursor      := crHourGlass;
   vStep              := 100 / RecordCount;
   vODBC              := TADOTable.Create(nil);
   vODBC.Connection   := dbConn;
   vODBC.TableName    := Trim(edtTableName.Text);
   vODBC.Open;
   First;
   for I := 1 to RecordCount do begin
     vODBC.Insert;
     vODBC.FieldByName('M_ID').AsInteger   := FieldByName('M_ID').AsInteger;
     vODBC.FieldByName('S_ID').AsInteger   := FieldByName('S_ID').AsInteger;
     vODBC.FieldByName('M_SNAME').AsString := FieldByName('M_SNAME').AsString;
     vODBC.FieldByName('S_SNAME').AsString := FieldByName('S_SNAME').AsString;
     vODBC.FieldByName('S_FNAME').AsString := FieldByName('S_FNAME').AsString;
     vODBC.FieldByName('TZ').AsString      := FieldByName('TZ').AsString;
     vODBC.Post;
     vCurPos := vCurPos + vStep;
     Gauge.Progress := Round(vCurPos);
     Application.ProcessMessages;
     Next;
   end;
 finally
   vODBC.Close;
   vODBC.Free;
   Free;
   dbConn.Connected  := False;
   Gauge.Progress    := 0;
   vCurPos           := 0;
   Screen.Cursor     := crDefault;
   btnOK.Enabled     := True;
   btnCancel.Enabled := True;
 end;

end;

Вот и вопрос: как очистить файл *.dbf в версии DBase IV поностью?


Anatoly Podgoretsky   (2004-04-07 19:13:00) [4]

Семен Сорокин ©   (07.04.04 18:17) [11]
А зачем так делать, когда Delete From Table прекрасно работает?
А ты ему на порядок более сложную задачу подсовываешь.


Семен Сорокин   (2004-04-07 18:17:00) [5]

Anatoly Podgoretsky ©   (07.04.04 17:56) [10]
хватит над человеком прикалываться :))
wild_arg ©   (07.04.04 17:12)
тебе проще сделать SELECT INTO в новую таблицу, а старую удалить.


Anatoly Podgoretsky   (2004-04-07 17:56:00) [6]

Это вся программа?
Насчет ошибок, значит ты обманывал, когда говорил, что выдает какую то ошибку, а сейчас оказывается не выдает.
Тут еще и не иввестное ADOConnection1


wild_arg   (2004-04-07 17:52:00) [7]

2Anatoly Podgoretsky
Слушай, чё за необоснованные наезды? Чего там может быть неправильного?

with TADOQuery.Create(Self) do begin
 Connection := ADOConnection1;
 SQL.Text   := 'delete from Таблица.dbf';
 Execute;
 Free;
end;


Не факт, что здесь приведено правильно - это я здесь написал - но принцип тот же. О правильности кода сужу потому, что он записи в таблице обрабатывает, но только лишь помечает на удаление. Ведь если бы код был некорректен - то он бы ничего не делал, либо вызывал ошибки.


Anatoly Podgoretsky   (2004-04-07 17:43:00) [8]

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


wild_arg   (2004-04-07 17:41:00) [9]

2Anatoly Podgoretsky
см. выше :) самый первый пост - такое уже пробовали


Anatoly Podgoretsky   (2004-04-07 17:38:00) [10]

wild_arg ©   (07.04.04 17:36) [5]
Можно - Delete from Table.dbf


wild_arg   (2004-04-07 17:36:00) [11]

2Семен Сорокин
есть только ADO и ОDBC :) с этим инструментарием можно по...удалять все записи. Если можно, то приведите отрывок кода.


Семен Сорокин   (2004-04-07 17:29:00) [12]

используй драйвер microsoft FoxPro VFP Driver (*.dbf) там есть метод Pack или пересозданием таблицы.


Семен Сорокин   (2004-04-07 17:26:00) [13]

Так паковать же надо dbf после удаления.


wild_arg   (2004-04-07 17:25:00) [14]

Выкинутая ошибка: Operation is not allowed in this context


Anatoly Podgoretsky   (2004-04-07 17:19:00) [15]

А ты эту ошибку тоже зря выкинул.


Наверх

Титульная страница Поиск, карта сайта Написать письмо