14. september 2005 - 13:58Der er
4 kommentarer og 1 løsning
skift af databaser
Hej
Jeg er rimeligt ny til Delphi-programmering og er stødt på lidt problemer omkring åbning af databaser. Jeg har et program hvor det er opsat forskellige konti. Hver konti svarer til et bibliotek med en række paradox-databaser. Når en bruger går ind i programmet skal der være adgang til de paradox-databaser der svarer til den enkelte bruger. Ved login gemmes placeringen af brugerens bibliotek i en ini-fil. Problemet er at jeg skal lave nogle små vinduer som giver adgang til brugerspecifikke data. Normalt fungerer dataadgangen via opsætning i BDE-32. Jeg har derfor prøvet at opsætte en gruppe i BDE-32 som peger på et standardbibliotek svarende til administratorens bibliotek. I Delphiprogrammet har jeg valgt denne gruppe har jeg valgt denne gruppe under databasename i en ttable-komponent og valgt en specifik database. Dertil har jeg koblet en datasource-komponent. Dette gør at jeg får adgang til dataene for administratoren. Men hvordan får jeg gjort dette brugerstyret så jeg får adgang til den enkelte brugers data? Er der en måde hvorpå jeg kan skifte over til den brugerspecifikke database? Jeg kan jo læse den brugerspecifikke databases placering i ini-filen. Men hvordan bruger jeg denne information til at skifte over til den rigtige database?
Fra ini-filen extrakter du xxx.db navnet det angiver du som DataBaseNavn i din datasource komponent. Start med ikke noget navn, og navngiv først når du får brug for navnet.
Til det behøver du ikke at lave nogen opsætning i BDE. Læs bibliotek/filnavn fra ini-fil (afhængig af bruger). I TTable Databasename angiver du 'C:\bla\bla' og i TableName angives 'xxx.db'. Så kan du åbne TTable.
Hvis du har mange DB´er ville det måske være lettere at knytte et Alias til dine tabeller, så skal du kun ændre på et alias når der skiftes database. Jeg kan komme med noget kode hvis du tror det er noget du kan bruge.
Du bruger ordet databaser forkert. Databasen er det overordnede navn for en bunke af tabeller (i paradox *.db filerne). Hver bruger der logger ind har altså hver sin tabel (sikke dog en skod måde at lave det på).
Hvis du vil skifte mellem brugernes tabeller, så kan du bruge TSession komponenten. Den indeholder oplysninger om de alias'er der er defineret på pc'en. Har man valgt et, så finder den listen af tabeller som du så kan fodre din TTable med.
Hvis du ikke har lavet alias'er i BDEADMIN så må du ud i kataloget og lave en søgning på tabellerne; noget med findfirst, findnext og findclose.
Men som sagt - umiddelbart en helt forkert måde at lave det på.
procedure GetTables(aAlias : string; aList : TStrings); begin Session.GetTableNames(aAlias,'*.db',False,False,aList); end;
begin with TableDB do begin if Active then Close; // Don't open table cos' no table is yet selected
try DataBaseName := cbAlias.Text; TableName := ''; cbTable.Items.Clear; cbTable.ItemIndex := -1; GetTables(DataBaseName,cbTable.Items); except on E: Exception do begin MessageDlg(e.message,mtError,[mbOk],0); cbAlias.ItemIndex := -1; cbTable.ItemIndex := -1; cbIndex.ItemIndex := -1; end; end; // except end; // with end;
procedure TfrmMain.cbTableChange(Sender: TObject); var i : integer; begin with TableDB do begin if Active then Close; fInitialize := true; try IndexName := ''; TableName := cbTable.Text; finally cbIndex.Clear; cbIndex.Hint := ''; Open; TableDB.IndexDefs.Update; for i := 0 to TableDB.IndexDefs.Count - 1 do cbIndex.Items.Add(TableDB.IndexDefs[i].Name); fInitialize := false; ShowRecCount; end; // try end; { with } end;
procedure TfrmMain.cbIndexChange(Sender: TObject); var i : integer; bFound : boolean; begin with TableDB do begin if Active then Close; fInitialize := true; try IndexName := cbIndex.Text; cbIndex.Hint := ''; i := -1; bFound := false; while (i < IndexDefs.Count - 1) and not bFound do begin inc(i); bFound := (IndexDefs[i].Name = cbIndex.Text); end; // while if bFound then cbIndex.Hint := IndexDefs[i].FieldExpression; finally Open; fInitialize := false; ShowRecCount; end; // try end; // with end;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.