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

SQLite Discussion :

Récupérer correctement un Int64


Sujet :

SQLite

  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut Récupérer correctement un Int64
    Bonjour.
    Pour des raisons de rapidité d insertion et de calculs j insère le contenu d un fichier csv de 5 millions de lignes avec un champ LaDate que je formate en un int64 : 20250130143300 pour le 30/01/2025 14:33:00.

    Mais quand je fais une requete simple sur ce champ 'LaDate', le résultat est systématiquement : -643800239

    ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LaDate FROM Tb_Ticks WHERE LaDate > 20250130143300 limit 1
    Ma question est donc simple, comment récuperer ce type de données.

    Pour info ma base est crée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE IF NOT EXISTS Tb_Ticks ( id INTEGER PRIMARY KEY AUTOINCREMENT, LaDate INTEGER, Last REAL, Bid REAL, Ask REAL);
    J utilise Delphi / Firedac

    Merci pour votre aide et vos conseils.

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 446
    Par défaut
    Bonjour,

    Comme ça à première vue tu récupères uniquement les 32 bits de poids faible. Donc à voir sur FIREDAC comment utiliser 64 bits parce que sur SQLITE un entier peut bien avoir 64 bits.
    Pourquoi ta date est elle en entier? Est ce que c'est une date UNIX Timestamp (en secondes depuis le 01/01/1970) ou autre chose (par exemple Pour Thunderbird c'est un UNIX timestamp multiplié par 1000 (en ms))?
    Il y a d'autres moyen de stocker une date dans SQLITE (en texte ou en date Julienne) avec des conversions pour DELPHI.
    Si tu utilises DELPHI pourquoi ne pas stocker ta date comme DATETIME Delphi (Tu n'auras pas de conversion et comme c'est un réel ce devrait aussi être facile à gérer.

    Cordialement

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 416
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    C'est plus un problème Firedac que SQLite.

    Le moyen simple, utiliser le traitement des commandes de Firedac
    indiquer "nom d'alias::le type voulu"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LaDate "ladate::INT64" FROM Tb_Ticks WHERE LaDate > 20250130143300 limit 1
    Moyen un peu plus complexe, utiliser des régles de mappage
    propriétés FormatOptions.MapRules
    Nom : Capture.png
Affichages : 37
Taille : 22,6 Ko
    et bien stipuler FormatOptions.OwnMapRules=True

    Perso, je vote pour la première solution, mais j'utiliserai plutôt un type DATETIME pour ce qui est de la structure de la table.
    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

  4. #4
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut
    @SergioMaster : Merci, c est parfait, tout fonctionne.

    Effectivement le format choisi pour la date est particulier mais c est le résultat le plus rapide en terme de temps de conversion et d insertion entre les différents formats de dates des différents csv.
    Je mets en Bdd un fichier qui pour une semaine compte plus de 5 millions de lignes en 1 minutes 30. L insertion la plus rapide avec des formats plus traditionnels prend au moins 1 minute supplémentaire

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 416
    Billets dans le blog
    65
    Par défaut
    As-tu pensé au TFDBatchmove pour cette opération ?
    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

  6. #6
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut
    Non effectivement pke je pensais que ce n etait que pour mysql

    J ai donc cherché et suis tombé sur une vidéo explicative sur la page https://blogs.embarcadero.com/this-i...using-firedac/
    Le pb est que cette vidéo ne dure que 30 secondes !!!

    Donc j ai bien compris qu il fallait placer un TFDConnection et un TBatchmouve mais apres... Quel "reader", quel "writer"...
    Donc si tu pouvais m éclairer de tes lumières ou un lien vers un tuto.

    Je précise que j ai suivi vos conseils et mes fichiers csv sont désormais leur date au format compatible avec SQLIte afin d aviter toute manip inutile et gagner en temps. Je sais j aurais du y penser avant...

    Merci pour ton aide...

    EDIT :

    Finalement j ai trouvé un exemple mais je ne peux afficher que le code, la faute à fMainCompBase.pas manquant donc je ne peux pas explorer les composants FDquery par exemple
    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
    // Create text reader and set FDBatchMode as owner. Then
      // FDBatchMove will automatically manage the reader instance.
      with TFDBatchMoveTextReader.Create(FDBatchMove) do begin
        // Set text data file name
        FileName := ExtractFilePath(Application.ExeName) + 'Data.txt';
        // Setup file format
        DataDef.Separator := ';';
        DataDef.WithFieldNames := True;
      end;
      // Create dataset writer and set FDBatchMode as owner. Then
      // FDBatchMove will automatically manage the writer instance.
      with TFDBatchMoveDataSetWriter.Create(FDBatchMove) do begin
        // Set destination dataset
        DataSet := qryLoaded;
        // Do not set Optimise to True, if dataset is attached to UI
        Optimise := False;
      end;
      // Analyze source text file structure
      FDBatchMove.GuessFormat;
      FDBatchMove.Execute;
     
      // show data in dbgrid
      qryLoaded.Open;
    je ne sais pas à quoi correspond qryLoaded et DataSet

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 416
    Billets dans le blog
    65
    Par défaut
    Bon, cela déborde un peu/beaucoup du forum SQLite
    Reader : ce sera un textreader, normal pour lire le fichier texte
    writer : un SQLWriter connecté à un FDConnection
    Quelque chose comme ça
    Nom : Capture.png
Affichages : 19
Taille : 11,5 Ko

    Pour ce qui est des tutos ou liens il faudra que je cherche mais je suis sur d'avoir posté des trucs dans le forum Delphi par exemple https://www.developpez.net/forums/d2...n-fdbatchmove/
    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

  8. #8
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut
    Merci pour ta réponse.
    J ai cherché un complement au tuto de mon edit et j ai trouvé ça : https://gdksoftware.com/knowledgebas...edac-batchmove

    Si je comprends bien le writer est associé à un dataset qui est un FDQuery qui a pour texte la requete d insertion. Et le Batcmove se charge de faire le lien apres la lecture d une ligne via le reader, il la transmet au writer qui execute la requete du dataset qui ecrit dans la bdd ...

    Mon pb est que je ne sais pas comment formuler cette requete.

    J ai dans mon reader définit les champs LaDateX, OpenX, HighX, LowX, CloseX, mis le separateur sur ";"



    La structure de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'id INTEGER PRIMARY KEY AUTOINCREMENT, LaDate STRING, Open REAL, High REAL, Low REAL, Close REAL
    dans mon query le texte de la requete ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Tb_Ticks (LaDate, Open,High,Low,Close) VALUES (LaDateX, OpenX, HighX, LowX, CloseX)
    Je suppose qu ici il faut mettre dans la partie VALUES le nom des champs definis dans le reader ?

    Et cela ne fonctionne pas ... Je n ai pas de colonne LaDateX...

    Pourquoi Colonne alors que le nom de la colonne est definit dans la premiere partie de la requete, je ne comprends pas !!!

    Merci

  9. #9
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut
    J avance:
    la requete visiblement correcte est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Tb_Ticks (LaDate, Open,High,Low,Close) VALUES (:LaDateX, :OpenX, :HighX, :LowX, :CloseX)
    Mais j ai une erreur alors même que dans le reader j ai defini le champs :LaDateX en string :

    Nom : Sans titre.png
Affichages : 20
Taille : 12,9 Ko

    Comment corriger cela ?

  10. #10
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 97
    Par défaut
    Bon je renonce.

    J ai solutionné mon pb autrement, je formate les fichiers que j exporte avec des virgules ce qui me permet d inserer la ligne directement dans la table sans conversion...
    Meri

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

Discussions similaires

  1. Faites des messages corrects !!!
    Par Alacazam dans le forum C++
    Réponses: 6
    Dernier message: 23/03/2006, 16h56
  2. savoir si outlook s'est fermé correctement
    Par iubito dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 07/11/2003, 09h41
  3. [IB71] mon Blob ne marche pas correctement
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 2
    Dernier message: 17/09/2003, 15h03

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