![]() |
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:
Die Datenbank.db gibt es mehrfach, eine je Mandant. Wenn ich die Abfrage starte, klappt erstmal alles wunderbar.
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; 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 |
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; |
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 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz