Avatar billede vuf-vuf Nybegynder
14. september 2005 - 13:58 Der 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?
Avatar billede silvershadow Nybegynder
14. september 2005 - 14:08 #1
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.
Avatar billede tolderlund Nybegynder
14. september 2005 - 14:39 #2
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.
Avatar billede kroning Nybegynder
14. september 2005 - 20:13 #3
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.
Avatar billede hrc Mester
14. september 2005 - 21:16 #4
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å.
Avatar billede hrc Mester
14. september 2005 - 21:25 #5
Her et udsnit af noget gammelt gammelt kode (Bemærk, at cbAlias, cbTable, cbIndex alle er TComboBoxe med en metode koblet på OnChange eventen)

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Session.GetAliasNames(cbAlias.Items);
end;

procedure TfrmMain.cbAliasChange(Sender: TObject);

  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;
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester