Autor Beitrag
Talbot
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 12:00 
Ich möchte mir einen Dienst schreiben, der Daten per TCP/IP empfängt und diese über ADO Komponenten in einer Datenbank ablegt.

Nur habe ich den Eindruck das die ADO Komponenten im Dienst überhaupt nichts tun.

Hat da jemand Erfahrung?
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Di 20.09.05 12:24 
Hallo,
Ich arbeite auch an einem Dienst, bei dem ADO Komponenten eingesetzt werden und ich hatte bisher keinerlei Probleme damit! Vielleicht würde es dir helfen, wenn du den Dienst selbst nicht direkt schreibst, sondern der Dienst nur ein Skelett ist, welches den "echten" Dienst aus ner DLL dazulädt. Der Grund dafür ist, dass ne DLL wesentlich einfacher zu debuggen ist als ein Service.

Gruß

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 12:29 
Okay, nur hab ich leider keine Idee wie ich eine DLL programmiere. Kannst du mir da einen Tipp geben wo ich gute Informationen dazu finde?

Ich hoffe das ich das auf die Reihe bekomm. Ist nämlich für's Abschlussprojekt meiner Ausbildung. Habe noch 3 Wochen Zeit.
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Di 20.09.05 12:38 
Oh naja okay, also du musst dich entscheiden, inwiefern du "neues" für deine Abschlussprüfung nutzen willst, das du noch nicht kennst, oder ob du lieber bei dem bleibst, was du schon kannst.

Aber solltest du dich dazu entscheiden, eine DLL zu schreiben, findest du hier ein Tutorial dafür. Solltest du zwischen deinem Dienst und der DLL Daten in Form von Strings austauschen wollen (auch wenn die in einer Klasse sind o.ä.), dann musst du als erste Unit beider Projekt-Dateien ShareMem (oder besser: FastShareMem) einbinden.

Falls du noch Informationen darüber möchtest, wie man einen modularisierten Dienst schreibt, der einen Kern-Service hat und entsprechende Module dynamisch nachlädt, meld dich. Hab mir da in letzter Zeit mal gedanken darüber gemacht.

Gruß

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 12:44 
Hm. Ich werde mich jetzt erstmal mit dem DLL Tutorial beschäftigen. Scheint ja erstmal nicht so schwierig zu sein. Wenn ich damit fertig bin, werd ich mich hier noch einmal melden.

Vielen Dank erstmal für die freundliche Hilfe.

Edit:

Der Dienst ist das einzige was ich noch fertig Programmieren muss, bevor ich die Abschlussdoku schreiben muss.
Von daher müsste das mit der Zeit ganz gut klappen.
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 13:04 
So.

Ich habe mir das DLL Tutorial durchgelesen und das war ja nicht so kompliziert. Jetzt wollte ich das auf meine Anwendung übertragen und stehe vor dem ersten Problem.
Wenn ich den Debugger aktivieren will, muss ich eine Host-Anwendung angeben. Ist das dann mein Service?
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Di 20.09.05 13:20 
Hi,
eigentlich ja, aber solltest du WinXP nutzen, klappt das nicht immer so ganz. Lies dir mal meinen Beitrag zum Debuggen einer DLL durch.

Dein Service muss im Prinzip nachher nichts anderes machen, als die DLL beim Initialize zu laden und am Ende eben wieder freizugeben... Irgendwelche Messages, die ein Dienst erhalten kann, musst du eben an deine DLL (bzw. passende Funktionen) weiterreichen.

Wenn du meinen Beitrag gelesen hast und dich fragst, was das "kleine Testprogramm" sein soll, dann sollte das eben die DLL laden -> genau das machen, was der Dienst später tun soll.

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Di 20.09.05 13:30 
Hallo Talbot,

ich setze auch einen Dienst ein, der ADO-Komponenten nutzt. Dabei sind mir keine grundlegenden Probleme untergekommen. Um das Problem mit dem Debuggen zu umgehen, verwende ich folgendes Konzept (bei allen Diensten):

Ich definiere eine Projektgruppe mit zwei Projekten, einer normalen Anwendung und einem Dienst. Alle Module des Programms werden in separaten Units programmiert und in beide Projekte aufgenommen. Das normale Programm lässt sich normal debuggen und enthält auch Anzeigen mit Protokollen o.ä. Hilfen für die Fehlersuche. Es dient nur dazu, die eigentlichen Units zu starten und zu testen. Alle Funktionen sind dann in beiden Projekten identisch. Der Dienst läuft allerdings unter einem anderen Account (z.B. lokales System) und in einem anderen Verzeichnis (c:\windows\system32). Daraus entstehende Fehlerquellen sind also separat zu beachten.

Diese Methode hat sich in der Praxis als sehr bequem und flexibel erwiesen.
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 13:51 
Nun, so wie's aussieht mach ich dann irgendwas falsch.

Ich habe bisher genau wie wdbee eine Anwendung mit den gleich Komponenten und Anweisungen bestückt wie den Dienst.
Nur in der Anwendung hats geklappt und im Dienst nicht. :-/

Vielleicht muss ich doch noch etwas tiefer forschen.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Di 20.09.05 14:01 
Wie oben gesagt, die Unterschiede im Account und im Verzeichnis lassen sich so nicht unbedingt verhindern. Deshalb solltest du da mal nachforschen (Berechtigungen, Pfade usw.)
Auch muss dir bewusst sein, dass ein Dienst nicht interaktiv ist, also keine Ausgaben (Showmessage usw.) zulässt. Ich schreibe alle Meldungen immer in Logfiles.
Als erstes solltest du mal feststellen, ob die Anmeldung bei der DB beim Dienst erfolgreich ist. Kommt da evt. ein Login-Fenster, dass niemand sieht?
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Di 20.09.05 14:15 
Ich war wohl nur zu ungeduldig mit der Fehlersuche. Ich habe bereits eine ausgabe in logfiles gemacht und damit ist vieles einfacher. jetzt bin ich der Sache auf der Spur.
Vielen Dank für die Hilfe.
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Mi 21.09.05 10:22 
Neues Problem:

Ich kann der Connection nicht den passenden Connection String zuweisen.

Ich weiss auch nicht warum. der ist eigentlich OK. Hier ein Code-Ausschnitt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure Tsrvc_EMServer.ServiceCreate(Sender: TObject);
begin
  //Variablen aus .ini initialisieren
  windir := GetWinDir;
  settings := TInifile.Create(windir + '/EMServer.ini');
  ServerSocket1.Port  := settings.ReadInteger('Connection','Port',12345);
  datapath            := Settings.ReadString('Database','Path' + '\',GetCurrentDir + '\data\');
  databasename        := settings.ReadString('Database','Filename','EMServer.mdb');
  logfile             := settings.ReadString('Filenames','Logfile','C:\log.txt');
  transferfile        := settings.ReadString('Filenames','Transferfile','C:\transfer.xml');

  //Connection-String aufbauen
  constring := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
              +  datapath + databasename
              + ';Persist Security Info=False';
  //Connection-String zuweisen 
  con_EMServer.ConnectionString := constring;
  //Connection aufbauen
  con_EMServer.Connected := True; 
  //Tabelle aktivieren
  tbl_sdaEM.Active := True;
end;


Wennn ich die Anweisung
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  //Connection-String aufbauen
  constring := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
              +  datapath + databasename
              + ';Persist Security Info=False';

auskommentiere gehts.

Ebenso wenn ich
ausblenden Delphi-Quelltext
1:
2:
  //Connection-String zuweisen 
  con_EMServer.ConnectionString := constring;

ausblende.

Jetzt könnte man annehmen, in den Variablen steht mist, etc. aber in der Anwendung die ich mit genau dem gleichen Code (Copy & Paste) geschrieben habe geht's. Hat jemand eine Idee?
Die Connection ist zum Startpunkt inaktiv und die Tabelle demnach auch.
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mi 21.09.05 10:29 
Wie lautet denn die Fehlermeldung?

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Mi 21.09.05 10:32 
Problem schon gelöst!

In der .ini stand folgendes:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[Connection]
Port=12345
[Database]
Path=D:\Eigene Dateien\Ausbildung\Abschlussprüfung\Programmierung\dev\serverapp\data\
Filename=EMServer.mdb
[Filenames]
Logfile=C:\log.txt
Transferfile=C:\transfer.xml


Man beachte die variable "Path". Diese hat einen Trailing slash und in meinem Code wird dieser nochmal hinzugefügt. :)

Bzw. wurde hinzugefügt. Hab's ja jetzt korrigiert ;-)
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mi 21.09.05 10:33 
Du kannst das ja ganz einfach über die funktion IncludeTrailingPathDelimiter machen.

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
Talbot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: Mi 21.09.05 10:36 
hey cool,

die Funktion kannte ich noch gar nicht :-)

Hab das bisher immer von hand geparsed....

Da kann man mal sehn. danke mal wieder ^^