[R] SQLite : nombre de colonnes ou tester exist. d'un champ

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] SQLite : nombre de colonnes ou tester exist. d'un champ

#1

Message par aulus »

Bonjour,

Modifiant la structure d'une base SQLite dans la prochaine mouture de mon programme autoit (ajout de champs à la base), je souhaiterais que mon programme s'ouvre sur un test décelant le nombre de champs de la base présente sur le disque dur de l'utilisateur, afin de le comparer au nombre de champs de la nouvelle base. Si nombre de champs = tant alors on continue, sinon reconstruction de la base selon la nouvelle structure. Un test sur l'existence d'un champ ajouté pourrait aussi faire l'affaire.

J'ai essayé ces codes trouvés sur internet :

Code : Tout sélectionner

 _SQLite_Exec($Ma_Base_SQLite, "SELECT count * FROM information_schema.columns WHERE table_name = Ma_Table';")
ou :
 _SQLite_Exec($Ma_Base_SQLite, "select * from sysobjects where name 'Ma_Table';")
ou :
 _SQLite_Exec($Ma_Base_SQLite, "PRAGMA table_info('Ma_Table');")
 
Est-ce que l'un ou l'autre de ces codes conviendrait ? Et, si oui, comment récupère-t-on le résultat ?

Je vous remercie de m'éclairer.
Modifié en dernier par aulus le dim. 09 mars 2014 14:07, modifié 1 fois.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] SQLite : nombre de colonnes ou tester exist. d'un c

#2

Message par aulus »

J'ai éludé le problème ainsi :

Code : Tout sélectionner

_SQLite_Query($Ma_Base_SQLite, "SELECT Dernier_Champ_ajoute FROM Ma_Table", $hQuery)
If @error Then  FileDelete($fichier)
 
Toutefois, je reste intéressé par le code qui permettrait de compter le nombre de champs d'une base.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] SQLite : nombre de colonnes ou tester exist. d'un c

#3

Message par mikell »

Tu peux essayer ça pour un check des noms de colonnes d'une table
(noms de base et de table à adapter dans le script)
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] SQLite : nombre de colonnes ou tester exist. d'un c

#4

Message par aulus »

Un UBound($names) suivant la première fonction me donne bien le nombre de champs de la table.

Merci Mikell pour cette solution simple à utiliser et efficace.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] SQLite : nombre de colonnes ou tester exist. d'un ch

#5

Message par mikell »

Pour avoir juste le nombre de colonnes, on peut aussi se faire une version simplifiée de _SQLite_FetchNames
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] SQLite : nombre de colonnes ou tester exist. d'un ch

#6

Message par jchd »

Le plus adapté est d'utilser
pragma user_version [= integer]
pour déclarer ou tester la version du schéma.

pragma schema_version est utilisé par SQLite et incrémenté à chaque changement.

Sinon voir aussi la doc pour
pragma table_info(matable)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] SQLite : nombre de colonnes ou tester exist. d'un ch

#7

Message par aulus »

Merci Mikell pour cette seconde solution.
Merci jchd pour le conseil. Toutefois je ne suis pas assez instruit en SQLite pour comprendre et utiliser cette alternative.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] SQLite : nombre de colonnes ou tester exist. d'un ch

#8

Message par jchd »

Code : Tout sélectionner

#include <array.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>

_SQLite_Startup ()
Local $hDB = _SQLite_Open(@ScriptDir & "\db.sqlite")
_SQLite_Exec($hDB, "create table if not exists ma_table (id integer primary key, val1 char, val2 integer)")
; check nombre de colonnes => int
Local $n = __SQLite_FetchColNbr($hDB, 'Ma_Table')
Msgbox(0, "", $n)
Local $col = 'val2'
Msgbox(0, "", "La colonne " & $col & (__SQLite_ColumnExists($hDB, 'Ma_Table', $col) >= 0 ? " existe." : " n'existe pas."))
$col = 'val3'
Msgbox(0, "", "La colonne " & $col & (__SQLite_ColumnExists($hDB, 'Ma_Table', $col) >= 0 ? " existe." : " n'existe pas."))

_SQLite_Close ()
_SQLite_Shutdown ()

;==============================
Func __SQLite_FetchColNbr($hDB, $Table)
    Local $aRows, $nrows, $ncols
    Local $err = _SQLite_GetTable2d($hDB, 'pragma table_info("' & $Table & '");', $aRows, $nrows, $ncols)
    Return (UBound($aRows) ? UBound($aRows) - 1 : 0)
EndFunc   ;==>_SQLite_ColNbr

Func __SQLite_ColumnExists($hDB, $Table, $Col)
    Local $aRows, $nrows, $ncols
    Local $err = _SQLite_GetTable2d($hDB, 'pragma table_info("' & $Table & '");', $aRows, $nrows, $ncols)
    Return (_ArraySearch($aRows, $Col))
EndFunc
 
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] SQLite : nombre de colonnes ou tester exist. d'un ch

#9

Message par aulus »

Merci pour cette illustration de l'emploi de pragma table_info. Les fonctions __SQLite_ColumnExists() et __SQLite_FetchColNbr() sont particulièrement rapides.
Répondre