IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

SQLite Erreur sur mise à jour par UPDATE


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut SQLite Erreur sur mise à jour par UPDATE
    Bonjour,

    J'utilise une base de données local SQLite (avec un TFDLocalSQL et un TFDMemTable qui représente ma table).

    J'insère une enregistrement dans mon TFDMemTable par la méthode APPEND.
    Je fait des requêtes SQL de sélection et je retrouve bien mes données.

    Par contre si je veux modifier les données du TFDMemTable par une requête UPDATE, j'ai le message suivant: "[FireDAC][Phys][SQLite] ERROR: VTab: Specified row does not exist".

    Il me semble que je peux faire des modifications par requêtages, je me trompe ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    quel est la requête ?

    Petite précision, vous n'utiliser pas une base SQLite si vous utilisez un FDMemTable , mais juste le moteur. Je pense qu'il y a un manque de précision quelque part.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    Effectivement, j'ai fait un gros raccourcis.

    Le TFDMemTable est configuré à partir d'un fichier xml, qui définit les différentes colonnes ainsi que leur type.
    J'ajoute un enregistrement par la méthode TFDMemTable.APPEND et je valide par TFDMemTable.POST.

    La requête SQL de sélection est classique "SELECT * FROM matable WHERE champ1 = :value1". Elle me retourne bien un enregistrement avec les valeurs définies auparavant.
    Je n'ai pas essayé de faire d'insert.

    La requête SQL de mise à jour est du type "UPDATE matable SET champ2 = :value2 WHERE champ1 = :value1".
    J'ai fais différents essais sans utiliser de paramètres, mais j'ai toujours la même erreur.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    donc rien à voir avec le SGBD SQlite mais plus une utilisation de requête SQL sur une table en mémoire.

    J'avoue utiliser très peu le localSQL de Firedac mais, je suis curieux, je vais faire des essais et relire un peu la bible de Cary Jensen

    [Edit] quelques essais simples plus tard, je ne détecte pas de problème voici le code que j'ai mis en place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    unit UnitfdlocalSQL;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
      FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
      FireDAC.DApt.Intf, Data.DB, FireDAC.UI.Intf, FireDAC.Stan.Def,
      FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.SQLite,
      FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, FireDAC.VCLUI.Wait,
      Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, FireDAC.Comp.Client,
      FireDAC.Phys.SQLiteVDataSet, FireDAC.Comp.DataSet, FireDAC.DApt;
     
    type
      TForm47 = class(TForm)
        TempTable: TFDMemTable;
        FDLocalSQL1: TFDLocalSQL;
        FDConnection1: TFDConnection;
        TempTableFDMemTable1Id: TIntegerField;
        TempTableFDMemTable1Nom: TStringField;
        TempTableFDMemTable1Date: TDateField;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        btnInsert: TButton;
        FDQuery1: TFDQuery;
        btnUpdate: TButton;
        procedure btnInsertClick(Sender: TObject);
        procedure btnUpdateClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form47: TForm47;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm47.btnInsertClick(Sender: TObject); // remplissage
    var
      I: Integer;
    begin
    for I := 1 to 10 do
      FDQuery1.ExecSQL('INSERT INTO temptable(fdmemtable1ID,fdmemtable1NOM) VALUES (:i,:a)',[i,'Aaaa']);
    end;
     
    procedure TForm47.btnUpdateClick(Sender: TObject);  // mise àjour des 5 premiers 
    var i : integer;
    begin
    for I := 1 to 5 do
      FDQuery1.ExecSQL('UPDATE temptable SET fdmemtable1NOM=:n, '+
                       'fdmemtable1date=:d  where fdmemtable1ID=:i',['BB',date,i]);
    end;
     
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    object Form47: TForm47
      Left = 0
      Top = 0
      Caption = 'Form47'
      ClientHeight = 496
      ClientWidth = 555
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object DBGrid1: TDBGrid
        Left = 32
        Top = 176
        Width = 473
        Height = 192
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'Tahoma'
        TitleFont.Style = []
      end
      object btnInsert: TButton
        Left = 32
        Top = 40
        Width = 75
        Height = 25
        Caption = 'Insert'
        TabOrder = 1
        OnClick = btnInsertClick
      end
      object btnUpdate: TButton
        Left = 32
        Top = 80
        Width = 75
        Height = 25
        Caption = 'Update'
        TabOrder = 2
        OnClick = btnUpdateClick
      end
      object TempTable: TFDMemTable
        Active = True
        FieldDefs = <
          item
            Name = 'FDMemTable1Id'
            DataType = ftInteger
          end
          item
            Name = 'FDMemTable1Nom'
            DataType = ftString
            Size = 20
          end
          item
            Name = 'FDMemTable1Date'
            DataType = ftDate
          end>
        IndexDefs = <>
        FetchOptions.AssignedValues = [evMode]
        FetchOptions.Mode = fmAll
        ResourceOptions.AssignedValues = [rvSilentMode]
        ResourceOptions.SilentMode = True
        UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
        UpdateOptions.CheckRequired = False
        UpdateOptions.AutoCommitUpdates = True
        LocalSQL = FDLocalSQL1
        StoreDefs = True
        Left = 336
        Top = 32
        object TempTableFDMemTable1Id: TIntegerField
          FieldName = 'FDMemTable1Id'
        end
        object TempTableFDMemTable1Nom: TStringField
          FieldName = 'FDMemTable1Nom'
        end
        object TempTableFDMemTable1Date: TDateField
          FieldName = 'FDMemTable1Date'
        end
      end
      object FDLocalSQL1: TFDLocalSQL
        Connection = FDConnection1
        Active = True
        DataSets = <>
        Left = 344
        Top = 112
      end
      object FDConnection1: TFDConnection
        Params.Strings = (
          'DriverID=SQLite')
        Connected = True
        Left = 456
        Top = 112
      end
      object DataSource1: TDataSource
        DataSet = TempTable
        Left = 256
        Top = 24
      end
      object FDQuery1: TFDQuery
        LocalSQL = FDLocalSQL1
        Connection = FDConnection1
        SQL.Strings = (
          'SELECT * FROM temptable')
        Left = 424
        Top = 56
      end
    end
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    Merci pour ta réponse.
    Je créé tout en runtime, je vais vérifier que ce n'est pas la définition de la structure de TFDMemTable par un fichier Xml qui pose un problème.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Points : 70
    Points
    70
    Par défaut
    J'ai trouvé.

    J'ai besoin d'un champ CLOB et dans mon fichier xml qui contient la structure du composant TFDMemTable, j'avais mis DataType="HMemo".
    Après chargement de la structure, le champ est initialisé à TftORACLOB.

    Etrangement, l'insertion se passe sans problème, mais la modification, bien qu'elle ne porte pas sur ce champ plante.
    J'ai corrigé le fichier xml en utilisant WideString. Et là ça fonctionne correctement.

  7. #7
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Le TFDLocalSQL est-il rattaché à un TFDConnexion utilisant le driver SQLite (sans spécifier autre chose que le driver) ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Listbox, message d'erreur sur mise à jour
    Par GuyDuLac dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/11/2013, 19h33
  2. Erreur sur mise à jour en cycle GAP
    Par mutsum1 dans le forum AS/400
    Réponses: 5
    Dernier message: 22/08/2008, 10h59
  3. Message erreur sur Mise à jour formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 06/10/2006, 08h52
  4. Erreur sur mise à jour
    Par Smint dans le forum Access
    Réponses: 10
    Dernier message: 01/07/2006, 15h29
  5. [Conception] erreur de mise à jour UPDATE
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/06/2006, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo