Прочитане на Access със Querty
13 отговора
315 прегледа
Прочитане на Access със Querty
Трябва да извеждам едни справки от база данни, написани с Access 2000. И разбира се искам всичко да направя със SQL заявки (за по-лесно). Та въпросът ми е: някой правил ли е нещо подобно, и как става точно. Всякакви идеи са добре дошли.
Re: Прочитане на Access със Querty
Ами става много лесно. Трябва да се използват ADO компонентите.
Значи слагаш си ADOQuery, задаваш му Connection String към DSN (който се създава предварително от Control Panel и сочи към Access базата ти от данни). След като си настроиш връзката ползваш AdoQuery.SQL.Text := "Заявката която ти трябва" (можеш да ползваш заявки генерирани и от самият Access), а после викаш ExecSQL, или Open методите на AdoQuery в зависимост от това дали заявката връща резултат.
Ако имаш още проблеми пиши.
AquilaX
____________
умният знае кога да говори, мъдрият знае кога да мълчи
Значи слагаш си ADOQuery, задаваш му Connection String към DSN (който се създава предварително от Control Panel и сочи към Access базата ти от данни). След като си настроиш връзката ползваш AdoQuery.SQL.Text := "Заявката която ти трябва" (можеш да ползваш заявки генерирани и от самият Access), а после викаш ExecSQL, или Open методите на AdoQuery в зависимост от това дали заявката връща резултат.
Ако имаш още проблеми пиши.
AquilaX
____________
умният знае кога да говори, мъдрият знае кога да мълчи
Re: Прочитане на Access със Querty
Това добре, обаче не искам да минавам през ODBC драйвера. Програмата ще работи с няколко бази данни от Access, разположени в различни директории, настройките на ODBC - то трябва да се правят ръчно (поне не знам как става от програмата). С една дума - ако може директно.
Re: Прочитане на Access със Querty
е ще ти трябват някакви Native драйвери за Access. Иначе DNS се създава и програмно макар да не е толкова лесно колкото би трябвало да е т.е. от Borland не са го направили. Може да използваш следното нещо :
const
ODBC_ADD_DSN = 1; // Add data source
ODBC_CONFIG_DSN = 2; // Configure (edit) data source
ODBC_REMOVE_DSN = 3; // Remove data source
ODBC_ADD_SYS_DSN = 4; // add a system DSN
ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
type
TSQLConfigDataSource = function( hwndParent: HWND;
fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ) : BOOL; stdcall;
function TfmUpdate.CreateMDBDSN(FileName, DSNName, Description:String):boolean;
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
srInfo : TSearchRec;
begin
Result := True;
strFile := FileName;
strHome := ExtractFilePath (FileName);
hLib := LoadLibrary( 'ODBCCP32' ); // load from default path
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
if( @pFn <> nil ) then
begin
// force (re-)create DSN
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN='+DSNName+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description='+Description+#0+#0,
[strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then Result := False;
// test/create MDB file associated with DSN
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
//strFile := '.\\TestData.MDB';
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN='+DSNName+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description='+Description+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then Result := False;
end;
FindClose( srInfo );
end;
(* MASSIVE SNIP *)
FreeLibrary( hLib );
end
else
begin
Result := False;
end;
end;
Успех!
AquilaX
P.S Сигурно може да използваш и OLE Automation ама мене нещо не ме кефи това а сигурно е и бавно.
____________
умният знае кога да говори, мъдрият знае кога да мълчи
const
ODBC_ADD_DSN = 1; // Add data source
ODBC_CONFIG_DSN = 2; // Configure (edit) data source
ODBC_REMOVE_DSN = 3; // Remove data source
ODBC_ADD_SYS_DSN = 4; // add a system DSN
ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
type
TSQLConfigDataSource = function( hwndParent: HWND;
fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ) : BOOL; stdcall;
function TfmUpdate.CreateMDBDSN(FileName, DSNName, Description:String):boolean;
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
srInfo : TSearchRec;
begin
Result := True;
strFile := FileName;
strHome := ExtractFilePath (FileName);
hLib := LoadLibrary( 'ODBCCP32' ); // load from default path
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
if( @pFn <> nil ) then
begin
// force (re-)create DSN
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN='+DSNName+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description='+Description+#0+#0,
[strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then Result := False;
// test/create MDB file associated with DSN
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
//strFile := '.\\TestData.MDB';
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN='+DSNName+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description='+Description+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then Result := False;
end;
FindClose( srInfo );
end;
(* MASSIVE SNIP *)
FreeLibrary( hLib );
end
else
begin
Result := False;
end;
end;
Успех!
AquilaX
P.S Сигурно може да използваш и OLE Automation ама мене нещо не ме кефи това а сигурно е и бавно.
____________
умният знае кога да говори, мъдрият знае кога да мълчи
Редактирано от AquilaX на
Re: Прочитане на Access със Querty
Hi,
По добрия варинт при ADO e да използваш Jet провайдер за директен достъп до Access, но за Access 2000 ще трябва да имаш и последните update-и от Borland. Но не очаквай голяма скорост и ще има проблеми при справки от таблици от различни бази.
Засега толкова, като имаш конкретни проблеми...
Миро.
По добрия варинт при ADO e да използваш Jet провайдер за директен достъп до Access, но за Access 2000 ще трябва да имаш и последните update-и от Borland. Но не очаквай голяма скорост и ще има проблеми при справки от таблици от различни бази.
Засега толкова, като имаш конкретни проблеми...
Миро.
Re: Прочитане на Access със Querty
Благодаря на всички които ми отговориха. Вече всичко е ок.
Re: Прочитане на Access със Querty
Hi,
За съжаление нищо няма да е ОК с ADO
!
Проблемите ти тепърва започват... но питай и може и да стане. Освен това може да следиш и newsgroup-ата на Borland за ADO - там има доста теми....
Миро.
За съжаление нищо няма да е ОК с ADO
Проблемите ти тепърва започват... но питай и може и да стане. Освен това може да следиш и newsgroup-ата на Borland за ADO - там има доста теми....
Миро.
Re: Прочитане на Access със Querty
Вярно е за проблемите с ADO аз не ги бях ползвал, но едно приятелче дето се мъчи с тях, ми разправяше какви гимнастики прави за да им избегне бъговете :)
Re: Прочитане на Access със Querty
Хммм...
Позната история
. Не ме питай аз какви гимнастики правя
.
Но сега правя една последна - зарязвам ADO и се прехвърлям на Interbase
.
Tnx,
Miro.
Позната история
Но сега правя една последна - зарязвам ADO и се прехвърлям на Interbase
Tnx,
Miro.
Re: Прочитане на Access със Querty
:)))) Не си мисли че там няма да има хватки... по малко са но не са болка за умиране ;) Аз си бачкам на Interbase от 2-3 год, и не ми правят впечатление :)
Re: Прочитане на Access със Querty
Hi,
Предполагам, че Interbase ще се държи добре при 5-6 потребителя, 20000-50000 записа?
Миро.
Предполагам, че Interbase ще се държи добре при 5-6 потребителя, 20000-50000 записа?
Миро.
Re: Прочитане на Access със Querty
Даже да ти кажа честно ме учуди Interbase ка се държи... в едното от заведенията което работи с ресторантьорската ми система, в мрежата са 6 компютъра - 4 каси и 1 за справки и 1 за въвеждане на покупки и кетеринг...
в момента базата е 120MB, най тежката част са Real Time покупките и там има до момента към 300 000 - 400 000 записа...
Начи справките по часове, по заведения, по артикули, хронологията продажби по часове и т.н.. има към 30 вида справки, най тежките се правят за около 5-6 сек.!!!!
А на касите които набиват там информация нон стоп, има забавяне само 1-2 сек...
Но сега съм решил да прехвърля цялата система на SQL Server, да видя и там как ще се държи :)))
в момента базата е 120MB, най тежката част са Real Time покупките и там има до момента към 300 000 - 400 000 записа...
Начи справките по часове, по заведения, по артикули, хронологията продажби по часове и т.н.. има към 30 вида справки, най тежките се правят за около 5-6 сек.!!!!
А на касите които набиват там информация нон стоп, има забавяне само 1-2 сек...
Но сега съм решил да прехвърля цялата система на SQL Server, да видя и там как ще се държи :)))
Re: Прочитане на Access със Querty
Hi,
И как ще правиш достъпа до MS SQL Server? ADO?
Миро.
И как ще правиш достъпа до MS SQL Server? ADO?
Миро.