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
Code : Tout sélectionner
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
_SQLite_Startup ()
_SQLite_Open(@ScriptDir & "\db.sqlite")
; check noms de colonnes 1 => array
$names = _GetColNames("stock")
_ArrayDisplay($names, "nom des colonnes")
; check noms de colonnes 2 => string
$names = _GetColNames2("stock")
MsgBox(0, "nom des colonnes", $names)
_SQLite_Close ()
_SQLite_Shutdown ()
;==============================
Func _GetColNames($tab)
Local $hQuery, $aNames
_SQLite_Query(-1, "SELECT * FROM '" & $tab & "';", $hQuery)
_SQLite_FetchNames($hQuery, $aNames)
Return $aNames
EndFunc
Func _GetColNames2($tab)
Local $hQuery, $aCol, $aNames
_SQLite_Query(-1, "PRAGMA table_info('" & $tab & "');", $hQuery)
While _SQLite_FetchData($hQuery, $aCol) = $SQLITE_OK
$aNames &= $aCol[1] & @crlf
WEnd
Return $aNames
EndFunc
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
Code : Tout sélectionner
#include <SQLite.au3>
#include <SQLite.dll.au3>
_SQLite_Startup ()
_SQLite_Open(@ScriptDir & "\db.sqlite")
; check nombre de colonnes => int
Local $hQuery, $n
_SQLite_Query(-1, "SELECT * FROM stock;", $hQuery)
_SQLite_FetchColNbr($hQuery, $n)
Msgbox(0,"", $n)
_SQLite_Close ()
_SQLite_Shutdown ()
;==============================
Func _SQLite_FetchColNbr($hQuery, ByRef $n)
If __SQLite_hChk($hQuery, 3, False) Then Return SetError(@error, 0, $SQLITE_MISUSE)
Local $avDataCnt = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_column_count", "ptr", $hQuery)
If @error Then Return SetError(1, @error, $SQLITE_MISUSE) ; DllCall error
If $avDataCnt[0] <= 0 Then Return SetError(-1, 0, $SQLITE_DONE)
$n = $avDataCnt[0]
Return $SQLITE_OK
EndFunc ;==>_SQLite_ColNbr
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.