[R] Création fichier SQLite et connexion internet

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] Création fichier SQLite et connexion internet

#1

Message 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 ?
Modifié en dernier par aulus le mer. 12 févr. 2014 12:52, modifié 2 fois.
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: [..] création fichier SQLite et connexion internet

#2

Message 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.
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: [..] création fichier SQLite et connexion internet

#3

Message 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 ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#4

Message par Tlem »

Une partie du code serait utile pour essayer de déterminer le problème.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#5

Message 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 ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#6

Message 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. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#7

Message 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 :mrgreen:
" 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: [..] Création fichier SQLite et connexion internet

#8

Message 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.

Code : Tout sélectionner

If FileRead([b]$sqlite[/b]) = "" Then
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 ?
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: [..] Création fichier SQLite et connexion internet

#9

Message 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...
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#10

Message par jguinch »

Et que donne ça ?

Code : Tout sélectionner

IF NOT FileExists($sLocalSQLiteDll) Then Exit MsgBox(16, "", "SQLite3.dll not found in " & @ScriptDir)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
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: [..] Création fichier SQLite et connexion internet

#11

Message 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
 
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#12

Message 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. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Création fichier SQLite et connexion internet

#13

Message 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.
Répondre