![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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); //Здесь ОШИБКА!!!!
...