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

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    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 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    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 habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    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 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    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 habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    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.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    C'était plutôt la différence de terminaison des noms de ces champs qui m'interrogeait (D et DC). Si ce sont les bons, la raison est ailleurs...

    Cordialement,
    Yves.
    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 !

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut a/s Database schema as Changed - Fin de discussion
    Bonjour,

    Un mot pour signaler que j'ai trouvé une solution à mon problème qui était du, comme "alanglet" l'avait suggéré aux erreurs de syntaxe dans la rédaction de la requête SQL. Les dysfonctionnements signalés par la suite (message de 12H46) étaient imputables à des défauts de paramétrage des diverses propriétés du StringGrid et des containers Zeos et (ZC et ZQ) et data Access associés dont certains étaient mal ou non renseignés car je n'avais pas déroulé les fenêtres qui apparaissent en cascade quand on clique dessus, en particulier pour ce qui est de la propriété Column du DBStringGrid qui fait apparaitre la liste des items puis pour chaque Item ses propriétés et en particulier le champ concerné.
    Je joins à toutes fins utiles mon code actuel :
    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
    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 de la base de données
      DirNomBase := Dir_CreeOuvre.Text ;
      NomBase0 := ED_NomBase.text ;
      DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
      //Connection à la base de données
       F_AcACG.ZC_Affich.Connected := False ;
       F_AcACG.ZC_Affich.Database := Dnombase ;
       F_AcACG.ZC_Affich.Connected := True ;
     // 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
           // Identification des variables à afficher
           NomTable := 'Naissance' ;
           NomCol1 := 'NomEnft' ;
           NomCol2 := 'PrenomEnft' ;
           NomCol3 := 'DtActeN' ;
           AnneeSel := 'AnActN' ;
           // 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.DataSource := F_Naiss.DataNaiss ;
             F_AcACG.ZQ_Affich.SQL.Clear ;
             F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
             F_AcACG.ZQ_Affich.Open ;
     
       end;
       1 :  // Choix d'affichage --> Décès
       Begin
           // Identification des variables à afficher
           NomTable := 'Deces' ;
           NomCol1 := 'NomDCD' ;
           NomCol2 := 'PrenomDCD' ;
           NomCol3 := 'DtActeD';
           AnneeSel := 'AnActDC' ;
           // 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.DataSource := F_Deces.DataDC ;
             F_AcACG.ZQ_Affich.SQL.Clear ;
             F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
             F_AcACG.ZQ_Affich.Open ;
       end;
       2 :  // Choix d'affichage --> Mariages
       Begin
          // Identification des variables à afficher
           Nomtable := 'UnionMar';
           NomCol1 := 'LuiNom' ;
           NomCol2 := 'LuiPrenom' ;
           NomCol3 := 'DtUnion';
           AnneeSel := 'AnActU' ;
          // 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.DataSource := F_Mariage.DataMar ;
             F_AcACG.ZQ_Affich.SQL.Clear ;
             F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
             F_AcACG.ZQ_Affich.Open ;
       end;
      end;
     
    end;
    Je sais bien qu'il est plutôt rustique car des informations redondantes apparaissent aux 3 niveaux proncipaux de subdivision, mais il fonctionne.
    Peut-être essaierais-je de le rendre beaucoup plus élégant un peu plus tard, simplement pour le plaisir.
    Cordialement et merci à ceux qui ce sont intéressés au problème.

    R.O.

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut a/s Database schema as Changed - Fin de discussion
    Bonjour,
    Désolé mais je reviens sur le sujet car je me suis aperçu que j'avais oublié quelques paramétrages obligatoires par code sur le StringGrid et que la structure n'était vraiment pas élégante. Alors je propose le code suivant que j'ai modifié en conséquence, l'objectif étant toujours d'afficher les données de 3 tables différentes dans un même StringGrid:
    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
    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 de la base de données
      DirNomBase := Dir_CreeOuvre.Text ;
      NomBase0 := ED_NomBase.text ;
      DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
      //Connection à la base de données
       F_AcACG.ZC_Affich.Connected := False ;
       F_AcACG.ZC_Affich.Database := Dnombase ;
       F_AcACG.ZC_Affich.Connected := True ;
     // 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
           // Identification des variables à afficher
           NomTable := 'Naissance' ;
           NomCol1 := 'NomEnft' ;
           NomCol2 := 'PrenomEnft' ;
           NomCol3 := 'DtActeN' ;
           AnneeSel := 'AnActN' ;
     
       end;
       1 :  // Choix d'affichage --> Décès
       Begin
           // Identification des variables à afficher
           NomTable := 'Deces' ;
           NomCol1 := 'NomDCD' ;
           NomCol2 := 'PrenomDCD' ;
           NomCol3 := 'DtActeD';
           AnneeSel := 'AnActDC' ;
     
       end;
       2 :  // Choix d'affichage --> Mariages
       Begin
          // Identification des variables à afficher
           Nomtable := 'UnionMar';
           NomCol1 := 'LuiNom' ;
           NomCol2 := 'LuiPrenom' ;
           NomCol3 := 'DtUnion';
           AnneeSel := 'AnActU' ;
     
       end;
       end ;
          // 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
             DBGrid_alpha.columns[0].FieldName := NomCol1 ;
             DBGrid_alpha.Columns[1].FieldName := NomCol2 ;
             DBGrid_alpha.Columns[2].Fieldname := NomCol3 ;
             F_AcACG.ZQ_Affich.Active := False ;
          //   F_AcACG.ZQ_Affich.DataSource :=  quotedStr(ContainData);
             F_AcACG.ZQ_Affich.SQL.Clear ;
             F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
             F_AcACG.ZQ_Affich.Open ;
    end;
    Merci

    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