![]() |
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:
Vielen Dank für die Hilfe.
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. |
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.
|
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.
|
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! |
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.
|
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. |
AW: Units mit DB-Zugriff stürzen ab
Und ein Firebird Client befindet sich ebenfalls am Client?
|
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 03:00 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