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

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

ADO, Access 2000: "Нераспознаваемый формат базы данных"... [D7]


asafr ©   (2004-04-12 15:06:00) 

На компьютере установлен W2K, Access 2000. В программе пишу код конвертации файла dBase IV в Access (TableName.dbf->таблица TableName в файле Test.mdb). В упрощенном варианте это выглядит так:
var
  ConvertStr:String;
  AccessApp :TAccessApplication;
  DBBase    :TADOConnection;
begin

 If FileExists('C:\Work\Test.mdb')
    then DeleteFile(PChar('C:\Work\Test.mdb'));
 
 If Assigned(AccessApp)
    then FreeAndNil(AccessApp);

 AccessApp:=TAccessApplication.Create(self);

 try //Cоздаю файл Access
    AccessApp.NewCurrentDatabase('C:\Work\Test.mdb');
 except
    .........
    FreeAndNil(AccessApp);
    .........
    Exit
 end;

 AccessApp.Disconnect;
 FreeAndNil(AccessApp);

 If Assigned(DBBase)
    then FreeAndNil(DBBase);

 DBBase:=TADOConnection.Create(self);
 DBBase.LoginPrompt:=False;      DBBase.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Bases\;Mode=Read;Extended Properties=dBase IV;Persist Security Info=False;Jet OLEDB:Engine Type=0';

 ConvertStr:='Select * INTO  [TableName]IN "C:\Work\Test.mdb" "MS Access 8.0;" FROM TableName.dbf';

   try
    DBBase.Execute(ConvertStr);   //Здесь ОШИБКА!!!!
   except
    .......
    DBBase.Connected:=False;
    Exit
 end;  

 FreeAndNil(DBBase);
end;

Так вот. При запуске программы из Delphi по нажатию F9 все работает отлично без сбоев. Только стоит попробовать запускать сам exe-файл программы, то ОЧЕНЬ ЧАСТО вылетает сообщение :"Нераспознаваемый формат базы данных C:\Work\Test.mdb". Если кто сталкивался с подобной проблеммой - подскажите как быть?
Заранее всем спасибо...


asafr   (2004-04-13 11:41:00) [1]

Скорость обработки намного выше....


asafr   (2004-04-13 11:35:00) [2]

Спасибо. Этот код, действительно, эффективнее. Я применил его с небольшими изменениями под мою задачу. Спасибо еще раз...


sniknik   (2004-04-13 10:43:00) [3]

;о) вот и польза от повторных просмотров при показе кода
нашол небольшое "упушение"
так будет лутше
function TDMod.CreateMDBBase(const BaseName: string): boolean;
....
//BaseName:= GetMdbName(BaseName);
AdoEngine:= CreateOleObject('ADOX.Catalog');
AdoEngine.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+GetMdbName(BaseName)+';Jet OLEDB:Engine Type=5;');
....


sniknik   (2004-04-13 10:39:00) [4]

ну раз этим прав то и с остальным надеюсь тоже ;о)). (хотя это все домыслы, ведь не пользовался же)
у тебе сервер access используется только для создания базы и все?  

замени, единственная процедура и сам access не нужен, и ожидание тоже.
(код с рабочей программы, DoIfError просто функция, выдаетт сообшение ведет лог, замени на что угодно.

function TDMod.CreateMDBBase(BaseName: string): boolean;
var AdoEngine: Variant;

 function GetMdbName(const sMdbName: string): string;
 begin
   result:= Trim(sMdbName);
   if UpperCase(Copy(result, Length(result)-3, 4)) <> '.MDB' then result:= result + '.MDB';
   if Pos(':\', result) = 0 then result:= GetCurrentDir+'\'+result;
 end;

begin
 result:= false;
 if Length(BaseName) = 0 then begin
   DoIfError('Не определено имя базы');
   exit;
 end;
 try
   try
     BaseName:= GetMdbName(BaseName);
     AdoEngine:= CreateOleObject('ADOX.Catalog');
     AdoEngine.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName+';Jet OLEDB:Engine Type=5;');
     AdoEngine.ActiveConnection.Close;
     result:= true;
   except
     on E: Exception do DoIfError(E.Message);
   end;
 finally
   AdoEngine:= Null;
 end;
end;


asafr   (2004-04-13 09:43:00) [5]

Да... Со sleep(1000) ты прав... Тот же эффект: все отрабатывает...


sniknik   (2004-04-12 18:06:00) [6]

> Для создания использую ADO. AccessApplication с закладки Servers. Но самое интересное: в моем варианте кода добавил:
а, сервер, стараюсь не пользоватся, проверь, без установленного access работать не будет.
если не работает и это неустраивает, переделай, это несложно.

> И теперь, вроде бы, пока ошибок не наблюдается. Надеюсь, что все исправил, только не совсем пойму - почему все исправилось?
возможно просто потому что ты дал ему немного больше времени на сброс кеша. (ну функция sleep(1000) к примеру тоже самое действие окажет)
хотя как его там на самом деле не знаю, не пользовался.


asafr   (2004-04-12 17:54:00) [7]

Для создания использую ADO. AccessApplication с закладки Servers. Но самое интересное: в моем варианте кода добавил:
AccessApp.Disconnect;
AccessApp.hWndAccessApp;  //Добавленная мной функция. Существует в TADOConnection
FreeAndNil(AccessApp);

И теперь, вроде бы, пока ошибок не наблюдается. Надеюсь, что все исправил, только не совсем пойму - почему все исправилось?


sniknik   (2004-04-12 17:33:00) [8]

ну чтож, хоть немного более понятно.

вот это TAccessApplication что? твой? и конкретно код в NewCurrentDatabase?
если для создания используется DAO можеш смело выкидывать этот код в помойку, несовместимость у него с Jet. (можеш на мелкософте поискать описание)


asafr   (2004-04-12 17:08:00) [9]

Хе!!!
sniknik ©, при использовании предложенного тобой варианта происходит все то же самое, но сообщение ошибки теперь:"Открытие базы данных '' невозможно. Вероятно, это не база данных приложения пользователя или ее файл поврежден"


sniknik   (2004-04-12 16:19:00) [10]

не знаю поможет ли нет, но сделай по другому (я бы так сделал)  

...
DBBase:=TADOConnection.Create(self);
DBBase.LoginPrompt:=False;
DBBase.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\Test.mdb;Persist Security Info=False';

ConvertStr:='Select * INTO TableName FROM TableName IN "C:\Bases\" "dBase IV;"';

try
 DBBase.Execute(ConvertStr);   //Здесь ОШИБКА!!!!
...


Наверх

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