AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Units mit DB-Zugriff stürzen ab

Units mit DB-Zugriff stürzen ab

Ein Thema von Nico93 · begonnen am 12. Okt 2011 · letzter Beitrag vom 12. Okt 2011
Antwort Antwort
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#1

Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 14:26
Datenbank: Firebird • Version: 2.1 • Zugriff über: ibexpert
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.
Nico

Geändert von mkinzler (12. Okt 2011 um 14:28 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#2

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:05
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.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#4

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:07
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!
Nico
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#5

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#6

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:34
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.
Nico
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#7

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:55
Und ein Firebird Client befindet sich ebenfalls am Client?
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 15:59
ja einen Client habe ich installiert.
Aber der Fehler war ganz simple
Beim FormCreate wurde zwar das SimpleDataset aktiviert nicht jedoch das internal DataSet.

Viele Dank für die Hilfen!
Nico
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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