Hallo liebes Forum, zunächst (nachträglich) Frohe Weihnachten an Alle.
Hab' mal wieder 'ne Frage und zwar ob jemand ein richtig gutes Buch (!!!) kennt zur Datenbankprogrammierung unter Pascal/Lazarus? Die Informationen, die im Internet verfügbar sind leider meist nur sehr rudimentär, beschreiben nur Teilfragen und sind darüber hinaus noch verwirrend ob der Vielfalt der möglichen Funktionen (z. B. .Append, .Insert,.Edit, .Prepare, .ExecSQL, .Open, .ApplyUpdates, .Post). Leider kann ich nirgendwo präzise Erklärungen zu diesen Funktionen finden, insbesondere wann sie am Besten angewendet werden (bei einigen ist es klar), was sie genau unterscheidet und warum es so viele Funktionen für ähnliche Anwendungsbereiche gibt und warum es bei deren Anwendung so viele Probleme gibt (tonnenweise Fragen, s. Google) und warum die Leute auf die - meist wenig hilfreichen - Internetdoku's verwiesen werden. Habe auch das 'Lazarusbuch', sehr wenig hilfreich, durchgearbeitet. Letztlich werden hier zwar einige Funktionen beleuchtet, allerdings sind die Beispiele für den richtigen Anwendungsfall wenig aussagekräftig. Insofern musste ich das Meiste mittels 'Try and Error' lösen. Es bleibt aber kein gutes Gefühl ob das Gefrickel wirklich korrekt ist. Also wenn jemand ein richtig gutes Buch kennt wäre ich gerne bereit ordentlich Geld zu investieren. Vielen Dank.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit
Sorry für die unpräzise Formulierung. Mir geht's um Datenbankprogrammierung mittels Lazarus/Pascal. Über SQL habe ich bereits ausreichend Informationen. Die LazInfos kenne ich bereits, ist gut, aber da geht's um absolute Grundlagen, die mir nicht wirklich weiterhelfen, da nicht wirklich auf spezielle Fragestellungen eingeht, wie z. B.: wie schreibe ich in eine Datenbank (ohne Fehlermeldungen), welche der vielen Funktionen ist für welchen Fall optimal bzw. wodurch unterscheiden sich die Funktionen im Einzelfall (z. B. SQLQuery.FieldbyName, SQLQuery.Fields.FieldbyName, SQLQuery.Params.ParambyName) oder auch wann verwendet man SQLQuery.Open, .Prepare, .Post, .ExecSQL, .ApplyUpdates.
Zuletzt geändert von and4more am So 27. Dez 2015, 20:42, insgesamt 1-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit
In dem Buch "Lazarus - Klassenbibliothek und IDE" von M. van Canneyt u.a. (Computer & Literatur Verlag) gibt es ein Kapitel über Datenbanken. Unter http://www.cul.de/data/lazarus2pr.pdf findest du ein Probekapitel, Inhaltsverzeichnis und Stichwortregister. - ich weiß nicht, ob es "gut" ist, so wie du im Titel forderst.
@wp_xyz:
Wie bereits eingangs gesagt besitze ich dieses Buch bereits, ist aber leider nur ein wenig hilfreich und beantwortet keineswegs detailliertere Fragestellungen. Bei dem Datenbankbeispiel geht's um dBase, SQL wird fragmentarisch auch gezeigt. Auch an den Beispielen im Internet werden viele verschiedene Ansätze munter gemischt ohne letztlich zu erklären, warum dieser Weg gewählt wurde (Vor- / Nachteile). Außerdem stürzt zumindest mein Programm bei vielen der genannte Ansätze gnadenlos ab und ich weiß echt nicht warum. Also benötige ich irgendwas, was richtig ins Detail geht.
P.S: Sorry, habe grade bemerkt, dass ich's nicht eingangs erwähnt hatte, dass ich das genannte Buch bereits besitze.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit
@af0815
Klar, völlig richtig was Du sagst, es widerspricht nicht meinem Wunsch nach einer vernünftigen Dokumentation der benötigten Pascal-Funktionen, sondern, im Gegenteil, unterstützt ihn.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit
Bei Lazarus muss man sich daran gewöhnen, die Informationen mühsam zusammen zu suchen.
Wirklich gute Dokumentation über die Grundlagen hinaus (Lazarus-Buch) ist entweder nicht vorhanden oder aber total verstreut.
(Ich lasse mich da gerne eines besseren belehren)
Eine wesentliche Basis zum Nachschlagen sind die mitgelieferten Beispielprojekte.
Auch Literatur zu Delphi 5/6 - z.B. zur Datenbankprogrammiereung - kann hilfreich sein.
Ich bin überzeugt davon, dass Lazarus wesentlich populärer wäre, wäre gute Dokumentation für Ein-/und Umsteiger (in Buchform) vorhanden.
(und um der üblicherweise auf solche Posts folgende Frage vorzugreifen: Nein, ich habe die Zeit leider derzeit auch nicht, eine Dokumentation zu schreiben)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Beschreib doch dein Projekt/Ziel mal, dann kann man diskutieren wie das am besten umsetzbar wäre. So Sätze wie "Ohne Fehlermeldungen" sind nicht sonderlich Hilfreich, fehlermeldungen deuten immer drauf hin das was schiefläuft. Wenn du das erklärt haben möchtest musst schon beschrieben was du machst und was für Fehlermeldungen.
@MacWomble: Sehe ich ganz genauso, nur leider ist Pascal/Delphi/Lazarus mittlerweile, zumindest auf dem Buchmarkt, total out, wobei interessanterweise die Net-Statistiken zum Verbreitungsgrad von Pascal/Lazarus/Delphi was anderes sagen, ich glaube insgesamt 26% letztens gelesen zu haben. Da verwundert der Mangel an guter Literatur doch sehr.
@Christian: Mir geht's eigentlich nicht konkret um ein Projekt, ich wurschtle grade spaßeshalber daran ein bereits funktionierendes Programm derart "aufzubohren" dass erhobene Befunde in einer Datenbank abgelegt werden und diese wieder aufgerufen werden können (Aufrufen der Daten klappt übrigens problemlos). Die Fehlermeldungen sind multipel, je nachdem was man grade ändert. Ich denke, ein großes Problem ist die Kombination zweier Sprachen (SQL und Pascal), da die Funktionen aufeinander abgestimmt sein müssen. Die Beispiele im Internet verfolgen fast alle komplett unterschiedliche Ansätze, z. B. werden zur Wertübergabe sowohl SQL.Fields.FieldbyName, SQL.FieldbyName und SQL.Params.ParambyName verwendet. Die Verwendung der unterschiedlichen Funktionen bleibt Geheimnis der Autoren. Verwendet man SQL.Open oder .Prepare? Bei .Open z. B. liefert RecordCount korrekte Ergebnisse, bei .Prepare fehlerhafte. An welcher Stelle im Code muss SQL.Append oder .Insert verwendet werden, wie müssen dann die SQL-Befehle angepasst werden? Wann setze ich SQL.Prepare oder .Open ein? In Verbindung mit .ApplyUpdates oder .Post gibt's Fehlermeldungen (meist: keine bestehende Datenbankverbindung), verwendet man nur SQL.ExecSQL klappt das Speichern plötzlich, ist aber eigentlich nicht "Lehrbuchkonform", usw. Ich bin der Meinung, dass mir hierbei einfach eine gute Dokumentation weiterhelfen könnte, nur wo ist die zu finden?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit
a) Recordcount:
Bei SQL Datenbanken wird normalerweise nicht die ganze Datenmenge vom Server abgerufen, RecordCount ist ein Relikt von Desktopdatenbanken. Deshalb gibt RecordCount oft scheinbar falsche Werte (wie 10) zurück. Normalerweise werden von der Query nur die nächsten, laut PackedRecord 10, Werte eingelesen, erst wenn mehr Daten angefordert werden (zB. durch Scrollen in Datagrid) werden die nächsten Daten geladen. Machst du vor dem Lesen vom RecordCount ein 'Last' so werden alle Daten geholt. Man kann auch PackedRecords auf -1 setzen, dann wird auch alles geholt. ABER beide Vorgangsweisen sind in der SQL-Server Welt nicht sinnvoll und zeigen das man es nicht verstanden hat.
Es gibt die Möglichkeit den Server direkt zu fragen: 'SELECT COUNT(MyCol) FROM MyTable WHERE ...'. Damit kann der Server dir die Anzahl sauber, schnell und richtig liefern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
b) Prepare
Prepare verwendet man zusammen mit dem SQL-Server (der es unterstützen muß) um gleichartige Queries, bei welchen nur die Parameter geändert werden, optimiert abzuarbeiten.
Der SQL Server wandelt ja das SQL-Satement intern um, analysiert es und macht einen Ablaufplan. Nach dem liefern der Ergebnisse wird der Plan irgendwann gelöscht. Verwende ich prepare, so weiss der Server, das ich vorhabe das SQL-Statement öfters aufzurufen, nur mit geänderten Parametern. Dafür erstellt er einen optimierteren Plan. Dieser wird dann immer wieder verwendet. Das Analysieren und optimieren entfällt dann und schlägt sich normalerweise mit besserer Performance der weiteren Queries nieder (nicht der ersten !).
Wenn man laufende 'ad hoc' Queries verwendet, die Daten weder komplex (joins etc.) noch viel sind, bringt prepare nichts. Eine 'ad hoc' Query ist auch eine, wo das SQL Statement durch Textfunktionen zusammengestoppelt wird, also ohne das verwenden von Paramtern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
c) Werteübergabe
Eine Werteübergabe an die Query geht nur mit Parametern, alles andere ist ein zusammenstoppeln per Textfunktion PUNKT.
Warum Parameter benutzen -> Parameter werden vom Server eingefügt, er hat damit die Möglichkeit zu wissen ob es Parameter oder SQL-Statemt ist. WIrd ein Wert als Parameter übergeben, so ist eine SQL-Injektion von SQL-Befehlen in den Parametern nicht möglich (Parameter sind keine Befehle). Wird das ganze aus welchen Gründen auch immer, per zusammensetzen durch Textfunktionen gemacht so kann man ganze SQL-Scripts unterjubeln, der Server kann es nicht unterscheiden. Weiters kann mit Parametern der Server den kompilierte, optimierten Ablaufplan öfters verwenden, wenn er erkennt, das das SQL-Statement nicht geändert wurde (Interene Optimierungen).
d) SQL.Fields.FieldByName und SQL.FieldByName
IMHO das selbe nur mit abgekürzter Schreibweise - BITTE um korr. wenn nicht so stimmt !!
e) SQL.Open versus SQL.Execute
Open wird immer dann verwendet wenn ich Resultsets zurückbekomme (vulgo Daten) zB. SELECT. Execute immer dann wenn ich keine Daten erwarte z.B UPDATE, DELETE, INSERT
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
@af0815: Vielen Dank für die super Erläuterungen. So eine gute Erklärung und mehr darüber hinaus suche ich komplett als Buch, da ich einerseits nicht alle im Forum ständig mit blöden Fragen nerven muss und andererseits auch die größeren Zusammenhänge kennen möchte.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit