[..] Ecriture BDD

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 164
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

[..] Ecriture BDD  

#1

Message par Yle »

Bonjour

Je ne vois pas pourquoi ma BDD n'est pas sauvegardée avec les données de mon fichier Clubs_Essai.csv que je fourni en format XLSX car les fichiers joints n'acceptent pas le format .CSV

Code : Tout sélectionner

#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
Dim $aFile, $aSplit
Global $hQuery,$BDD=@ScriptDir & "\Affilies.sqlite"

if FileExists ($BDD) then FileDelete ($BDD)  ; Delete de la base pour essais...

_SQLite_Startup()
$OpenBDD = _SQLite_Open($BDD) 				; nom du fichier base de données
_SQlite_Exec(-1,' CREATE TABLE IF NOT EXISTS clubs (' & _
'Club_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,  Cl_President CHAR NOT NULL COLLATE NOCASE, ' & _
'Cl_NomClub CHAR, Cl_Adresse CHAR, Cl_CP CHAR, Cl_Ville CHAR, Cl_Email CHAR,Cl_Site,Cl_Tel CHAR, Cl_Por CHAR, Cl_Saison CHAR, Cl_Date_Maj CHAR, Cl_Cotis CHAR,Cl_Affil INTEGER)');
_SQlite_Exec(-1,'CREATE UNIQUE INDEX "ixClub" ON "clubs" (Cl_NomClub)') ;

;~ ; Je remplis la table CLUBS de la base avec les clubs existants
_FileReadToArray(@ScriptDir & "\clubs_essai.csv", $aFile)

_SQLite_Exec(-1, 'BEGIN')
For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";")
    ; _ArrayDisplay($aSplit)
	$aSplit[1] = $aSplit[1]
    $aSplit[2] = _SQLite_Escape($aSplit[2])
    $aSplit[3] = _SQLite_Escape($aSplit[3])
    $aSplit[4] = _SQLite_Escape($aSplit[4])
    $aSplit[5] =_SQLite_Escape( $aSplit[5])
    $aSplit[6] = _SQLite_Escape($aSplit[6])
    $aSplit[7] = _SQLite_Escape($aSplit[7])
    $aSplit[8] = _SQLite_Escape($aSplit[8])
    $aSplit[9] = _SQLite_Escape($aSplit[9])
    $aSplit[10] = _SQLite_Escape($aSplit[10])
    $aSplit[11] = _SQLite_Escape($aSplit[11])

     ; Préparation de requête SQL
    $sql = 'INSERT INTO clubs VALUES ('
    For $j = 1 To $aSplit[0]
        $sql &= $aSplit[$j] & ", "
    Next
    $sql = StringTrimRight($sql, 2) & ")"
    ConsoleWrite("- " & $sql & @CRLF)
     _SQLite_Exec(-1, $sql)
 Next
 _SQLite_Exec(-1, 'END') ; Fin de transaction d'écriture des CLUBS

 _SQLite_Close(-1)
 _SQLite_Shutdown()


D"avance merci
Fichiers joints
clubs_Essai.xlsx
(10.49 Kio) Téléchargé 35 fois
clubs_Essai.xlsx
(10.49 Kio) Téléchargé 35 fois
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2255
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Ecriture BDD

#2

Message par jchd »

Le fichier xlsx, une fois transformé en .csv contient 11 champs. la DDL en contient 14.

Dans l'insert il faut préciser quels champs sont concernés.

Un minimum de traitement d'erreur aurait indiqué la cause du problème.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 164
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

Re: [..] Ecriture BDD

#3

Message par Yle »

Code : Tout sélectionner

#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
Dim $aFile, $aSplit
Global $hQuery,$BDD=@ScriptDir & "\Affilies.sqlite"

if FileExists ($BDD) then FileDelete ($BDD)  ; Delete de la base pour essais...

_SQLite_Startup()
$OpenBDD = _SQLite_Open($BDD) 				; nom du fichier base de données
_SQlite_Exec(-1,' CREATE TABLE IF NOT EXISTS clubs (' & _
' Cl_President CHAR NOT NULL COLLATE NOCASE, ' & _
'Cl_NomClub CHAR, Cl_Adresse CHAR, Cl_Ville CHAR, Cl_Email CHAR,Cl_Site CHAR,Cl_Tel CHAR, Cl_Saison CHAR, Cl_Date_Maj CHAR, Cl_Cotis CHAR,Cl_Affil CHAR)')
_SQlite_Exec(-1,'CREATE UNIQUE INDEX "ixClub" ON "clubs" (Cl_NomClub)') ;

;~ ; Je remplis la table CLUBS de la base avec les clubs existants
_FileReadToArray(@ScriptDir & "\clubs_essai.csv", $aFile)
;_ArrayDisplay($aFile)

_SQLite_Exec(-1, 'BEGIN')
For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";") ; attention qu'aucun champ du fichier Excel ne contiennent la caractère ; (séparateur d'un csv)
    ; _ArrayDisplay($aSplit)
	$aSplit[1] = $aSplit[1]
    $aSplit[2] = _SQLite_Escape($aSplit[2])
    $aSplit[3] = _SQLite_Escape($aSplit[3])
    $aSplit[4] = _SQLite_Escape($aSplit[4])
    $aSplit[5] =_SQLite_Escape( $aSplit[5])
    $aSplit[6] = _SQLite_Escape($aSplit[6])
    $aSplit[7] = _SQLite_Escape($aSplit[7])
    $aSplit[8] = _SQLite_Escape($aSplit[8])
    $aSplit[9] = _SQLite_Escape($aSplit[9])
    $aSplit[10] = _SQLite_Escape($aSplit[10])
    $aSplit[11] = _SQLite_Escape($aSplit[11])

     ; Préparation de requête SQL
    $sql = 'INSERT INTO clubs VALUES ('
    For $j = 1 To $aSplit[0]
        $sql &= $aSplit[$j] & ", "
    Next
    $sql = StringTrimRight($sql, 2) & ")"
    ConsoleWrite("- " & $sql & @CRLF)
     _SQLite_Exec(-1, $sql)
 Next
 _SQLite_Exec(-1, 'END') ; Fin de transaction d'écriture des CLUBS

 _SQLite_Close(-1)
 _SQLite_Shutdown()

Oui j'ai corrigé pour être en accord (11 colonnes) mais je ne vois par pourquoi mon fichier @ScriptDir & "\Affilies.sqlite ne s'écrit pas. Me manque t-il une fonction SQLITE ?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2255
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Ecriture BDD

#4

Message par jchd »

Je ne vois toujours aucun traitement d'erreur !
S'il y en avait un, on verrait que le délimiteur spécifié n'est peut-être pas le bon, du moins dans mon cas, suite à la conversion xlsx -> csv.
$aSplit = StringSplit($aFile[$i], ",")

Sinon le code fonctionne pour moi.
Il serait bon de stocker la date sous une forme compatible avec les fonctions "date" de SQLite, 2022-06-22 et non 22/06/2022
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 164
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

Re: [..] Ecriture BDD

#5

Message par Yle »

Avec un peu de retard..

Je ne suis pas spécialiste SQL...
Mais ces 2 lignes me semblent correctes
$aSplit = StringSplit($aFile[$i], ";")
_ArrayDisplay($aSplit)
Dans mon tableau $aSplit j'ai bien mes 11 valeurs ce qui prouve que le délimiteur est bien le ;

Ensuite qd j'utilise $aSplit[1] = _SQLite_Escape($aSplit[1]) j'ai @error=1
J'avoue ne pas comprendre...
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2255
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Ecriture BDD

#6

Message par jchd »

Encore une fois, le code fonctionne pour moi, une fois qu'on utilise le bon séparateur de champ. Pourtant, un .CSV c'est "Comma Separated Values".

D'ailleurs, _SQLite_FastEscape() serait préférable.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6217
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Ecriture BDD

#7

Message par mikell »

jchd a écrit : mer. 06 juil. 2022 00:50Pourtant, un .CSV c'est "Comma Separated Values"
Tsss encore un intégriste :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 : 2255
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Ecriture BDD

#8

Message par jchd »

Bah, ayant dû télécharger un fichier .xlsx qu'il fallait reconvertir en .csv, j'ai choisi l'option "comma". L'OP aurait pu poster le fichier CSV en le nommant .txt tout simplement.

Il y a aussi les TSV (Tab *), les SCV (Semicolumn *), les BSV (Bar *), ...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 164
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

Re: [..] Ecriture BDD

#9

Message par Yle »

N'étant pas assez doué pour les bases de données, j'abandonne. Merci qd même
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 988
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Ecriture BDD

#10

Message par walkson »

Bonjour,
Il y a quelques années j'avais écrit un code pour convertir Excel ou un CSV en base de données. Il mériterait d'être améliorer mais il fonctionne.
La première ligne du tableau doit contenir les titres des colonnes. Parfois le code de la partie Excel beugue, il suffit de relancer le code.

Code : Tout sélectionner

#include <Array.au3>
#include <SQLite.au3>
HotKeySet('!x', 'MsgError');alt x
			Global $saveDB = FileSaveDialog("Sauvegarde de la base",@DesktopDir,"Base(*.db)",0,"BaseSQLite_1.db")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If FileExists($saveDB) Then
				$rep = MsgBox(4,"LA BASE EXISTE","Voulez vous détruire la base ?")
				If $rep = 6 Then FileRecycle($saveDB)
			EndIf

			Global $table = InputBox("NOM DE LA TABLE","Entrez le nom de la table","MyTable")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If $table = "" Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			Global $path = FileOpenDialog("CLASSEUR EXCEL",@DesktopDir,"Excel(*.xls;*.xlsx;*.xlsm;*.xlsb;*.csv)",0,"clubs_Essai.csv")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			Global $lire = InputBox("CHOIX DE LA FEUILLE EXCEL","Entrez le N° de la feuille",1)
			$lire = Int($lire)
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If $lire = "" Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			$temps = TimerInit()
			 Local $oExcel = ObjCreate("Excel.Application")
			 If @error Then Exit MsgBox(16,"Error","Echec Objet Excel")
			 ToolTip("Lecture d'Excel",100,110)
			 If Not FileExists($path) Then Exit MsgBox(16,"Error","Classeur inconnu")
			 $oWorkbook = $oExcel.WorkBooks.Open($path, Default, Default, Default, Default, Default)
			 $oExcel.Visible = 0
			 If $oExcel.Sheets.Count < $lire Then ExcelError("Feuille demandée inexistante")
			$oExcel.Sheets($lire).Select
			Local $arrayxls = $oExcel.ActiveSheet.UsedRange
			Local $array = $arrayxls.Value
			_ArrayTranspose($array)
			$arrayT = $array
			$oExcel.ActiveWorkbook.Saved = True
			$oExcel.WorkBooks.close
			$oExcel = 0

			If Not IsArray($arrayT) Then Exit MsgBox(16,"Error","Echec recherche Excel")
			$nbLignes = UBound($arrayT,1)
			$nbColonnes = UBound($arrayT,2)


			;_ArrayDisplay($arrayT)
			Local $_FileExists = FileExists($saveDB)
			_SQLite_Startup()
			If @error Then
				MsgBox(16, "SQLite Error", "SQLite3.dll Can't be Loaded!")
				Exit -1
			EndIf
			_SQLite_Open($saveDB)
			If @error Then MsgError()
			Local $aResult, $iRows, $iColumns
			If $_FileExists = 1 Then;si base existe
				_SQLite_GetTable2d(-1, "SELECT type,name FROM  sqlite_master;", $aResult, $iRows, $iColumns)
				;_ArrayDisplay($aResult)
				For $i = 1 To UBound($aResult) - 1
					If $aResult[$i][0] = "table" Then;si table
						If $aResult[$i][1] = $table Then;si même nom de table
							_SQLite_GetTable2d(-1, "PRAGMA table_info( "& $table &" );", $aResult, $iRows, $iColumns)
							If $nbColonnes = 0 Then
								$nbColonnesA = 1;1D
							Else
								$nbColonnesA = $nbColonnes;2D
							EndIf
							If $nbColonnesA  <> $iRows Then MsgError("nb colonnes différent");si nb colonnes différents
							ExitLoop
						EndIf
					EndIf
				Next
			EndIf

			Local $coll = "" ;noms des colonnes
			If $nbColonnes = 0 Then ;array 1d
				$coll = _SQLite_Escape($arrayT[0])
			Else

				For $i = 0 To $nbColonnes - 1 ;array 2d
						If $i <> $nbColonnes - 1 Then
							$virg = ", "
						Else
							$virg = ""
						EndIf
							;modifie nom de colonne en double
						$val = $arrayT[0][$i]
						$valN = $arrayT[1][$i]
						If StringInStr($coll,$val) > 0 Or $val = "" Then $val = $val & $i
						Local $format = " text"
						If IsString($valN) Then $format = " TEXT"
						If IsInt($valN) Then $format = " INTEGER"
						If IsFloat($valN) Then $format = " REAL"
						If StringLen($valN) = 14 And StringMid($valN, 9,6) = 000000 And StringMid($valN, 1,4) <= @YEAR + 1 And StringMid($valN, 5,2) < 13 And StringMid($valN, 7,2) <= 31 Then $format = " DATE"
						$coll &= _SQLite_Escape($val)  & $format & $virg
						;ConsoleWrite($valN &">>"& $format & @CRLF)

				Next
			EndIf

			If $SQLITE_OK <> _SQlite_Exec(-1, "CREATE TABLE IF NOT EXISTS "& $table &" ("& $coll &")") Then MsgError()
			_SQLite_Exec(-1, 'BEGIN')
			If $nbColonnes = 0 Then ;Array 1D
				For $i = 1 To $nbLignes - 1
					$sql = 'INSERT INTO '& $table &' VALUES ('

						$sql &= _SQLite_Escape($arrayT[$i])  & ")"


					If $SQLITE_OK <> _SQLite_Exec(-1, $sql) Then MsgError()
					ToolTip( $i &" /"& $nbLignes - 1,100,110)
					$sql = ""
				Next

			Else ;Array 2D

				For $i = 1 To $nbLignes - 1
					$sql = 'INSERT INTO '& $table &' VALUES ('
					For $y = 0 To $nbColonnes - 1
						$valeur = $arrayT[$i][$y]
						_SQLite_GetTable2d(-1, "PRAGMA table_info( "& $table &" );", $aResult, $iRows, $iColumns)
						ConsoleWrite($aResult[$y + 1][2] & @CRLF)
						If $aResult[$y + 1][2] = "DATE" Then
							$split1 = StringMid($valeur, 7,2)
							$split2 = StringMid($valeur, 5,2)
							$split3 = StringMid($valeur, 1,4)
							$valeur = StringFormat("%04i-%02i-%02i" ,$split3,$split2,$split1)
							$sql &= "DATE(" &  _SQLite_Escape($valeur) & "), "
						Else
							$sql &= _SQLite_Escape($valeur) & ", "
						EndIf


					Next
					$sql = StringTrimRight($sql, 2) & ");"
					If $SQLITE_OK <> _SQLite_Exec(-1, $sql) Then MsgError()
					ToolTip( $i &" /"& $nbLignes - 1,100,110)
					$sql = ""
				Next
			EndIf
			_SQLite_Exec(-1, 'END')

_SQLite_Close()
_SQLite_Shutdown()
$tempsX = (TimerDiff($temps)/1000)/60
ConsoleWrite("temps écoulé en mn " & $tempsX & @CR)
$ttp = (TimerDiff($temps))/$nbLignes - 1
ConsoleWrite("temps écriture/ligne " & $ttp & @CR)
ToolTip(">>>>>>>>> Réussite",50,150)
Sleep(2000)
ToolTip("")
Func ExcelError($msgXls)
	$oExcel.ActiveWorkbook.Saved = True
	$oExcel.WorkBooks.close
	$oExcel = 0
	Exit MsgBox(16,"Error",$msgXls)
EndFunc

Func MsgError($msg = "")
	If $msg = "" Then $msg = "Error Code: " & _SQLite_ErrCode() & @CRLF & "Error Message: " & _SQLite_ErrMsg()
MsgBox(16, "SQLite Error", $msg)
_SQLite_Close()
_SQLite_Shutdown()
ToolTip("")
Exit
EndFunc
Si la base existe, il est proposé de la détruire. Si vous dites non et que vous nommez la table du même nom de l'existante, les données seront rajoutées à la suite sauf si le nombre de colonnes n'est pas identique.
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 164
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

Re: [..] Ecriture BDD

#11

Message par Yle »

Je comprends beaucoup mieux avec cet exemple qui fonctionne. Merci
Répondre