Page 1 sur 1

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

Posté : dim. 09 mars 2014 10:41
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.

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

Posté : dim. 09 mars 2014 12:32
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.

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

Posté : dim. 09 mars 2014 12:56
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

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

Posté : dim. 09 mars 2014 14:06
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.

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

Posté : dim. 09 mars 2014 18:35
par mikell
Pour avoir juste le nombre de colonnes, on peut aussi se faire une version simplifiée de _SQLite_FetchNames
► Afficher le texte

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

Posté : lun. 10 mars 2014 05:43
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)

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

Posté : lun. 10 mars 2014 08:53
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.

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

Posté : lun. 10 mars 2014 13:36
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
 

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

Posté : lun. 10 mars 2014 14:17
par aulus
Merci pour cette illustration de l'emploi de pragma table_info. Les fonctions __SQLite_ColumnExists() et __SQLite_FetchColNbr() sont particulièrement rapides.