Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLLite Datensatz hinzufügen, wenn nicht vorhanden (https://www.delphipraxis.net/183420-sqllite-datensatz-hinzufuegen-wenn-nicht-vorhanden.html)

mkinzler 8. Jan 2015 13:42

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Besser Parameter verwenden

Query.SQL.Text := 'INSERT OR REPLACE INTO Countries (Region, Name) VALUES ( :region, :name);';

...

Delphi-Quellcode:
Query.SQL.ParamByName('region').Value/asInteger := CountryRegion;
oder

Delphi-Quellcode:
Query.SQL.Params[0].Value/asInteger := CountryRegion;
Zitat:

Wie kann ich mir die aktualisierte Zeile anzeigen lassen?
Wie meinst Du das? Den wert nach dem Update?

Peter666 8. Jan 2015 13:45

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Danke, genau ich wollte den Geschriebenen bzw. Aktualisierten Wert in der Ausgabe haben. Sonst müsste ich ja ein
Code:
SELECT last_insert_rowid();
als separates Query vornehmen.
Am liebsten wäre mir, wenn ich das INSERT OR REPLACE durch ein INSERT ersetzen könnte. In dem Fall bekomme ich aber ja nicht den last_insert_rowid() geliefert, sofern der Eintrag schon vorhanden ist.

Peter

mkinzler 8. Jan 2015 13:49

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Da SQLite kein RETURNING kennt ( wie z.B. FireBird), wirst Du den Datensatz neu Laden müsssen.

Sir Rufo 8. Jan 2015 14:00

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Ich würde mir das Leben nicht so schwer machen. Das Beispiel ist zwar für FireDAC, das Konzept sollte sich aber problemlos auf alle anderen DB-Frameworks umsetzen lassen.
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client;

const
  SQL_QUERY_MAX = 1;
  SQL_QUERY: array [0 .. SQL_QUERY_MAX] of string = (
    {0} 'SELECT id FROM foo WHERE val=:val',
    {1} 'INSERT INTO foo (val) VALUES(:val)' );

type
  TDataModule1 = class( TDataModule )
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
  private
    FQueries: array [0 .. SQL_QUERY_MAX] of TFDQuery;
    function GetQuery( const Index: Integer ): TFDQuery;
  protected
    property FooGetQuery: TFDQuery index 0 read GetQuery;
    property FooAddQuery: TFDQuery index 1 read GetQuery;
  public
    function GetFooId( const Val: string ): Integer;
    function AddFoo( const Val: string ): Integer;
    function GetFooIdOrAdd( const Val: string ): Integer;
  end;

var
  DataModule1: TDataModule1;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}
{ TDataModule1 }

function TDataModule1.AddFoo( const Val: string ): Integer;
var
  LQry: TFDQuery;
begin
  LQry := FooAddQuery;
  LQry.ParamByName( 'val' ).Value := Val;
  LQry.ExecSQL;
  Result := LQry.Connection.GetLastAutoGenValue( 'id' );
end;

function TDataModule1.GetFooId( const Val: string ): Integer;
var
  LQry: TFDQuery;
begin
  LQry := FooGetQuery;
  LQry.ParamByName( 'val' ).Value := Val;
  LQry.Open;
  try
    if LQry.Eof
    then
      Result := 0
    else
      Result := LQry.Fields[0].Value;
  finally
    LQry.Close;
  end;
end;

function TDataModule1.GetFooIdOrAdd( const Val: string ): Integer;
begin
  Result := GetFooId( Val );
  if Result = 0
  then
    Result := AddFoo( Val );
end;

function TDataModule1.GetQuery( const Index: Integer ): TFDQuery;
begin
  if FQueries[index] = nil
  then
    begin
      Result := TFDQuery.Create( Self );
      Result.Connection := FDConnection1;
      Result.SQL.Text := SQL_QUERY[index];
      FQueries[Index] := Result;
    end
  else
    Result := FQueries[Index];
end;

end.

Peter666 8. Jan 2015 21:11

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Danke, ja in der Form hab ich das schon von Anfang an gemacht:

Quasi ein:

Code:
for i:=0 to 1 do
begin
 if i=1 then
  InsertIntoDB;
 if FindInDB then exit;
end;
Das Problem ist halt das das quälend langsam ist. Nun ist es eigentlich egal und ich hab mich schon gefragt, ob man nicht das ganze mit weniger Abfragen realisieren kann. Trotzdem vielen Dank für die schnelle Hilfe :)

Peter

Sir Rufo 8. Jan 2015 22:29

AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
 
Dann probier meine Variante einmal aus und du wirst eine Verbesserung der Performance feststellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz