Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отследить, занят ли файл другим приложением / 7 сообщений из 7, страница 1 из 1
29.05.2001, 10:09
    #32006508
Надежда
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
У меня такая проблема:
средствами SQL-сервера нужно делать выборку в .dbf файлах
я пытаюсь это реализовать используя Linked Server
но бывают ситуации, когда .dbf файл эксклюзивно занят другим пользователем, другим приложением - Как в таком случае я могу отследить это?
...
Рейтинг: 0 / 0
29.05.2001, 15:55
    #32006539
elint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
на сайте http://www.gvu.newmail.ru/ Уфимцев Глеб выложил пример "Создание Extended Stored Procedure для MSSQL средствами Delphi". на его основе, используя функцию _lopen можно проверять состояние любого файла.

XPSMPDLL.DPR:
---------------------------------
library XPSMPDLL;

uses
SysUtils,
Classes,
Windows;

{Заголовки API, которые нам понадобятся в примере}

function srv_paraminfo(srv: pointer; num: Integer; var typ, maxlen, len: Integer;
data: pointer; var isnull: boolean): Integer;
cdecl; external 'Opends60.dll' name 'srv_paraminfo';

function srv_sendmsg(srv: pointer; msgtype: Integer; msgnum: Integer;
severity_class: byte; state: byte; rpcname: pchar; rpcnamelen: Integer;
linenum: word; message_str: pchar; msglen: Integer): Integer;
cdecl; external 'Opends60.dll' name 'srv_sendmsg';


{возвращает первый параметр - имя файла (с полным путем)}

function GetFileName(srv: pointer): string;
var Typ, MaxLen, Len: Integer; IsNull: boolean; Data: pointer;
begin
GetMem(Data, 255);
try
srv_paraminfo(srv, 1, Typ, MaxLen, Len, Data, IsNull);
SetLength(Result, Len);
MoveMemory(pointer(Result), Data, Len);
finally
FreeMem(Data);
end;
end;

{Собственно, сама расширенная хранимая процедура}

function xpMain1(srv: pointer): Integer; cdecl;
var
FileName: string;
AFile: HFILE;
begin
FileName := GetFileName(srv);
AFile := _lopen(PChar(FileName), OF_READ or OF_SHARE_EXCLUSIVE);
if AFile <> HFILE_ERROR then
begin
_lclose(AFile);
srv_sendmsg(srv, 1, 0, 0, 0, nil, 0, 0, 'Файл не занят', -1);
Result := 1; {Все OK, т.е. SUCCEED}
end
else
begin
srv_sendmsg(srv, 2, 0, 16, 1, nil, 0, 0, 'Файл эксклюзивно занят другим пользователем', -1);
Result := 0; {Дело FAIL, т.е. хреново}
end;
end;

exports xpMain1 name 'xpSample';

begin
end.


---------------------------


set nocount on
DECLARE @Result int
DECLARE @Catalog varchar(12

CREATE TABLE #tTable (CATALOG_NAME sysname, DESCRIPTION nvarchar(255))

insert into #tTable exec sp_catalogs 'DBDEMOS'
select TOP 1 @Catalog = CATALOG_NAME from #tTable

Set @Catalog = @Catalog + '©lients.dbf'
EXECUTE @Result = master..xpSample @Catalog

--@Result = 1 - OK
--@Result = 0 - Fail

DROP table #tTable
...
Рейтинг: 0 / 0
29.05.2001, 16:03
    #32006541
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
А у DTS-паккейджов джобы могут завязываться друг на друга. Причем, можно сделать так, что Job2 будет выполняться только при успешном выполнении Job1 (в котором можешь попытаться открыть DBF-файл). И никаких изворотов через расширенные процедуры. Или тебе нужно в онлайне с клиента на все это завязаться?
...
Рейтинг: 0 / 0
30.05.2001, 07:37
    #32006589
Надежда
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
Да, мне действительно нужно это реализовать в онлайне и с использованием SP
...
Рейтинг: 0 / 0
30.05.2001, 08:03
    #32006594
Как отследить, занят ли файл другим приложением
Можно проще поступить, чтобы долго не мудрить.
Достаточно попытаться переименовать файл через xp_cmdshell. Если удалось, значит, не залочен.
...
Рейтинг: 0 / 0
30.05.2001, 10:41
    #32006624
Надежда
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
Можно, конечно, но .dbf-ка всего то 17 метров.......
...
Рейтинг: 0 / 0
30.05.2001, 12:09
    #32006637
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить, занят ли файл другим приложением
А разве время переименования зависит от размера файла?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отследить, занят ли файл другим приложением / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]