Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In SQLite Integer-Wert schreiben? (https://www.delphipraxis.net/177846-sqlite-integer-wert-schreiben.html)

AlexII 30. Nov 2013 20:26

Datenbank: SQLite • Version: 3 • Zugriff über: SQLiteSimpleDelphi-Wrappers von Tim Anderson

In SQLite Integer-Wert schreiben?
 
Hallo,

ich schreibe wie folgt in meine SQLite DB:

Delphi-Quellcode:
procedure TForm3.AddNewStation();
var
  dbFile: String; // DB Verzeichniss
  db: TSQLiteDatabase; // Klasse
  sSQL: String;
  f: Integer;
begin
  dbFile := ExtractFilePath(Application.ExeName) + 'Stations.db';
  db := TSQLiteDatabase.Create(dbFile);

  // Prüfen, ob Station favorit oder nicht
  if FavoriteCheckBox.Checked then
  f:=1 else f:=0;

    try

    // Transaktion beginnt
    db.BeginTransaction;

    // Tabelle allStations füllen
    sSQL := 'INSERT INTO allStations(aName, aStreamURL, aWebsiteURL, aScheduleURL, aFavorite, aFixed, aInfo, ';
    sSQL := sSQL + 'fk_language_id, fk_category_id) VALUES ("' + Trim(StationNameLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StreamURLLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StationWebsiteLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StationProgramsLEdit.Text) + '",';
    sSQL := sSQL + '"' + IntToStr(f) + '",';
    sSQL := sSQL + '"' + IntToStr(0) + '",';
    sSQL := sSQL + '"' + InfoMemo.Text + '",';
    sSQL := sSQL + '"' + IntToStr(Integer(LanguageComboBox.Items.Objects[LanguageComboBox.ItemIndex])) + '",';
    sSQL := sSQL + '"' + IntToStr(Integer(CategoryComboBox.Items.Objects[CategoryComboBox.ItemIndex])) + '");';

    // Insert Befehl wird ausgeführt
    db.ExecSQL(sSQL);

    // Transaktion endet
    db.Commit;

  finally
    db.Free;
  end;
end;
Nun möchte ich die Variable f und die Fremdschlüssel in die DB als Integer-Wert speichern. Wie kann ich das mit diesem Vorgehen machen, wenn die ganze sSQL-Kette ein String ist?
Bin für jeden Tipp dankbar!

Volker Z. 30. Nov 2013 21:00

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

ich gehe mal davon aus, dass die Felder als Integer angelegt sind; dann einfach die zu schreibenden Werte nicht quoten - also:
Code:
INSERT INTO tablename(intField, strField) VALUES(1, 'Text')
Gruß

AlexII 30. Nov 2013 21:06

AW: In SQLite Integer-Wert schreiben?
 
Das geht ja gerade nicht, da die Integer als sSQL-String an die DB übergeben werden.

Lemmy 30. Nov 2013 21:10

AW: In SQLite Integer-Wert schreiben?
 
nicht extra quoten:

Zitat:

Zitat von AlexII (Beitrag 1238016)

Delphi-Quellcode:
    sSQL := 'INSERT INTO allStations(aName, aStreamURL, aWebsiteURL, aScheduleURL, aFavorite, aFixed, aInfo, ';
    sSQL := sSQL + 'fk_language_id, fk_category_id) VALUES ("' + Trim(StationNameLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StreamURLLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StationWebsiteLEdit.Text) + '",';
    sSQL := sSQL + '"' + Trim(StationProgramsLEdit.Text) + '",';
    sSQL := sSQL + '"' + IntToStr(f) + '",';
    sSQL := sSQL + '"' + IntToStr(0) + '",';
    sSQL := sSQL + '"' + InfoMemo.Text + '",';
    sSQL := sSQL + IntToStr(Integer(LanguageComboBox.Items.Objects[LanguageComboBox.ItemIndex])) + ',';
    sSQL := sSQL + IntToStr(Integer(CategoryComboBox.Items.Objects[CategoryComboBox.ItemIndex])) + ');';

Texte müssen in den entsprechenden Quote-Zeichen " oder ' eingefasst werden. Zahlen eben nicht.

Grüße

AlexII 30. Nov 2013 21:21

AW: In SQLite Integer-Wert schreiben?
 
Hm... es will irgendwie nicht, egal wie... :gruebel:

Volker Z. 30. Nov 2013 21:29

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238020)
Hm... es will irgendwie nicht, egal wie... :gruebel:

Geht es etwas genauer? Was will denn nicht? Wird nichts in die DB geschrieben? Oder liegt es an etwas anderem?

Gruß

AlexII 30. Nov 2013 21:35

AW: In SQLite Integer-Wert schreiben?
 
Der Compiler akzeptiert das hier nicht:

String:=String+String+Integer+String;

Egal wie ich Integer da quote ein Integer kann nicht in die String-Kette passen. Oder irre ich mich?

Volker Z. 30. Nov 2013 21:55

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238024)
Der Compiler akzeptiert das hier nicht:

String:=String+String+Integer+String;?

Egal wie ich Integer da quote ein Integer kann nicht in die String-Kette passen. Oder irre ich mich?

Ich weiß ja nicht was Du genau machst, aber bei so etwas sollte der Compiler nicht meckern (außer ich hab da irgendwo eine Klammer o. ä. vergessen)
Delphi-Quellcode:
  sSQL := 'INSERT INTO allStations(aName, aStreamURL, aWebsiteURL, aScheduleURL, aFavorite, aFixed, aInfo, ' +
          'fk_language_id, fk_category_id) VALUES (' +
          QuotedStr (Trim(StationNameLEdit.Text)) + ',' +
          QuotedStr (Trim(StreamURLLEdit.Text)) + ',' +
          QuotedStr (Trim(StationWebsiteLEdit.Text)) + ',' +
          QuotedStr (Trim(StationProgramsLEdit.Text)) + ',' +
          IntToStr (f) + ',' +
          IntToStr (0) + ',' +
          QuotedStr (InfoMemo.Text) + ',' +
          IntToStr (Integer(LanguageComboBox.Items.Objects[LanguageComboBox.ItemIndex])) + ',' +
          IntToStr (Integer(CategoryComboBox.Items.Objects[CategoryComboBox.ItemIndex])) + ');';
und das SQL-Statement sollte auch ausgeführt werden.

Wenn Du uns zeigst was Du machst, dann kann Dir hier auch besser geholfen werden.

Gruß

Sir Rufo 30. Nov 2013 21:58

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von AlexII (Beitrag 1238024)
Der Compiler akzeptiert das hier nicht:

String:=String+String+Integer+String;

Egal wie ich Integer da quote ein Integer kann nicht in die String-Kette passen. Oder irre ich mich?

Aua.

Sowas muss als Text übergeben werden
SQL-Code:
insert into mytable ( strfld, intfld )
values ( "Text", 5 );
aber du produzierst das hier
SQL-Code:
insert into mytable ( strfld, intfld )
values ( "Text", "5" );
Was ist der Fehler?

AlexII 30. Nov 2013 22:02

AW: In SQLite Integer-Wert schreiben?
 
Ok das klappt, aber die int variable f wir bei mir zur str. Wenn ich aber die Umwandlung nach str weglasse, meckert der Compiler. Wie kann ich die int Variable ohne Umwandlug als int in die DB schreiben?

Sir Rufo 30. Nov 2013 22:04

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von AlexII (Beitrag 1238028)
Ok das klappt, aber die int variable f wir bei mir zur str. Wenn ich aber die Umwandlung nach str weglasse, meckert der Compiler. Wie kann ich die int Variable ohne Umwandlug als int in die DB schreiben?

Du musst diese in einen string wandeln, aber lass die "" Zeichen um diese umgewandelten Zahl weg!

AlexII 30. Nov 2013 22:09

AW: In SQLite Integer-Wert schreiben?
 
Ok, aber das Attribut für den f-Wert ist bei mir als int in der DB deklariert. Wozu dann das wenn das als str in die DB übergeben werden muss?

Volker Z. 30. Nov 2013 22:13

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238030)
Ok, aber das Attribut für den f-Wert ist bei mir als int in der DB deklariert. Wozu dann das wenn das als str in die DB übergeben werden muss?

Lass das
Delphi-Quellcode:
IntToStr (f)
so wie es ist und lass das SQL-Statement ausführen, dann wird auch ein Integer in die Tabelle eingetragen. Die DB-Engine erkennt anhand der fehlenden Anführungszeichen aha, da kommt ein Integer (selbst wenn des SQL-Statement ein String ist)

Gruß

Sir Rufo 30. Nov 2013 22:14

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von AlexII (Beitrag 1238030)
Ok, aber das Attribut für den f-Wert ist bei mir als int in der DB deklariert. Wozu dann das wenn das als str in die DB übergeben werden muss?

:shock:

Bitte befasse dich mit den Grundlagen zum Thema SQL

AlexII 30. Nov 2013 22:17

AW: In SQLite Integer-Wert schreiben?
 
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Volker Z. 30. Nov 2013 22:23

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238033)
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Japp, und nicht nur SQLite - auch andere auf SQL basierende RDBMS

Gruß

AlexII 30. Nov 2013 22:27

AW: In SQLite Integer-Wert schreiben?
 
Ah...jah... jetzt kapiere ich das.... und ich wollte es die ganze Zeit entsprechend der Deklaration an die DB schicken.

Sir Rufo 30. Nov 2013 22:48

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von Volker Z. (Beitrag 1238034)
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238033)
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Japp, und nicht nur SQLite - auch andere auf SQL basierende RDBMS

Gruß

Und auch der Delphi-Code ist nur eine stumpfer Text, sowie Visual Basic, C, C#, .........

Volker Z. 30. Nov 2013 23:07

AW: In SQLite Integer-Wert schreiben?
 
Hallo,

Zitat:

Zitat von Sir Rufo (Beitrag 1238039)
Zitat:

Zitat von Volker Z. (Beitrag 1238034)
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238033)
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Japp, und nicht nur SQLite - auch andere auf SQL basierende RDBMS

Gruß

Und auch der Delphi-Code ist nur eine stumpfer Text, sowie Visual Basic, C, C#, .........

:?: Stehe ich da jetzt aufm Schlauch :gruebel::gruebel: oder war danach gefragt?

Gruß

Sir Rufo 30. Nov 2013 23:58

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von Volker Z. (Beitrag 1238042)
Hallo,

Zitat:

Zitat von Sir Rufo (Beitrag 1238039)
Zitat:

Zitat von Volker Z. (Beitrag 1238034)
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238033)
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Japp, und nicht nur SQLite - auch andere auf SQL basierende RDBMS

Gruß

Und auch der Delphi-Code ist nur eine stumpfer Text, sowie Visual Basic, C, C#, .........

:?: Stehe ich da jetzt aufm Schlauch :gruebel::gruebel: oder war danach gefragt?

Gruß

Nein, nicht explizit gefragt, aber vom Grundsatz her vergleichbar

Volker Z. 1. Dez 2013 00:27

AW: In SQLite Integer-Wert schreiben?
 
Hallo Sir Rufo,
Zitat:

Zitat von Sir Rufo (Beitrag 1238044)
Zitat:

Zitat von Volker Z. (Beitrag 1238042)
Hallo,

Zitat:

Zitat von Sir Rufo (Beitrag 1238039)
Zitat:

Zitat von Volker Z. (Beitrag 1238034)
Hallo,

Zitat:

Zitat von AlexII (Beitrag 1238033)
Mache ich doch...((( erkennt etwa SQLite, dass das ein in str umgewandelter int ist und speichert es als int ab?

Japp, und nicht nur SQLite - auch andere auf SQL basierende RDBMS

Gruß

Und auch der Delphi-Code ist nur eine stumpfer Text, sowie Visual Basic, C, C#, .........

:?: Stehe ich da jetzt aufm Schlauch :gruebel::gruebel: oder war danach gefragt?

Gruß

Nein, nicht explizit gefragt, aber vom Grundsatz her vergleichbar

Ja, ne, ist klar, - wenn ich als Südländer mal Anleihen nehmen darf :wink: - im Grunde ist gelesenes, gehörtes, geschriebenes Wort immer stumpfer Text, erst der Compiler u. ä. gibt der Sache Sinn. :-D

Gruß

Perlsau 1. Dez 2013 03:24

AW: In SQLite Integer-Wert schreiben?
 
Mein lieber Volker Z,

die Übergabe von Werten an externe Programme erfolgt im Grunde immer mittels eines Strings. Das ist z.B. auch so, wenn du ein Programm mit Parametern startest: Wenn dein Programm die Parameter auswertet, muß es eventuell erwartete Zahlenwerte erst umwandeln, um sie verwenden zu können. Bei SQL-Strings, die einen SQL-konformen Text zur Manipulation einer SQL-Datenbank beinhalten (sollen), ist das ganz genau so: Zeichenfolgen, die in der Datenbank als Zahlenwerte (Integer, Currency ...) erwartet werden, müssen vom SQL-Parser des DBMS (DatenBankManagementSystem) erst in die entsprechenden Zahlenwerte umgewandelt werden. Um dem DBMS zu vermitteln, ob es sich um einen Zahlenwert oder um eine Zeichenfolge (Name, Vorname ...) handelt, wird das Quoten eingesetzt: In Hochkommas eingeschlossene Zeichenfolgen werden vom SQL-Parser nicht als Zahlenfolgen interpretiert:
Code:
insert into KUNDE
(kundennr, name, vorname, strasse, plz, ort, telefongesch, telefonprivat, email)
values (99, 'Adler', 'Felix', 'Goethestrasse 4', '30453', 'Hannover', '9856023452', '10562382', 'adler@on-line.de');
Wie du hier in der Zeile mit den Values (Werten) siehst, wird hier die Kunden-Nummer nicht als Zeichenfolge übermittelt, sondern als Zahlenwert. Alle anderen Zeichenfolgen sind keine Zahlenwerte und deshalb gequotet, also in Hochkommas eingeschlossen. Für den SQL-Parser deines DBMS ist aber das ganze Ding ein einziger String, eben ein SQL-String, der entsprechend auseinandergenommen wird, um mit den Einzelteilen hier z.B. den neuen Eintrag zu "berechnen". Um in Delphi eine String-Variable mit einem Wert zu belegen (indizieren bzw. zuweisen), muß bereits der komplette String in Hochkommas eingeschlossen werden, damit der Delphi-Compiler – der ja auch einen Parser verwendet, um die im Quelltext stehenden Worte und Zeichen interpretieren zu können, bevor er daraus Maschinencode macht – den String als solchen erkennen kann. Werden nun im String weitere Hochkommas benötigt, kann man das Problem, daß erstmal jedes Hochkomma den String beendet, auf zwei verschiedene Arten lösen:

Delphi-Quellcode:
MySQLString := '99, ''Adler'', ''Felix'', ''Goethestrasse 4'', ''30453'', ''Hannover'',' +
               '''9856023452'', ''10562382'', ''adler@on-line.de''';
Wie du hier leicht erkennen kannst, werden in Delphi, um innerhalb eines Strings ein Hochkomma zu platzieren, zwei hintereinander stehende Hochkommas verwendet. Statt der zahlreichen Hochkommas kannst du aber auch Befehl QuotedStr verwenden:

Delphi-Quellcode:
Const
  K = ',';
begin
  MySQLString := '99' + K +
               QuotedStr('Adler') + K +
               QuotedStr('Felix') + K +
               QuotedStr('Goethestrasse 4') + K +
               QuotedStr('30453') + K +
               QuotedStr('Hannover') + K +
               QuotedStr('9856023452') + K +
               QuotedStr('10562382') + K +
               QuotedStr('adler@on-line.de');
end;
Liegen die benötigten Werte bereits in Variablen vor, z.B. in Editfeldern, kannst du auch hier den Befehl QuotedStr einsetzen:
Delphi-Quellcode:
Const
  K = ',';
begin
  MySQLString := Edit_KdNr.Text + K +
            QuotedStr(Edit_Nachname.Text) + K +
            QuotedStr(Edit_Vorname.Text) + K +
            QuotedStr(Edit_Strasse.Text) + K +
            QuotedStr(Edit_PLZ.Text) + K +
            QuotedStr(Edit_Ort.Text) + K +
            QuotedStr(Edit_TelGesch.Text) + K +
            QuotedStr(Edit_TelPriv.Text) + K +
            QuotedStr(Edit_Email.Text);
end;
So, hoffentlich war das jetzt ein wenig einleuchtend ... :nerd:

Zitat:

Zitat von Volker Z. (Beitrag 1238045)
Ja, ne, ist klar, - wenn ich als Südländer mal Anleihen nehmen darf :wink: - im Grunde ist gelesenes, gehörtes, geschriebenes Wort immer stumpfer Text, erst der Compiler u. ä. gibt der Sache Sinn. :-D

Nein, denn geübte Programmierer können auch ohne Compiler erkennen, ob ein Quelltext Sinn ergibt oder nicht.

himitsu 1. Dez 2013 08:00

AW: In SQLite Integer-Wert schreiben?
 
Vielleicht hab es es auch nur überlesen und es wurde schon erwähnt, aber im Grunde lag hier ein Verständnisproblem vor.

Delphi-Quellcode:
123
ist für SQL ein "Integer" und
Delphi-Quellcode:
"123"
ist ein Text, auch wenn Beides im SQL-Text ein "String" ist.

SQL wollte praktisch den Integer, also ohne die ", aber für den SQL-Text muß deine Integervariable in einen "String" umewandelt werden, denn diesen baust du ja als Text zusammen.
Außer du nutzt parametrisierte Abfragen, wo du deine Variable an den Parameter auch als Interger übergeben könntest.


Und ja, einige SQL-Dialekte besitzen eine automatische Typumwandlung zwischen Zahlen und Texten.
Wobei diese über die Operatoren erkennen, was da zusammengesetzt werden soll.
(z.B.
Delphi-Quellcode:
"123" || 456
ergibt den Text "123465" und
Delphi-Quellcode:
"123" + 456
ergibt 579)

Volker Z. 1. Dez 2013 13:07

AW: In SQLite Integer-Wert schreiben?
 
Hallo Frank,

Zitat:

Zitat von Perlsau (Beitrag 1238046)
Mein lieber Volker Z,

die Übergabe von Werten an externe Programme erfolgt im Grunde immer mittels eines Strings. [...]

Eine schöne und ausführliche Erklärung - nur eben falscher Adressat. Mir ist die Geschichte seit vielen Jahren klar; der TE hatte da wohl ein Verständnisproblem.

Zitat:

Zitat von Perlsau (Beitrag 1238046)
Zitat:

Zitat von Volker Z. (Beitrag 1238045)
Ja, ne, ist klar, - wenn ich als Südländer mal Anleihen nehmen darf :wink: - im Grunde ist gelesenes, gehörtes, geschriebenes Wort immer stumpfer Text, erst der Compiler u. ä. gibt der Sache Sinn. :-D

Nein, denn geübte Programmierer können auch ohne Compiler erkennen, ob ein Quelltext Sinn ergibt oder nicht.

Da kann ich nicht widersprechen. Aber dann ist da vorher der KC (Kopf-Compiler) drüber gerutscht, hat den Code übersetzt und so "Sinn" in die Sache gebracht; so sollte meine Antwort zu verstehen sein - wenn es missverständlich war, dann tut es mir leid.

BTW: Meine Erfahrung und mein KC sagt mir, dass der SQL-Parser Dein drittes Beispiel wohl mit "You have an error in your SQL syntax; check the manual [...]" anmeckern würde (da fehlen ein paar Kommas) :wink:

Gruß

Perlsau 1. Dez 2013 14:29

AW: In SQLite Integer-Wert schreiben?
 
Zitat:

Zitat von Volker Z. (Beitrag 1238094)
Hallo Frank, Eine schöne und ausführliche Erklärung - nur eben falscher Adressat. Mir ist die Geschichte seit vielen Jahren klar; der TE hatte da wohl ein Verständnisproblem.

An diesen war meine ausführliche & schöne Erklärung auch gerichtet, wobei ich freimütig eingestehe, dich für diesen gehalten haben. Ich hoffe, du kannst mir diese Sünde noch einmal vergeben :oops:

Zitat:

Zitat von Volker Z. (Beitrag 1238045)
Da kann ich nicht widersprechen. Aber dann ist da vorher der KC (Kopf-Compiler) drüber gerutscht, hat den Code übersetzt und so "Sinn" in die Sache gebracht; so sollte meine Antwort zu verstehen sein - wenn es missverständlich war, dann tut es mir leid.

Naja, wenn ich Compiler lese, denke ich erstmal nicht an mein Gehirn ... Natürlich sollte jeder Programmierer wissen, wie sein Compiler arbeitet, sonst könnte er keine funktionierenden Programme schreiben. Dieses Wissen ist gleichbedeutend (nicht identisch) mit der Kenntnis der Sprache Delphi.

Zitat:

Zitat von Volker Z. (Beitrag 1238045)
BTW: Meine Erfahrung und mein KC sagt mir, dass der SQL-Parser Dein drittes Beispiel wohl mit "You have an error in your SQL syntax; check the manual [...]" anmeckern würde (da fehlen ein paar Kommas) :wink:

Wo du recht hast: Ich hatte beim Kopieren bzw. Erstellen der zweiten Version das in Konstante K abgelegte Kommazeichen vergessen. Aber ich korrigier's gleich mal, damit andere, die auf meine schöne ausführliche Erläuterung stoßen, nicht unnötig irrgeführt werden. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 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