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

Lazarus Pascal Discussion :

SQL - Erreur "database schema has changed" [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut SQL - Erreur "database schema has changed"
    Bonjour à tous,

    Je retourne sur le forum après une petite année de silence. En effet, dans le but de compléter les fonctionnalités d'un logiciel de saisie de données généalogiques que j'avais conçu l'an passé, j'ai eu l'idée de vérifier les tables (SQLite 3) générées par ce logiciel, j'ai eu l'idée de faire afficher dans un "StringGrid" une liste simplifiée (Nom, Prénom, date de l'acte) pour chacune des 3 tables générées. Pour cela j'ai construit un mécanisme de sélection des infos à afficher (choox de la table par un groupe "boutons radio" et choix de l'année à vérifier par un "Tedit" et affichage par ordre alphabétique selon le nom des entrées effectuées, le tout avec lancement de la procédure par Click sur un bouton décdié. Ceci correspond au code suivant :
    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
    procedure TF_AcACG.Bt_AffichAnClick(Sender: TObject);
    Var ChoixAn, Nomtable, SQLSelaffich : String ;
    Var NomCol1, NomCol2, NomCol3, AnneeSel : String ;
    Var DirNomBase, Nombase0, DnomBase : String ;
    Var ChoixTable : Integer ;
    begin
     // Choix du type d'entrées à afficher
      ChoixAn := Ed_SelAn.text ;
      ChoixTable := Integer(RG_ChoixVerif.ItemIndex);
      Case ChoixTable of
       0 :  // Choix d'affichage --> Naissances
           Begin
           NomTable := 'Naissance' ;
           NomCol1 := 'NomEnft' ;
           NomCol2 := 'PrenomEnft' ;
           NomCol3 := 'DtActeN' ;
           AnneeSel := 'AnActN' ;
     
           end;
       1 :  // Choix d'affichage --> Décès
       Begin
           NomTable := 'Deces' ;
           NomCol1 := 'NomDCD' ;
           NomCol2 := 'PrenomDCD' ;
           NomCol3 := 'DtActeD';
           AnneeSel := 'AnActDC' ;
     
       end;
       2 :  // Choix d'affichage --> Mariages
       Begin
           Nomtable := 'UnionMar';
           NomCol1 := 'LuiNom' ;
           NomCol2 := 'LuiPrenom' ;
           NomCol3 := 'DtUnion';
           AnneeSel := 'AnActU' ;
     
       end;
      end;
      //Connection à la base de données
      DirNomBase := Dir_CreeOuvre.Text ;
      NomBase0 := ED_NomBase.text ;
      DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
       F_AcACG.ZC_Affich.Connected := False ;
       F_AcACG.ZC_Affich.Database := Dnombase ;
       F_AcACG.ZC_Affich.Connected := True ;
    // Requête SQL de sélection des infos à afficher
       SQLSelAffich := 'Select ' + NomCol1 + ','+  NomCol2 + ',' + NomCol3 + 'From '+ NomTable ;
       SQLSelAffich := SQLSelaffich + 'Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
       SQLSelAffich := SQLSelAffich + ' Order by ' +   NomCol1 ;
    // Exécution de la requête SQL et affichage dans un StringGrid
        F_AcACG.ZQ_Affich.Active := False ;
        F_AcACG.ZQ_Affich.SQL.Clear ;
        F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
        F_AcACG.ZQ_Affich.Open ;
    end;
    Ce code semble fonctionner correctement (aucune erreur à la compilation et lancement correct) mais après que le logicile ait tourné 2 ou 3 secondes un message s'affiche : "SQL Error - Database Schema has changed"
    Quelqu'un a t-il une idée de ce que signifie ce message et comment y remédier

    Merci

    R.O.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Pas d'idée sur le message, mais je pense que dans la requête il manque un espace de séparation devant From et Where.

    André

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    L'aide en ligne de SQLite nous dit ici :
    (17) SQLITE_SCHEMA
    The SQLITE_SCHEMA result code indicates that the database schema has changed. This result code can be returned from sqlite3_step() for a prepared statement that was generated using sqlite3_prepare() or sqlite3_prepare16(). If the database schema was changed by some other process in between the time that the statement was prepared and the time the statement was run, this error can result.

    If a prepared statement is generated from sqlite3_prepare_v2() then the statement is automatically re-prepared if the schema changes, up to SQLITE_MAX_SCHEMA_RETRY times (default: 50). The sqlite3_step() interface will only return SQLITE_SCHEMA back to the application if the failure persists after these many retries.
    Donc, hormis la piste repérée par alanglet à tester, n'y aurait-il pas une requête intercurrente ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Alanglet et Tourlourou - a/s vos propositions
    Bonjour,
    Merci de vous intéresser à mon problème.
    Effectivement je n'avais pas vu les erreurs sur la rédaction de la requête SQL avec From et Where alors que j'y avais fait attention pour le "Order by". J'ai corrigé et il semble que cela change quelque chose car je n'ai plus le message " Database schema as changed " mais une erreur correspondant à une mauvaise lecture de la table concernée avec un message "Field not found "NomduChamp". J'avais déjà eu ce genre de message lors de mes précédentes confrontations avec SQLITE et LAZARUS mais, n'étant qu'un amateur occasionnel j'ai oublié qu'elle en était la cause et comment j'avais résolu le problème.
    Mais voyons le "verre à moitié plein" et considérons que le problème à trouvé un début de solution... il reste à trouver la suite et si vous avez une suggestion.
    Merci

    R.O.

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    NomCol3 := 'DtActeD'; mais AnneeSel := 'AnActDC' ;

    On peut aussi mettre des espaces avant et après les virgules séparant les champs, pour faciliter la lecture de la chaîne.

    Sinon, as-tu l'erreur systématiquement pour le même champ, ou pour plusieurs, ou aléatoirement ?

    Peux-tu copier le SQL erroné et le coller dans un SQL Manager quelconque pour tester la requête ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut a/s DtActD et AnActeDC
    Bonjour,

    La différence entre ces deux noms est normale car dans le premier cas il s'agit d'une chaine de caractères reproduisant une date au format JJ/MM/AAAA et dans le second cas d'une chaine de caractères (extraite de la première) figurant l'année : AAAA . Je procède ainsi et non pas pas avec des formats "date" car bon nombre des dates sont antérieures au /01/01/1900 ce qui était (est ?) mal géré par Windows pour des comparaisons directes entre date. J'ai ensuite écrit une fonction pour transformer les dates en nombres décimaux et, lorsque je veux faire des tests de comparaisons entre dates je compare les valeurs des nombres ainsi obtenus (exemple 12/03/1624 devient : 1624.0312) .
    Je reprendrai un peu plus tard l'analyse de ce qui ne colle pas dans ma gestion du StringGrid.
    Cordialement

    R.O.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/12/2007, 16h57
  2. [sql] erreur de syntaxe
    Par cmoa59 dans le forum JDBC
    Réponses: 14
    Dernier message: 03/05/2005, 11h41
  3. PHP SQL =>erreur de syntaxe (operateur absent)
    Par snipes dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 14h09
  4. [ASP][SQL]Erreur lors d'un select
    Par DEC dans le forum ASP
    Réponses: 12
    Dernier message: 08/06/2004, 17h54
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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