Форум: "Базы";
Текущий архив: 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; //Добавленная мной функция. Существует в TADOConnectionFreeAndNil(AccessApp);
И теперь, вроде бы, пока ошибок не наблюдается. Надеюсь, что все исправил, только не совсем пойму - почему все исправилось?
← →
asafr (2004-04-12 17:54) [4]Для создания использую ADO. AccessApplication с закладки Servers. Но самое интересное: в моем варианте кода добавил:
AccessApp.Disconnect;
AccessApp.hWndAccessApp; //Добавленная мной функция. Существует в TADOConnectionFreeAndNil(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