Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wechsel zwischen Datenbanken nicht möglich? (https://www.delphipraxis.net/155274-wechsel-zwischen-datenbanken-nicht-moeglich.html)

slemke76 15. Okt 2010 19:37

Datenbank: Sybase • Version: 9.0 • Zugriff über: ADO

Wechsel zwischen Datenbanken nicht möglich?
 
Hallo zusammen,

ich habe ein etwas merkwürdiges Problem:

erstmal den Code:

Code:
const constConnStr='Provider=ASAProv.90;Eng=.......';

function TLXComm.getUmsatz(start: TDate; Ende: TDate):boolean;
var ConnStr: string;
    ADOConnection: TADOConnection;
    ADOQuery: TADOQuery;
begin
  ConnStr:=Format(constConnStr, [ FPassword,
                                  getDatabasePath()+'\'+FMandant+'\Database.db'
                                    ] );
  ADOConnection:=TADOConnection.Create(nil);
  ADOQuery:=TADOQuery.Create(nil);
  ADOConnection.ConnectionString:=ConnStr;
  ADOConnection.KeepConnection:=true;
  ADOConnection.LoginPrompt := False;
  AdoQuery.Connection:=ADOConnection;
  AdoQuery.CursorLocation:=clUseServer;
  AdoQuery.CursorType:=ctStatic;
  AdoQuery.ExecuteOptions := [];
  try
    AdoConnection.Open;
  except
    exit;
  end;

  AdoQuery.SQL.Clear;
  AdoQuery.SQL.Add('SELECT * FROM sample');
  AdoQuery.Open;

  ShowMessage(AdoQuery.FieldByName('id').Asstring);

  AdoQuery.Close;
  AdoQuery.Connection:=nil;
  AdoQuery.Free;
  AdoConnection.Connected:=false;
  AdoConnection.Close;
  AdoConnection.Free;
end;
Die Datenbank.db gibt es mehrfach, eine je Mandant. Wenn ich die Abfrage starte, klappt erstmal alles wunderbar.

Wenn ich allerdings die Abfrage nochmal *für einen anderen Mandanten* starte, wechselt er NICHT korrekt auf die andere Mandantendatenbank - ich bekomme das Ergebniss aus der ersten Abfrage.

Das ist mir etwas unverständlich; die gesamten ADO-Komponenten sind doch sauber ge-free-ed und die Connection zuvor geschlossen.

Oder habe ich etwas übersehen ?

lg
Sebastian

HeZa 15. Okt 2010 23:07

AW: Wechsel zwischen Datenbanken nicht möglich?
 
Schuss ins Blaue. Du hast an anderer Stelle ein Problem. Möglicherweise steht in FMandant nicht das was du erwartest hast. Auch möglich wäre, dass du in den beiden verschiedenen Mandanten die gleichen Daten hast. Alles reine Vermutung.

Dein Code selbst hat aber auch ein paar Problem (die meiner Meinung nach aber nichts mit dem Problem zu tun haben). Im Falle einer Exception produzierst du ein Speicherleck. Und EXCEPT EXIT; END; ist für mich eigentlich immer böse.

Ich habe mir erlaubt den Code etwas umzustellen (ohne es aber durch den Compiler zu jagen). Den EXCEPT Abschnitt betrachte ich dabei aber immer noch als Notlösung, aber ich weiß ja nicht was du eigentlich vor hast.

Delphi-Quellcode:
const constConnStr='Provider=ASAProv.90;Eng=.......';

function TLXComm.getUmsatz(start: TDate; Ende: TDate):boolean;
var ConnStr: string;
    ADOConnection: TADOConnection;
    ADOQuery: TADOQuery;
begin
  ConnStr:=Format(constConnStr, [ FPassword, getDatabasePath()+'\'+FMandant+'\Database.db']);
 
  ADOConnection:=TADOConnection.Create(nil);
  try
    ADOConnection.ConnectionString:=ConnStr;
    ADOConnection.KeepConnection:=true;
    ADOConnection.LoginPrompt := False;

    ADOQuery:=TADOQuery.Create(nil);
    try
      AdoQuery.Connection:=ADOConnection;
      AdoQuery.CursorLocation:=clUseServer;
      AdoQuery.CursorType:=ctStatic;
      AdoQuery.ExecuteOptions := [];
     
      try
        AdoConnection.Open;
      except
        on e: Exception do begin
           ShowMessage(Format(
             'ID kann nicht ermittelt werden.'#10'%s: %s',
             [e.ClassName, e.message]
             );
          exit;
        end;
      end;

      AdoQuery.SQL.Clear;
      AdoQuery.SQL.Add('SELECT * FROM sample');
      AdoQuery.Open;

      ShowMessage(AdoQuery.FieldByName('id').Asstring);
    finally
      AdoQuery.Free;
    end;
  finally  
    AdoConnection.Free;
  end;
end;

slemke76 18. Okt 2010 10:14

AW: Wechsel zwischen Datenbanken nicht möglich?
 
Guten Morgen,

die beiden Möglichkeiten bzgl. FMandant bzw. der gleichen Daten in der Datenbank habe ich beide gecheckt; daran liegt´s nicht.

Interessanterweise komme ich jeweils auf die richtige Datenbank, wenn ich das Programm zwischendurch beende ?!

Ich habe ähnliche Probleme auch mit einem Programm eines Dritt-Herstellers (das aber offensichtlich auch in Delphi geschrieben ist).

Ich vermute da eher mal eine Sybase-Spezialität (reine Vermutung)....

Vielen Dank für die Verbesserung des Codes !
Irgnedwie weiss ich auch nicht, was mich da geritten hat :-) (Ist zum Glück ja noch frühes Entwicklungsstadium *g*).

Update:
Habe es (eher durch Zufall) rausbekommen, indem ich die AdoConnection.Connectionstring überwacht habe; in den Connectionstring muss
Cache Authentication=False;
mit rein, dann gehts.

lg
Sebastian


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz