Von 0 auf SQL in einem Programm [gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Von 0 auf SQL in einem Programm [gelöst]

Beitrag von corpsman »

Guten Morgen allerseits,

Ich wollte mir mal eine SQL Anwendung basteln, damit ich meine bisher gelernten SQL Befehle auch mal üben kann.

Also habe ich mir SQLite3 installiert und die entsprechenden Pakete für Lazarus. Genau wie es unter : http://wiki.lazarus.freepascal.org/SQLdb_Package" onclick="window.open(this.href);return false; steht.

Doch wenn ich nun meine Anwendung starte und auf Senden Klicke bekomme ich nur eine AV (can not open a non selected statement) die ich nicht verstehe.

Könnt ihr mir weiterhelfen ?
Dateianhänge
sql_demo.zip
Funktionierende Demo, benötigt nur noch einen Installierten SQLLite3 und das entsprechende Lazarus Paket
(4.62 KiB) 58-mal heruntergeladen
Zuletzt geändert von corpsman am Di 27. Jul 2010, 18:27, insgesamt 2-mal geändert.
--
Just try it

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von knight »

Es macht einen Unterschied, ob man vorhandene Daten anzeigen lassen will (Select...), oder ob man neue Daten hinzufügen will (Insert..., Create...). Du willst letzteres, hast deinen Code aber für ersteres ausgelegt. Statt SQLQuery1.Active würde ich SQLQuery1.ExecSQL gefolgt von SQLTransaction1.Commit verwenden.

knight

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von corpsman »

*g*

An der Uni haben wir prinzipiell zwischen solchen Befehlen nicht unterschieden *g*

ein zweiter Button und :

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
begin
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Text := memo1.Text;
  SQLQuery1.ExecSQL;
  SQLTransaction1.Commit;
end;
und die Tabelle kann ich anlegen *g*

Wenn ich nun gemäß :

http://reeg.junetz.de/DSP/node10.html#S ... 0000000000" onclick="window.open(this.href);return false;

ein
show tables;
eingebe, bekomme ich aber bei beiden buttons einen Syntax fehler für show.

Und die 2. Frage die sich mir natürlich gleich aufdrängt, gibt es eine Liste, in welcher steht, welche Befehle ich mit welchem "verfahren" behandeln muss?

Und die allerwichtigste Frage, wo lese ich die Antwort der SQL Datenbank aus ?
--
Just try it

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von Teekeks »

Open wird immer dann aufgerufen wenn etwas zurück erwartet wird (select, show) und ein ExecSQL wenn etwas an der Datenbank verändert wird (insert, update, delete, ...).
Ich hoffe das hilft dir weiter.

Gruß Teekeks

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von corpsman »

Wie man die Tabelle auslesen kann habe ich nun auch raus gefunden *freu*

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Var
  f: TField;
  s: TStringlist;
  c, i: Integer;
Begin
  SQLQuery1.Active := false;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Text := memo1.Text;
  SQLQuery1.Open;
  StringGrid1.ColCount := SQLQuery1.Fields.Count;
  // Wenn überhaupt etwas ausgelesen werden konnte
  If SQLQuery1.Fields.Count <> 0 Then Begin
    StringGrid1.RowCount := 1;
    // Die Labels Setzen
    s := TStringlist.create;
    SQLQuery1.Fields.GetFieldNames(s);
    For i := 0 To s.count - 1 Do Begin
      StringGrid1.Cells[i, 0] := s[i];
    End;
    // Auslesen aller gesendeter Daten
    c := 0;
    While (Not SQLQuery1.EOF) And (c < 10) Do Begin
      inc(c);
      StringGrid1.RowCount := StringGrid1.RowCount + 1;
      For i := 0 To s.count - 1 Do Begin
        f := SQLQuery1.Fields.FieldByName(s[i]);
        If assigned(f) Then Begin
          Case f.DataType Of
            ftInteger: StringGrid1.Cells[i, StringGrid1.RowCount - 1] := inttostr(f.AsInteger);
            ftString: StringGrid1.Cells[i, StringGrid1.RowCount - 1] := f.AsString;
          End;
        End;
      End;
      SQLQuery1.Next;
    End;
    s.free;
    StringGrid1.FixedCols := 0;
    StringGrid1.FixedRows := 1;
  End;
End;
Die Frage ist nun, wenn ich es wirklich nur als Reine Ausgabe mache, geht dass dann auch "Eleganter" ?
der Befehl "Show Tables;" geht immer noch nicht ...
--
Just try it

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von DiBo33 »

der Befehl "Show Tables;" geht immer noch nicht ...
Ist ja auch klar, schließlich gibt es diesen Befehl nur in MySQL.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von corpsman »

Damn,

d.h. ich muss also doch MySQL auf meinem System zum laufen bekommen, will ich in den vollen Genus aller SQL-Befehle bekommen ?
-> und das bedeutet dann einen Server installieren und die entsprechenden Clientlibs, oder sehe ich das falsch ?

Hatte SQLite ja deswegen genommen, weil ich die anderen nicht auf meinem Linux zum laufen bekommen hatte, bzw weil ich da nur das Paket sqllite3 installieren musste.
--
Just try it

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von DiBo33 »

d.h. ich muss also doch MySQL auf meinem System zum laufen bekommen, will ich in den vollen Genus aller SQL-Befehle bekommen ?
Nicht zwangsläufig, selbst wenn du MySQL installiert hast benötigst du den Befehl SHOW TABLES; doch eher selten, in Sqlite kannst du den Befehl nachbilden.

Code: Alles auswählen

SELECT name FROM sqlite_master 
    WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
    UNION ALL 
    SELECT name FROM sqlite_temp_master 
    WHERE type IN ('table','view') 
    ORDER BY 1
EDIT: Schau hier mal
http://www.sqlite.org/sqlite.html" onclick="window.open(this.href);return false;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm (Hilfe für einen Anfänger)

Beitrag von corpsman »

Cool, das funktioniert,

ja ich suche gerade auch schon nach den Unterschieden zwischen Mysql und SQLite, da ich ja nur vorhabe es für Lehrzwecke ein zu setzen, müsste auch sqlite gehen *g*

danke an alle Helfer, ich aktualisiere noch meine Anwendung in Post1, auf das zukünftige *neugierige* gleich eine Demo zum spielen haben...
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm [gelöst]

Beitrag von Socke »

corpsman hat geschrieben:ja ich suche gerade auch schon nach den Unterschieden zwischen Mysql und SQLite, da ich ja nur vorhabe es für Lehrzwecke ein zu setzen, müsste auch sqlite gehen *g*
MySQL arbeitet immer über einen Datenbank-Server, der alle Anfragen bearbeitet. SQLite ist nur eine Bibliothek, die einzelne Dateien (=Datenbank) verwaltet. Beide haben ihre eigenen Vorteile in unterschiedlichen Einsatzbereichen. Du solltest aber darauf achten, dass SQLite den SQL-Sprachstandard sehr viel strikter auslegt/weniger davon abweicht. Ein SQL-Befehl für SQLite wird unter MySQL wahrscheinlich nicht funktionieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Von 0 auf SQL in einem Programm [gelöst]

Beitrag von DiBo33 »

Du solltest aber darauf achten, dass SQLite den SQL-Sprachstandard sehr viel strikter auslegt/weniger davon abweicht. Ein SQL-Befehl für SQLite wird unter MySQL wahrscheinlich nicht funktionieren.
Wenn sich SQLite stärker an den SQL-Standard hält ist es eher wahrscheinlich das ein Statement welches in SQLite funktioniert auch in MySQL funktioniert, umgekehrt ist eher das ein Statement welches in MySQL funktioniert eben nicht in SQLite funktioniert.

Dazu weicht MySQL viel zu sehr vom Standard ab, angefangen bei GROUP BY und des automatischen Typecastings.

Code: Alles auswählen

SELECT Feld1, Feld2, COUNT(*)
FROM tabelle
GROUP BY Feld1

Code: Alles auswählen

SELECT '10euro' * 100
Funktioniert in MySQL anstandslos, während alle anderen DBMS dir eine Fehlermeldung ausgeben.

Zu SQL lernen halte ich jedenfalls MySQL als absolut nicht geeignet, ich muß allerdings dazu erwähnen das ich SQLite in der Hinsicht nicht so gut kenne.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm [gelöst]

Beitrag von Socke »

DiBo33 hat geschrieben:Zu SQL lernen halte ich jedenfalls MySQL als absolut nicht geeignet, ich muß allerdings dazu erwähnen das ich SQLite in der Hinsicht nicht so gut kenne.
Als Pascal-Programmierer bin ich eine klare Syntax gewohnt. Bei MySQL weiß ich nicht, wann ich welche Zeichen zur Kennzeichnung von Strings, Tabellen/Datenbanken (allgemein Identifikatoren) usw. einsetzen muss. In der SQLite Dokumentation stehts wenigstens schnell auffindbar drinnen.

Der andere Teil an SQLite ist die einfache API. Mit der kam ich ich wesentlich schneller klar, als mit den Lazarus-Komponenten. Vergleichen mit MySQL kann ich das aber nicht.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Von 0 auf SQL in einem Programm [gelöst]

Beitrag von DiBo33 »

Bei MySQL weiß ich nicht, wann ich welche Zeichen zur Kennzeichnung von Strings, Tabellen/Datenbanken (allgemein Identifikatoren) usw. einsetzen muss.
Oh das ist eigentlich ganz einfach.
Alles was ein Wert beinhaltet, sofern es kein numerischer Wert ist, gehört in Anführungszeichen (Strings, Datum, etc.), also so wie in jedem anderen DBMS.
Alle Objektbezeichner welche ungültig (incl. Leerzeichen, bestehend aus Zahl etc.) oder reservierte Wörter darstellen (ALTER, FROM etc.) müssen in Backticks, bei Vermeidung solcher Objektbezeichner brauchst du die Backticks niemals.


MySQL ist das PHP unter den DBMS :D

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von 0 auf SQL in einem Programm [gelöst]

Beitrag von Socke »

Ich für meinen Teil kann dann aber schneller erkennen, was ein Identifikator (Datenbank/Tabelle/Spalte), ein SQL-Keyword oder ein Wert ist. Ansonsten habe nur einen Unterschied zwischen Strings und allem anderen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten