Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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


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


 
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 ©, при использовании предложенного тобой варианта происходит все то же самое, но сообщение ошибки теперь:"Открытие базы данных "" невозможно. Вероятно, это не база данных приложения пользователя или ее файл поврежден"


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

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


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

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

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


 
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);

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


 
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) к примеру тоже самое действие окажет)
хотя как его там на самом деле не знаю, не пользовался.


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

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

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


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

Да... Со 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: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;");
....


 
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:35) [9]

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


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

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


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

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



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

Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.042 c
7-1079838935
DuchmanSoft
2004-03-21 06:15
2004.05.09
Неубиваемый процесс


4-1079444425
BillyJeans
2004-03-16 16:40
2004.05.09
Окно без title bar...


3-1081800911
Mirror
2004-04-13 00:15
2004.05.09
EHLib


4-1079308855
kothor
2004-03-15 03:00
2004.05.09
Есть вопрос по меню.


1-1082555935
ser_ega
2004-04-21 17:58
2004.05.09
Stringgrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский