Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DB-Programm auf anderem PC ausführbar machen... (https://www.delphipraxis.net/84457-db-programm-auf-anderem-pc-ausfuehrbar-machen.html)

dlenz 17. Jan 2007 10:11


DB-Programm auf anderem PC ausführbar machen...
 
Hallo Liebe Gemeinde,

ich möchte mein DB-Verwaltungsprogramm gerne auf einem anderen PC ausführbar machen.
Irgendwie komme ich aber mit "ExtractFilePath(ParamStr(0));" irgendwie nicht zurande.

Ich benutze eine TurboDB "db.tdbd", die im Ordner /db in meinem Programmverzeichnis liegt.

Wo muss ich denn "ExtractFilePath(ParamStr(0));" genau im Code anwenden?

Vielen Dank schonmal im Voraus!

Bernhard Geyer 17. Jan 2007 10:17

Re: DB-Programm auf anderem PC ausführbar machen...
 
Zitat:

Zitat von dlenz
Wo muss ich denn "ExtractFilePath(ParamStr(0));" genau im Code anwenden?

Ich denke mal bevor du die Datenbankverbindung aktivierst muss eine korrekter gültiger Pfad eingetragen sein.

dlenz 17. Jan 2007 10:22

Re: DB-Programm auf anderem PC ausführbar machen...
 
das habe ich ja auch, aber eben nur lokal für meinen PC. Wenn das Programm aber auf einem anderen PC ausgeführt wird, dann wird meine "db.tdbd" im Ordner /db aber nicht gefunden, da der andere PC einen ganz anderen Laufwerksbuchstaben und Programmpfad hat, in dem das Programm gestartet wird.

ich starte das Programm z.B. im Ordner E:\Delphi-Prgs\, der andere PC aber aus dem Ordner C:\Programme\ProgrammXYZ\ und dann wird die DB nicht gefunden.

Das mein ich damit :)

mkinzler 17. Jan 2007 10:28

Re: DB-Programm auf anderem PC ausführbar machen...
 
Deshalb mußt du den Pfad ja mit obengenannter Funktionbei Programmstart ermitteln, in die Komponenete (kombiniert mit Dateinamen) eintragen.

dlenz 17. Jan 2007 10:50

Re: DB-Programm auf anderem PC ausführbar machen...
 
Ich habe das jetzt so gemacht:
Delphi-Quellcode:
procedure Tfrm_main.FormCreate(Sender: TObject);
 var verz: string;
begin
 verz := ExtractFilePath(ParamStr(0))+'/db/';
 TdbTable1.Active := False;
 try
  TdbTable1.DatabaseName := verz;
  TdbTable1.TableName := 'db.tdbd';
  TdbTable1.Active := True;
 except
  MessageBeep(0);
  ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
 end
end;
aber bekomme eine Fehlermeldung:
Im Projekt ist Exception der Klasse ETdbEngine aufgetreten. Meldung:'Code = 134, Description ='. Proyess wurde angehalten.

was mach ich da falsch? *grübel

uwewo 17. Jan 2007 10:54

Re: DB-Programm auf anderem PC ausführbar machen...
 
Führe doch mal Einzelne Anweisungen mit F7 aus, dann siehst Du wo es Probleme gibt.

Uwe

dlenz 17. Jan 2007 10:57

Re: DB-Programm auf anderem PC ausführbar machen...
 
TdbTable1.Active := True;

ist falsch sagt der code explorer

mkinzler 17. Jan 2007 11:13

Re: DB-Programm auf anderem PC ausführbar machen...
 
Delphi-Quellcode:
verz := ExtractFilePath(ParamStr(0))+'db/';
Backslash ist bereits Teil des Pfades

dlenz 17. Jan 2007 11:17

Re: DB-Programm auf anderem PC ausführbar machen...
 
kommt trotzdem die gleiche fehlermeldung.

habe hier nochmal meinen gesamten code:
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Mask, DBCtrls, DB, TdbLicense, TdbDataSet,
  Grids, DBGrids, Buttons;

type
    Tfrm_main = class(TForm)
    DBEdit1: TDBEdit;
    Image1: TImage;
    TdbTable1: TTdbTable;
    DataSource1: TDataSource;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBNavigator1: TDBNavigator;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit11: TDBEdit;
    DBEdit12: TDBEdit;
    DBGrid1: TDBGrid;
    DBEdit13: TDBEdit;
    BitBtn1: TBitBtn;
    DBEdit14: TDBEdit;
    DBCheckBox1: TDBCheckBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frm_main: Tfrm_main;

implementation

uses u_qr1;

{$R *.dfm}

procedure Tfrm_main.BitBtn1Click(Sender: TObject);
begin
 liste.TdbQuery1.SQL.Clear;
 liste.TdbQuery1.SQL.Add('SELECT * FROM antragsgegner WHERE ID =' + DBEdit1.Text);
 showmessage(liste.TdbQuery1.SQL.text);
 liste.TdbQuery1.Open;
 liste.preview;
end;

procedure Tfrm_main.FormCreate(Sender: TObject);
 var verz: string;
begin
 verz := ExtractFilePath(ParamStr(0))+'db/';
 TdbTable1.Active := False;
 try
  TdbTable1.DatabaseName := verz;
  TdbTable1.TableName := 'db.tdbd';
  TdbTable1.Active := True;
 except
  MessageBeep(0);
  ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
 end
end;

end.
also im moment weiß ich nicht, wo der fehler liegt. im OI habe ich die Eigenschaft "DatabaseName" leer gelassen, weil diese eigenschaft ja per variable "verz" und TdbTable1.TableName := 'db.tdbd' bestimmt werden soll.

was mach ich da falsch? :cry:

mkinzler 17. Jan 2007 11:45

Re: DB-Programm auf anderem PC ausführbar machen...
 
Was für ein Fehler wird genau angezeigt? (GGf Exception-Handler deaktivieren)

dlenz 17. Jan 2007 11:46

Re: DB-Programm auf anderem PC ausführbar machen...
 
okay... das Problem ist gelöst:

Delphi-Quellcode:
procedure Tfrm_main.FormCreate(Sender: TObject);
 var verz: string;
begin
 verz := ExtractFilePath(ParamStr(0))+'db/';
 TdbTable1.Active := False;
 try
  TdbTable1.DatabaseName := verz + 'db.tdbd';
  TdbTable1.Active := True;
 except
  MessageBeep(0);
  ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
 end
end;
end.
aber nun möchte ich die daten aus der DB-Tabelle über ein TdbQuery in einen Report übernehmen und er sagt mir immer, dass er keine tabelle.dat findet, warum das nu wieder?

sh17 7. Feb 2007 23:12

Re: DB-Programm auf anderem PC ausführbar machen...
 
TdbQuery kann unabhängig von TdbTable verwendet werden.

Normalerweise gehts so:

Delphi-Quellcode:
  Query := TTdbQuery.Create(nil);
  Query.DatabaseName := path+'BLZCODES.TDBD';
  try
    Query.SQLW := 'SELECT * FROM BLZCODESTABLE WHERE BLZ = '''+_BLZ+'''';
    Query.Open;
    Result := Query;
  except
    on E:Exception do ...
  end;
EDIT: hab mal die Query angepasst, die Tabelle hatten den gleichen Namen wie die Datenbank.

marabu 8. Feb 2007 08:14

Re: DB-Programm auf anderem PC ausführbar machen...
 
Guten Morgen,

Backslash heißt der nach links gekippte Schrägstrich und der wird im Windows Dateisystem verwendet. Aus bestimmten Gründen (z.B. Portabilität) schreibt man ihn nur selten selbst und verwendet nach Möglichkeit die Funktion IncludeTrailingPathDelimiter().

Werden Datenbanken zur Laufzeit konfiguriert, dann werden die zugehörigen Dataset-Komponenten (Table, Query) im geschlossenen Zustand erzeugt - deshalb musst Active nicht erst auf False gesetzt werden. Das würde auch nicht mehr helfen, weil ja bereits ein Zugriff auf eine nicht vorhandene Datenbank erfolgt wäre.

Wenn du den Speicherort (Verzeichnis) deiner Datenbank öfter (z.B. für Queries) benötigst, dann würde ich ihn mir in einer globalen Variable merken und nicht jedesmal neu bestimmen.

Die Steuerzeichenfolge zum Trennen von Textzeilen ist #13#10 oder besser sLineBreak.

Wenn in einer Query ein Tabellenname unbekannt ist, dann musst du mal genau hinschauen - in der Regel gibt es dann dieses Datenbankobjekt auch nicht, meistens weil du dich verschrieben hast oder die Datenbank noch leer ist.

Delphi-Quellcode:
resourcestring
  S_RELDBFOLDER = 'db';
  S_DBNAME     = 'db.tdbd';
  S_DBNOTFOUND = 'Datenbank nicht gefunden:'#13#10'%s';

procedure ShowError(msg: string);
begin
  if not QuietMode then
    MessageBeep(0);
  ShowMessage(msg);
end;

procedure Tfrm_main.FormCreate(Sender: TObject);
begin
  self.DatabaseName := IncludeTrailingPathDelimiter(
      ExtractFilePath(ParamStr(0)) + S_RELDBFOLDER) + S_DBNAME;
  try
    TdbTable1.DatabaseName := self.DatabaseName;
    TdbTable1.Open;
  except
    ShowError(Format(S_DBNOTFOUND, [self.DatabaseName]));
  end
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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-2025 by Thomas Breitkreuz