Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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

 
asafr   (2004-04-12 15:06) [0]

На компьютере установлен 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". Если кто сталкивался с подобной проблеммой - подскажите как быть?
Заранее всем спасибо...


 
sniknik ©   (2004-04-12 16:19) [1]

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

...
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);   //Здесь ОШИБКА!!!!
...


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

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


 
sniknik ©   (2004-04-12 17:33) [3]

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

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


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

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

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


 
sniknik ©   (2004-04-12 18:06) [5]

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

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


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

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


 
sniknik ©   (2004-04-13 10:39) [7]

ну раз этим прав то и с остальным надеюсь тоже ;о)). (хотя это все домыслы, ведь не пользовался же)
у тебе сервер 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;


 
sniknik ©   (2004-04-13 10:43) [8]

;о) вот и польза от повторных просмотров при показе кода
нашол небольшое "упушение"
так будет лутше
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;");
....


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.708 c
8-1076409176
_none_
2004-02-10 13:32
2004.04.11
GDI+ и win2003server


11-1068215299
SPeller
2003-11-07 17:28
2004.04.11
Глюк с формой


14-1079085510
Cobalt
2004-03-12 12:58
2004.04.11
Проблема с DrWeb - может кто сталкивался с таким?


11-1067182629
Revolter
2003-10-26 18:37
2004.04.11
как сделать хинт в роли оповещающих сообщений?


3-1079326499
Janbolat
2004-03-15 07:54
2004.04.11
Про installshieldexspress