Page 1 sur 1
[R] Création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 16:11
par aulus
Bonjour,
Je viens de m'apercevoir d'un drôle de phénomène. Lorsque je crée un fichier SQLite par les fonctions d'AutoIt , ce fichier se crée bien si mon PC est connecté à Internet. Si je le déconnecte d'Internet, le fichier SQLite ne se crée pas ! Or mon programme ne fait nullement appel à une connexion Internet, je n'utilise que les fonctions relatives à SQLite (_SQLite_Startup ; _SQLite_Exec ) .
Comment expliquer une chose pareille ?
Re: [..] création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 18:26
par jchd
Voir l'aide de _SQLite_Startup. En pratique copier la DLL qui convient (x86 ou x64) dans un répertoire adapté pour éviter le téléchargement.
Re: [..] création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 19:35
par aulus
S'i vous voulez parler de SQLite3.dll, je l'ai placé dans le dossier contenant l'exécutable, ainsi que dans le dossier Windows\System32 et même dans le dossier Windows\SysWOW64. Je me demande pourquoi l'exécutable ne le trouve pas.
Existe-t-il une DLL spécifique pour 32 bits et une spécifique pour 64 bits ? Si oui, où les trouve-t-on ?
Si je compile en 32 bits sur un PC 64 bits, où dois-je placer la DLL ? dans System32 ou dans SysWOW64 ?
Je vous remercie de m'éclairer sur ces questions.
Dans Exécuter de Windows, j'ai lancé : regsvr32 sqlite3.dll
J'ai obtenu le message : "Le module SQLite3.dll peut ne pas être compatible avec la version que vous exécutez. Vérifiez que le module est compatible avec une version x86 (32 bits) ou x64 (64 bits) de regsvr32.exe" Ce message apporte-t-il un éclaircissement ?
Re: [..] Création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 20:25
par Tlem
Une partie du code serait utile pour essayer de déterminer le problème.
Re: [..] Création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 21:13
par aulus
Le code fonctionne bien, lorsqu'il y a connexion à internet. Je suis convaincu que c'est le fait que le programme ne trouve pas le fichier SQLite3.dll sur mon disque dur qui fait qu'il ne fonctionne pas. Ayant mis cette dll dans le dossier de l'exécutable, dans le dossier windows\system32 et dans le dossier windows\SysWOW64, je ne vois plus ce qu'il faut faire. Merci de m'aider à trouver la solution :
Code : Tout sélectionner
#include <SQLite.au3>
#include <SQLite.dll.au3>
$File = FileOpenDialog("...")
if $File <> "" Then
Local $dat = $File
Local $sqlite = "fichier.SQLITE"
_SQLite_Startup ()
$Base_SQLite = _SQLite_Open($sqlite)
If FileRead($sqlite) = "" Then
SplashTextOn("", "Création de la base...", 280, 55, -1, -1, 49)
_SQLite_Exec ($Base_SQLite, "CREATE TABLE IF NOT EXISTS liste (numero integer, n, p, d, Pn, Pp, Mn, Mp, Cn, Cp,Type);")
Local $fichier = FileOpen($dat, 0) ; fichier texte
_SQLite_Exec($Base_SQLite, "Begin;")
Local $line
Local $split[161]
While 1
$line = FileReadLine($fichier)
If @error = -1 Then ExitLoop
$split = StringSplit($line, "|")
Local $array_ligne[$split[0]+1]
$array_ligne[0] = $split[0]
$array_ligne[1] = $split[1]
$array_ligne[2] = $split[2]
$array_ligne[3] = ...
...
_SQLite_Exec($Base_SQLite, "INSERT INTO liste (numero, n, p, d, Pn, Pp, Mn, Mp, Cn, Cp, Type) VALUES (" & _
_SQLite_FastEscape($array_ligne[1]) & ", " & _
_SQLite_FastEscape($array_ligne[2]) & ", " & _
...
_SQLite_FastEscape($array_ligne[11]) & ");")
WEnd
_SQLite_Exec($Base_SQLite, "Commit;")
FileClose($fichier)
endif
endif
Est-ce que j'oublie une fonction conduisant l'exécutable à chercher la dll sur le disque dur ?
Re: [..] Création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 22:07
par Tlem
Bonsoir. Essayez de mettre le paramètre
$iForceLocal de la fonction
_SQLite_Startup à 1 et profitez en pour spécifier le chemin de la DLL.
Si vous comptez mettre votre script sous forme d'exe, il vous faudra évidemment inclure cette DLL lors de la compilation et l'extraire au moment voulu vers le dossier qui convient.

Re: [..] Création fichier SQLite et connexion internet
Posté : mar. 11 févr. 2014 23:45
par mikell
" If #include <SQLite.dll.au3> is included the SQLite version is check. If older, download will occur."
Essaye de commenter cet include, ou de prendre la version la plus récente de la dll
ici
Et la dll, je la mettrais dans le dossier du script pour éviter les emmerdes vu que c'est le 1er endroit où AutoIt regarde

Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 04:17
par jchd
Virer l'include et spécifier le chemin de la dll, car FileOpenDialog change le répertoire par défaut.
Faire aussi ce que dit Tlem.
C'est quoi ce test exactement ? Si la base fait 2 Gb, on va vraiment lire 2 Gb pour savoir si elle esiste ?
Préciser le type des colonnes lors de la création de la table et le respecter si on veut éviter les surprises. Ainsi numero est de type integer mais on y stocke des chaînes. Si numero se veut un identificateur unique alors autant en faire la clé primaire.
A quoi sert $array_ligne ?
Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 09:19
par aulus
Bonjour à tous et merci pour tous ces conseils et toutes ces indications.
1. j'ai viré #include <SQLite.dll.au3> en le commentant
2. j'ai téléchargé la dernière version de SQLite3.dll que j'ai placé dans le dossier du script
3. j'ai ajouté dans mon code :
Code : Tout sélectionner
Local $sLocalSQLiteDll = @ScriptDir & "\sqlite3.dll"
Local $sSQliteDll = _SQLite_Startup($sLocalSQLiteDll, False, 1)
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite Error", "'SQLite3.dll' Can't be Loaded!")
Exit -1
EndIf
Résultat du test : que je sois connecté à internet ou que je ne le sois pas, j'obtiens l'erreur "SQLite3.dll Can't be Loaded".
@tlem
J'inclus la dll dans le pack de distribution de mon programme. Cela convient-il ?
@ jchd
Je vais réfléchir à vos remarques...
Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 10:42
par jguinch
Et que donne ça ?
Code : Tout sélectionner
IF NOT FileExists($sLocalSQLiteDll) Then Exit MsgBox(16, "", "SQLite3.dll not found in " & @ScriptDir)
Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 10:43
par jchd
Code : Tout sélectionner
#AutoIt3Wrapper_UseX64=n ;(Y/N) Use AutoIt3_x64 or Aut2Exe_x64. Default=N
; si l'on copie sqlite3.dll et sqlite3_x64.dll dans le répertoire @ScriptDir
; alors ce code DOIT fonctionner en x86 ou x64 sans y changer quoi que ce soit
#include <SQLite.au3>
#include <Constants.au3>
Local $sLocalSQLiteDll = @ScriptDir & "\sqlite3.dll"
Local $sSQliteDll = _SQLite_Startup($sLocalSQLiteDll, True, 1)
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite Error", "'SQLite3.dll' Can't be Loaded!")
Exit -1
Else
MsgBox($MB_SYSTEMMODAL, "SQLite status", $sSQliteDll & " loaded." & @LF & "SQLite3 v" & _SQLite_LibVersion() & " subsystem ready.")
EndIf
Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 11:30
par Tlem
Effectivement si le script est lancé en x64 sans spécifier la version de la dll Sqlite3 à utiliser, cela pouvait probablement poser problème, mais dans l'exemple ci-dessus, quel est l’intérêt de copier Sqlite3_x64.dll si la directive #AutoIt3Wrapper_UseX64=n est spécifiée ou si l'utilisation de la version x32 est explicitement indiqué ?
Edit : Je viens de contrôler et même si la dll x86 est explicitement spécifiée, le lancement ou la compilation du script en x64 redirige sur l'utilisation de la dll x64 !
Donc soit on rajoute la directive #AutoIt3Wrapper_UseX64=n ou avec la nouvelle version d'AutoIt #pragma compile(x64, false) pour compiler/lancer le script exclusivement en x86 et dans ce cas seule la dll x32 sera nécessaire, sinon il faut rajouter les 800Ko de la version x64.

Re: [..] Création fichier SQLite et connexion internet
Posté : mer. 12 févr. 2014 15:27
par aulus
J'ai lancé vos 2 tests qui se sont révélés réussis. La dll est bien trouvée et bien chargée.
La solution était la ligne : #AutoIt3Wrapper_UseX64=n qui manquait à mon code, en accompagnement de la déclaration de la localisation de la dll dans la fonction Local $sSQliteDll = _SQLite_Startup($sLocalSQLiteDll, False, 1)
Je suis très heureux de cette réussite et vous remercie tous pour l'intérêt que vous avez porté à mes difficultés, et la gentillesse d'avoir consacré de votre temps à les résoudre.