![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу удалить DBF [D5, MSSQL, dBase, FoxPro]
blackraven © (2006-08-31 14:36:00)Доброе время суток, коллеги. Нужно провернуть некоторые операции с DBF и удалить его. С операциями все нормально, а вот с удалением проблемы. Вот код, который просто бегает по DBF-файлу, а затем удаляет его. Но удаления не происходит. GetLastError возвращает 32-ую ошибку. Для соединения с DBF-ником использую ADODB_TLB.pas, т.е. ADO.
procedure TfrmMain.Button1Click(Sender: TObject);
var cnn:connection;rs:recordset;
begin
cnn:=CoConnection.Create;
rs:=CoRecordset.Create;
cnn.ConnectionString:= 'driver=Microsoft Visual FoxPro Driver;Exclusive=No;SourceType=DBF;SourceDB=d:\mps\out';
cnn.Open('','','',-1);
rs.Open('select * from o2006083184986.dbf',cnn, adOpenStatic, adLockReadOnly,adCmdText );
rs.MoveFirst;
while not rs.EOF do
begin
rs.MoveNext;
end;
rs.Close;
cnn.Close;
deletefile(Pchar('d:\mps\out\o2006083184986.dbf'));
rs:=nil;
cnn:=nil;
end;
Файл не ReadOnly. Удалять пробовал всеми известными мне способами (ShFileOperation, MoveFileEx).
ANB (2006-08-31 16:07:00) [1]
> 2Reindeer Moss Eater пробовал и так не получилось.
Тогда это та самая ошибка. И номер наверняка теперь - "нет доступа".
sniknik (2006-08-31 15:59:00) [2]> Думал Delphi глючат, но нет.
нет, это "фича" фоксового провайдера, аттавизм от старых времен когда таблици открывались в своих областях и можно было переключатся между ними. закрытие курсора не закрывает область, а закрытие коннекта не освобождает обьекты сразу на случай если еще понадобятся (общий принцип COM)
> Я вот думаю не в ConnectionString у меня дело?
в том числе, выше говорил, что используя OLEDB провайдера можно обойти, у ODBC такой возможности просто нет (или не нашол).
blackraven (2006-08-31 15:45:00) [3]2Reindeer Moss Eaterпробовал и так не получилось.
Кстати для форума.я данный код пробовал на 2-х языках на delphi и VB6. результаты одинаковые. Думал Delphi глючат, но нет. Я вот думаю не в ConnectionString у меня дело?
blackraven (2006-08-31 15:43:00) [4]sniknikТак с полным путем получилось. Спасибо большое - это вариант.
Reindeer Moss Eater (2006-08-31 15:43:00) [5]А так?
rs:=nil;
cnn:=nil;
deletefile(Pchar('d:\mps\out\o2006083184986.dbf'));
blackraven (2006-08-31 15:40:00) [6]2ANBК сожалению мне данный вариант не подойдет.
sniknik (2006-08-31 15:39:00) [7]> - говорит таблица не существует.
значит не существует/не находится (хотя и странно в свете вышеприведенного "select * from o2006083184986.dbf")... попробуй задать с полным путем.
Reindeer Moss Eater (2006-08-31 15:39:00) [8]Исправить что? Неудаляемость незакрытых файлов?
blackraven (2006-08-31 15:36:00) [9]Я спрашиваю не почему не удаляется, а как можно исправить, ведь все что я открывал я закрыл, как видно из кода.
Reindeer Moss Eater (2006-08-31 15:30:00) [10]Ну и чего тогда спрашиваешь о том почему не удаляется?
32L ERROR_SHARING_VIOLATION
blackraven (2006-08-31 15:28:00) [11]2Reindeer Moss EaterErr=32, я в самом первом сообщении писал. Толку то, что я номер ошибки знаю.
blackraven (2006-08-31 15:25:00) [12]sniknik ©Пробовал так
cnn.Execute('drop table o2006083184986.dbf',rc,adCmdText) ;- говорит таблица не существует.
2ANB32-ошибка I/O это насколько я разобрал - файл не существует. Хотя он существует!!!
Reindeer Moss Eater (2006-08-31 15:20:00) [13]Reindeer Moss Eater Не понял?
if not deletefile(Pchar('d:\mps\out\o2006083184986.dbf')) then
Err := GetLastrError;
ANB (2006-08-31 15:18:00) [14]На некоторых версиях винды (закономерности не выявил) файл таблицы остается заблокированным за процессом даже если коннект закрыт и фрикнут. Помогает выйти и зайти в программу.
blackraven (2006-08-31 15:17:00) [15]Reindeer Moss EaterНе понял?
sniknikСпасибо за идею сейчас попробую.
sniknik (2006-08-31 14:54:00) [16]> Файл не ReadOnly. Удалять пробовал всеми известными мне способами (ShFileOperation, MoveFileEx).
ADOCommand.CommandText:= 'DROP TABLE o2006083184986.dbf';
ADOCommand.Execute;
???
+
если провайдер OLEDB (не ODBC) то можно вместо select использовать use.
Reindeer Moss Eater (2006-08-31 14:47:00) [17]GetLastError