AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLLite Datensatz hinzufügen, wenn nicht vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

SQLLite Datensatz hinzufügen, wenn nicht vorhanden

Ein Thema von Peter666 · begonnen am 8. Jan 2015 · letzter Beitrag vom 8. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 11:20
Datenbank: SQLite • Version: 3 • Zugriff über: TSQLConnection
Hi,

ich wollte gerne mit so wenig wie möglichem Aufwand in folgende Datenbank:

Code:
CREATE TABLE [Cities] (
[ID] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[Province] INTEGER NOT NULL,
[Name] VARCHAR(256) NOT NULL,
[Latitude] FLOAT NULL,
[Longitude] FLOAT NULL
);

CREATE TABLE [Countries] (
[ID] INTEGER NOT NULL PRIMARY KEY,
[Region] INTEGER NOT NULL,
[Name] VARCHAR(256) NOT NULL
);

CREATE TABLE [Location] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[City] INTEGER NOT NULL,
[Radio] INTEGER NOT NULL,
[Frequency] FLOAT NULL,
[Band] INTEGER NULL
);

CREATE TABLE [Province] (
[ID] INTEGER NOT NULL PRIMARY KEY,
[Country] INTEGER NOT NULL,
[Name] VARCHAR(256) NOT NULL
);

CREATE TABLE [Stations] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[Genre] INTEGER NULL,
[Name] VARCHAR(256) NOT NULL,
[URL] VARCHAR(256) NOT NULL,
[Logo] VARCHAR(256) NULL
);
meine Datensätze einfügen und wenn möglich mittels einer einzigen bzw. so wenig wie möglichen SQL Anweisung(en). Dabei sollen keine Dupletten auftreten.

Delphi-Quellcode:
procedure AddToDatabase(const CountryRegion: Integer;
      const CountryName: String; const ProvinceName: String;
      const CityName: String; const CityLatitude,CityLongitude: Single;
      const RadioName, RadioUrl, RadioLogoUrl: String;
      const RadioGenre: Integer; const RadioBand: Integer;
      const RadioFrequency: Single);
Bis jetzt habe ich immer erst eine SQL Abfrage gemacht ob der Name des Landes in dem Datensatz ist, wenn nicht dann geschrieben. Die ID habe ich genommen und bin in die Cities Tabelle gegangen, hab das selbe mit dem Stadteintrag gemacht, dann in der Stations hinzugefügt und zuletzt den Eintrag in Location. Das sind mir aber ein bisschen zu viele Einträge, deswegen würde ich das mit so wenig wie möglich Abfragen realisieren. Hat jemand eine Idee, wie die Abfrage dafür aussehen kann? Das letzte mal das ich mit SQL gearbeitet habe ist etwas her und damals hab ich die Queries einfach in Office erstellt und in Delphi eingefügt.

Geändert von Peter666 ( 8. Jan 2015 um 11:39 Uhr)
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#2

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 11:35
Ist aber sehr umständlich... UNIQUE übernimmt dir die Arbeit. Damit wird der Wert nur ein Mal gespeichert!

Delphi-Quellcode:
CREATE TABLE [tbland] (
  [id_land] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
  [land] TEXT NOT NULL UNIQUE)
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!

Geändert von AlexII ( 8. Jan 2015 um 11:37 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 12:15
Hallo,

vielleicht hilft Dir upsert oder insert or replace weiter.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 12:26
Ein INSERT OR REPLACE ist immer mit Vorsicht zu genießen, denn bei einem REPLACE wird die alte Zeile gelöscht und mit den übergebenen Daten wieder eingefügt.

Da könnte es besser sein ein ON CONFLICT IGNORE zu verwenden. Allerdings verbergen sich auch hier Fallstricke. Bei MySQL (ON DUPLICATE KEY UPDATE) wird z.B. trotz Update der AutoInc-Wert erhöht.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#5

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 12:59
Danke, ich hab die Einträge wie folgt geändert:

Code:
CREATE TABLE [Cities] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[Province] INTEGER NOT NULL,
[Name] VARCHAR(256) UNIQUE NOT NULL,
[Latitude] FLOAT NULL,
[Longitude] FLOAT NULL
);

CREATE TABLE [Countries] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[Region] INTEGER NOT NULL,
[Name] VARCHAR(256) UNIQUE NOT NULL
);

CREATE TABLE [Location] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[City] INTEGER NOT NULL,
[Radio] INTEGER UNIQUE NOT NULL,
[Frequency] FLOAT NULL,
[Band] INTEGER NULL
);

CREATE TABLE [Province] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[Country] INTEGER NOT NULL,
[Name] VARCHAR(256) UNIQUE NOT NULL
);

CREATE TABLE [Stations] (
[ID] INTEGER PRIMARY KEY NOT NULL,
[Genre] INTEGER NULL,
[Name] VARCHAR(256) NOT NULL,
[URL] VARCHAR(256) UNIQUE NOT NULL,
[Logo] VARCHAR(256) NULL
);
Bei Stations habe ich nur die URL als Unique eingetragen, da in diversen Regionen die Sendernamen mitunter gleich sind.
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 13:09
Dann würde ich noch folgendes machen, das ganze in die try except setzen:

Delphi-Quellcode:
  try
    // hier die ganzen SQL Abfragen
  except
    on E: Exception do MessageDlg('Fehler! Die Abfrage konnte nicht durchgeführt werden!'
    + sLineBreak + sLineBreak + E.ClassName + sLineBreak + E.Message, mtError, [mbOk], 0);
  end;
In der "E.Message" wird angezeigt was schief gelaufen ist. Falls ein vorhandener Eintrag hinzugefügt wird, wird in der "E.Message" die Meldung stehen, dass der Wert bereits vorhanden ist.
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 13:13
@AlexII

Erklär doch bitte mal was passiert, wenn du das try except nicht verwendest und eine Exception auftritt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#8

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 13:18
@AlexII

Erklär doch bitte mal was passiert, wenn du das try except nicht verwendest und eine Exception auftritt.
Es wird ein Fehler angezeigt, das auf jeden Fall denke ich, aber ich weiß nicht was das für eine Fehlermeldung sein wird. Irgendwas mit "DB error" oder so, womit man nichts anfangen kann. Oder irre ich mich?

Werde ich aber testen!
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 13:25
@AlexII

Erklär doch bitte mal was passiert, wenn du das try except nicht verwendest und eine Exception auftritt.
Es wird ein Fehler angezeigt, das auf jeden Fall denke ich, aber ich weiß nicht was das für eine Fehlermeldung sein wird. Irgendwas mit "DB error" oder so, womit man nichts anfangen kann. Oder irre ich mich?
Da kommt also ein Dialog mit einer Fehlermeldung und die Verarbeitung wird abgebrochen.
Mit deiner Variante kommt ein Dialog mit einer angepassten Fehlermeldung und die Verarbeitung wird hinter dem try except Block fortgesetzt!

Um Fehlermeldungen umzubenennen, bzw. benutzerfreundlich zu formulieren nimmt man
Delphi-Quellcode:
try

except
  on E: Exception do
    raise Exception.Create( 'Hier ist was falsch' );
end;
Wobei es sinnvoll ist nur auf spezielle Exceptions so zu reagieren und andere einfach durchlaufen zu lassen.

Das mal durchlesen: http://docwiki.embarcadero.com/RADSt.../de/Exceptions
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#10

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden

  Alt 8. Jan 2015, 13:34
Mit der Unique Eigenschaft vereinfacht sich das ganze.

So kann ich z.B. folgendes machen:
Delphi-Quellcode:
with Query.SQL do
  begin
   Add('INSERT OR REPLACE INTO Countries (Region, Name)');
   Add(format('VALUES (%d,"%s");',[Integer(CountryRegion),CountryName]));
  end;
Wie kann ich mir die aktualisierte Zeile anzeigen lassen?

Peter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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