Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Units mit DB-Zugriff stürzen ab (https://www.delphipraxis.net/163707-units-mit-db-zugriff-stuerzen-ab.html)

Nico93 12. Okt 2011 13:26

Datenbank: Firebird • Version: 2.1 • Zugriff über: ibexpert

Units mit DB-Zugriff stürzen ab
 
hallo zusammen,
leider habe ich wieder ein Problemchen.
Ich habe ein kleines Programm programmiert welches auf dem Entwickler Pc (mit Delphi 2007) super läuft.
Jedoch stürzt das Programm auf allen Pcs, welche kein Delphi installiert haben sofort ab.
Unter Windows xp stürzt es einfach ab ohne was zu sagen und unter Windows 7 kriege ich wenigstens noch die Fehlermeldung, dass die MIDAS.dll nicht gefunden werden kann, obwohl ich unter uses die MIDASLIB eingebunden habe.

Nach langem ausprobieren habe ich herausgefunden dass das Programm nur abstürzt wenn ich eine bestimmte Unit, welche einen Datenbankzugriff hat, in das Projekt eingebunden ist.
Nach weiterem Probieren habe ich festgestellt, dass das Programm läuft wenn ich alle Komponenten von der Unit entferne, welche irgendwas mit dataset, datasource, query, connection oder sonst was zu tun haben.

Leider weiß ich jetzt gar nicht mehr weiter woran es liegen könnte.
Auf dem dazugehörigen Form befinden sich: 1x SQLConnection, 2xDataSource, 2xSimpleDataSet, 2xSQLQuery.
Hier der Quellcode der besagten Unit, welche das Programm zum Absturz bringt:


Delphi-Quellcode:
unit berichte;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, jpeg, ExtCtrls, DBCtrls,
  Registry, DB, ComCtrls, Buttons, SqlExpr, WideStrings, Printers,
  MIDASLIB, Mask, FMTBcd;

type
  TForm7 = class(TForm)
    Label1: TLabel;
    DateTimePicker1: TDateTimePicker;
    Label2: TLabel;
    DateTimePicker2: TDateTimePicker;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    SQLConnection1: TSQLConnection;
    DataSource1: TDataSource;
    SQLQuery1: TSQLQuery;
    SQLQuery2: TSQLQuery;
    PrintDialog1: TPrintDialog;
    DataSource2: TDataSource;
    procedure einnahmen_zaehlen();
    procedure ausgaben_zaehlen();
    procedure BitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
    einnahmen: integer;
    ausgaben: integer;
    von: string;
    bis: string;
    DBEdit2: TDbEdit;
    DBEdit3: TDbEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    datum_einnahmen: TDBEdit;
    rechnungsnr_einnahmen: TDbEdit;
    artikel_einnahmen: TDbEdit;
    betrag_einnahmen: TDbEdit;
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}
uses Unit2;

{ TForm7 }

procedure TForm7.ausgaben_zaehlen;
begin
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery1.ParamByName('von').value := von;
SQLQuery1.ParamByName('bis').value := bis;
SQLQuery1.Open;
ausgaben := SQLQuery1.FieldByName('Z').AsInteger;
end;

procedure TForm7.BitBtn1Click(Sender: TObject);
var I, J: integer;
breite, hoehe, randlinks, randoben: integer;
begin
von:=DateToStr(DateTimePicker1.Date);
bis:=DateToStr(DateTimePicker2.Date);
einnahmen_zaehlen;
ausgaben_zaehlen;

if PrintDialog1.Execute then begin
    Printer.BeginDoc; //Druckjob beginnen
    Printer.Canvas.Font.Name:='Arial';
    Printer.Canvas.Brush.Color:=clWhite;
    Printer.Canvas.Font.Size:=10;
    Printer.Canvas.Font.Style:=[fsBold];
    Printer.Canvas.TextOut(200, 400, 'Finanzbericht vom '+DateToStr(DateTimePicker1.Date)+' bis zum '+DateToStr(DateTimePicker2.Date));
    Printer.Canvas.Font.Size:=8;
    Printer.Canvas.Font.Style:=[];
    Printer.Canvas.TextOut(200, 600, 'Einnahmen(gesamt): '+IntToSTr(einnahmen)+', Ausgaben(gesamt): '+IntToSTr(ausgaben));
    Printer.Canvas.Font.Style:=[fsBold];
    Printer.Canvas.Font.Size:=10;
    Printer.Canvas.TextOut(200, 800, 'Einnahmen');
    Printer.Canvas.TextOut(2500, 800, 'Ausgaben');
    Printer.Canvas.Font.Size:=8;
    Printer.Canvas.TextOut(200, 1000, 'Datum');
    Printer.Canvas.TextOut(700, 1000, 'Rechnungsnr');
    Printer.Canvas.TextOut(1200, 1000, 'Artikel');
    Printer.Canvas.TextOut(2000, 1000, 'Betrag');
    Printer.Canvas.TextOut(2500, 1000, 'Datum');
    Printer.Canvas.TextOut(3000, 1000, 'Rechnungsnr');
    Printer.Canvas.TextOut(3500, 1000, 'Artikel');
    Printer.Canvas.TextOut(4300, 1000, 'Betrag');
    Printer.Canvas.Font.Style:=[];

  begin
    {SimpleDataSet1.First;
    SimpleDataSet2.First;}
    for I := 0 to ausgaben-1 do
    begin
      Printer.Canvas.TextOut(2500, 1100+I*100, DBEdit2.Text);
      Printer.Canvas.TextOut(3000, 1100+I*100, DBEdit3.Text);
      Printer.Canvas.TextOut(3500, 1100+I*100, DBEdit4.Text);
      Printer.Canvas.TextOut(4300, 1100+I*100, DBEdit5.Text + '€');
      //SimpleDataSet1.Next;
    end;
    for J := 0 to einnahmen-1 do
    begin
      Printer.Canvas.TextOut(200, 1100+J*100, datum_einnahmen.Text);
      Printer.Canvas.TextOut(700, 1100+J*100, rechnungsnr_einnahmen.Text);
      Printer.Canvas.TextOut(1200, 1100+J*100, artikel_einnahmen.Text);
      Printer.Canvas.TextOut(2000, 1100+J*100, betrag_einnahmen.Text + '€');

    end;
     
  end;
  begin

  for I := 1 to einnahmen do



  end;
    breite:=GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE)*10;
    hoehe:=GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE)*10;

    randlinks:=250; //2,5 cm
    randoben:=250; //2,5 cm

    end;
    Printer.EndDoc;

end;

procedure TForm7.einnahmen_zaehlen;
begin
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT COUNT (*) AS Z FROM EINNAHMEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery2.ParamByName('von').value := von;
SQLQuery2.ParamByName('bis').value := bis;
SQLQuery2.Open;
einnahmen := SQLQuery2.FieldByName ('Z').AsInteger;
end;

procedure TForm7.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.BringToFront;
end;

procedure TForm7.FormCreate(Sender: TObject);
var list:TStringList;
    conn_str: string;
begin
//DBEdit2.Create
DBEdit2 := TDBEdit.Create(Self);
with DBEdit2 do
begin
  Name:='DBEdit2';
  Parent:=Self;
  Left:=0;
  Top:=0;
  Width:=121;
  Height:=21;
  DataSource:=DataSource1;
  DataField:='DATUM';
  visible:=false;
end;
//DBEdit3.Create
DBEdit3 := TDBEdit.Create(Self);
with DBEdit3 do
begin
  Name:='DBEdit3';
  Parent:=self;
  left:=0;
  top:=0;
  Width:=121;
  Height:=21;
  DataSource:=DataSource1;
  DataField:='RECHNUNGSNUMMER';
  visible:=false;
end;
//DBEdit4.Create
DBEdit4 := TDBEdit.Create(self);
with DBEdit4 do
begin
  Name:='DBEdit4';
  Parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource1;
  DataField:='ARTIKEL';
  visible:=false;
end;
//DBEdit5.Create
DBEdit5 := TDbEdit.Create(self);
with DBEdit5 do
begin
  name:='DBEdit5';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource1;
  DataField:='BETRAG';
  visible:=false;
end;
//datum_einnahmen.Create
datum_einnahmen := TDBEdit.Create(self);
with datum_einnahmen do
begin
  name:='datum_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='DATUM';
  visible:=false;
end;
//rechnungsnr_einnahmen.Create
rechnungsnr_einnahmen := TDbEdit.Create(self);
with rechnungsnr_einnahmen do
begin
  name:='rechnungsnr_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width := 121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='RECHNUNGSNR';
  visible:=false;
end;
//artikel_einnahmen.Create
artikel_einnahmen := TDBEdit.Create(Self);
with artikel_einnahmen do
begin
  name:='artikel_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='ARTIKEL';
  visible:=false;
end;
//betrag_einnahmen.Create
betrag_einnahmen := TDbEdit.Create(Self);
with betrag_einnahmen do
begin
  name:='betrag_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='BETRAG';
  visible:=false;
end;

{SimpleDataSet1.DataSet.First;
SimpleDataSet2.DataSet.First;}

//Connection aktualisieren
list:=TStringList.Create;
list.loadfromfile('database.txt');
conn_str:=list.strings[0];

SQLConnection1.Params.Values['Database'] := conn_str;
end;

end.
Vielen Dank für die Hilfe.

tsteinmaurer 12. Okt 2011 14:03

AW: Units mit DB-Zugriff stürzen ab
 
Was lieferst denn mit deiner Anwendung noch mit aus? Sieht so aus, als wenn du dbExpress und ClientDataSets verwendest. Am besten in der Doku nachsehen, was bzgl. dbExpress für deine Ziel-DB ausgeliefert werden muss und AFAIK ClientDataSet (verwende die nicht) benötigt die Midas.dll.

Nersgatt 12. Okt 2011 14:05

AW: Units mit DB-Zugriff stürzen ab
 
Es reicht, wenn man MidasLib einmal im Uses der DPR angibt. Dann muss man auch nicht die DLL ausliefern. Und in den einzelnen Units des Projektes muss man es dann nicht mehr angeben.

Nico93 12. Okt 2011 14:07

AW: Units mit DB-Zugriff stürzen ab
 
ich verwende nur SimpleDatasets und querys und die connection ist eine sqlconnection welche über eine interbase verbindung auf die firebird datenbank zugreift.

Danke für die Hilfe!

tsteinmaurer 12. Okt 2011 14:22

AW: Units mit DB-Zugriff stürzen ab
 
Dann wirst die dbx*.dll für InterBase mitausliefern müssen und natürlich muss auch der Firebird Client und/oder Server am Zielrechner installiert sein. Generell ist die Frage, ob dbExpress das wahre ist oder vielleicht doch mit Drittherstellerkomponenten wie IBObjects, IBDAC etc ... Wenn dbExpress, dann würde ich einen für Firebird nehmen. In D2007 bedeutet dies ebenfalls über einen Dritthersteller.

Nico93 12. Okt 2011 14:34

AW: Units mit DB-Zugriff stürzen ab
 
ich habe die dbxint30.dll mit ins Programmverzeichnis gepackt, in dem sich auch die exe befindet.
Aber sobal ich die SQLConnection öffne macht das Programm einen Abgang.

tsteinmaurer 12. Okt 2011 14:55

AW: Units mit DB-Zugriff stürzen ab
 
Und ein Firebird Client befindet sich ebenfalls am Client?

Nico93 12. Okt 2011 14:59

AW: Units mit DB-Zugriff stürzen ab
 
ja einen Client habe ich installiert.
Aber der Fehler war ganz simple :-D
Beim FormCreate wurde zwar das SimpleDataset aktiviert nicht jedoch das internal DataSet.

Viele Dank für die Hilfen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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