![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не открываются .dbf, пока не закрыта создавшая один из них [D7, MSSQL, dBase, FoxPro]
Циркуль © (2007-09-25 17:29:00)<subj> программа
Собсно, есть некий датасет, который надо выгрузить в формате DBase.
T := TTable.Create(nil);
try
T.TableName := AFileName;
T.TableType := ttDBase;
with TQuery.Create(nil) do
try
SQL.Text := 'create table "' + T.TableName + '" (' + описания_столбцов + ')';
ExecSQL;
finally
Free;
end;
T.Open;
ADataSet.First;
while not ADataSet.EOF do
begin
T.Append;
CopyFields(ADataSet, T);
T.Post;
ADataSet.Next;
end;
T.Close;
finally
T.Free;
end;
Все сохраняется, но созданный файл (да и ни один другой *.dbf) нельзя открыть (например DataBase Desctop'ом) пока не будет закрыта программа.
Выдает ошибку "cannot load driver".
Закрываем прогу - все *.dbf начинают без проблем открываться.
Может кто сталкивался с такой фигней ?
Anatoly Podgoretsky (2007-09-25 20:35:00) [1]В данной солянке могут оказаться драйвера из трех технологий
BDE/JET/ODBC
sniknik (2007-09-25 20:31:00) [2]> и следя
= не следя
обписался, смысл в общем в том что jet это как бы одно ядро сколько бы подключений не было (BDE тоже, но у него меньше одновременно открытых сессий ~8-12 до глюка), а ODBC для каждого подключения отдельную копию с подгрузкой драйверов делает и как следствие рушится (в этом случае с "исамными" подключениями) на втором...
Anatoly Podgoretsky (2007-09-25 20:31:00) [3]> Циркуль (25.09.2007 20:28:10) [10]
Возможно прямое, возможно это последствия этого.
Циркуль (2007-09-25 20:28:00) [4]
> Что за винегред из навигационных компонент и SQL
Вопрос имеет прямое отношение к проблеме или к "иделогии написания кода" ? Если первое, то, включив телепатор, нужно думать, что предлагается заменить использование TTable на выполнение нужного кол-ва "insert into ..."? Если второе - "все было написано до нас" :)
sniknik (2007-09-25 20:25:00) [5]> Выдает ошибку "cannot load driver".
> ...
> Может кто сталкивался с такой фигней ?
бывает когда пытаешься одновременно работать с BDE и Jet-ом + исам использующий BDE... и они пытаются работать через одни и теже драйвера, с одной и той же папкой/базой.
выход либо работать всегда через чтото одно, либо установить jet-у параметр "использовать свои замены" (BDE=2)
ну а с ODBC ситуация еще хуже, эта "пятая нога" сама в свою очередь использует jet для локальных баз через его исамы, да еще и следя за своими копиями, т.е. тут в к невозможности работать параллельно с BDE/Jet добавляется еще невозможность работы с самим собой (вторым коннектом через ODBC).
проверить можно сделав пару простых программ/форм в которых всего лиш открыть по таблице в разных директориях. т.е. например с такой строкой подключения в одной
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=dBASE Files;DBQ= D:\DB;DefaultDir= D:\DB;DriverId=533;FIL=dBase 5.0;MaxBufferSize=2048;PageTimeout=5;"
и с такой в другой
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=dBASE Files;DBQ= D:\DBF;DefaultDir= D:\DBF;DriverId=533;FIL=dBase 5.0;MaxBufferSize=2048;PageTimeout=5;"
на запуске второй должна появиться ошибка о проблеме загрузки драйверов.
или же у вас очень старый ODBC... (раньше он имел собственные драйвера а не "заглушки")
Anatoly Podgoretsky (2007-09-25 19:38:00) [6]Циркуль (25.09.07 17:29)
Что за винегред из навигационных компонент и SQL
Циркуль (2007-09-25 18:25:00) [7]не Exclusive, судя по отладчику...
> Johnmen © (25.09.07 17:37) [3]
> Надо использовать TDatabase. Явным образом....
добавил использование TDataBase, настроил алиас в BDE
DB := TdataBase.Create(nil);
try
DB.AliasName = 'ExportDBaseAlias';
DB.DataBaseName = 'ExportDBase';
T := TTable.Create(nil);
try
T.DataBaseName := DB.DataBaseName;
T.TableName := AFileName;
T.TableType := ttDBase;
with TQuery.Create(nil) do
try
DataBaseName := DB.DataBaseName;
SQL.Text := 'create table "' + T.TableName + '" (' + описания_столбцов + ')';
ExecSQL;
finally
Free;
end;
T.Open;
ADataSet.First;
while not ADataSet.EOF do
begin
T.Append;
CopyFields(ADataSet, T);
T.Post;
ADataSet.Next;
end;
T.Close;
finally
T.Free;
end;
finally
DB.Free
end;
не помогло :(
Desdechado (2007-09-25 17:48:00) [8]TTable.Exclusive to prevent other applications from accessing a Paradox or dBASE table while it is open in this application.
Германн (2007-09-25 17:48:00) [9]
> никаких упоминаний о режиме доступа ни в запросе, создающем
> таблицу, ни в настройках TTable не нашел...
>
TTable.Exclusive
Циркуль (2007-09-25 17:45:00) [10]
> В каком режиме открываешь - монопольно?
эээ.... никаких упоминаний о режиме доступа ни в запросе, создающем таблицу, ни в настройках TTable не нашел...
Johnmen (2007-09-25 17:37:00) [11]Надо использовать TDatabase. Явным образом....
Desdechado (2007-09-25 17:34:00) [12]> T.Open;
В каком режиме открываешь - монопольно?
Циркуль (2007-09-25 17:33:00) [13]"FoxPro" чекнул случайно, MSSQL - оттуда и выдергиваются данные (тоже через BDE), которые сохраняем в dbf.