![]() |
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:
oder
Query.SQL.ParamByName('region').Value/asInteger := CountryRegion;
Delphi-Quellcode:
Query.SQL.Params[0].Value/asInteger := CountryRegion;
Zitat:
|
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:
als separates Query vornehmen.
SELECT last_insert_rowid();
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 |
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.
|
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. |
AW: SQLLite Datensatz hinzufügen, wenn nicht vorhanden
Danke, ja in der Form hab ich das schon von Anfang an gemacht:
Quasi ein:
Code:
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 :)
for i:=0 to 1 do
begin if i=1 then InsertIntoDB; if FindInDB then exit; end; Peter |
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. |
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