Bonjour,
je patauge sans rien comprendre depuis 2 heures sur le sujet. Je ne sais pas si cela concerne en réalité FireDac. Le problème figurerait peut-être mieux dans les bases de données.
Je copie certains enregistrements d'une table MySQL dans une table SQLite de même structure, enfin je n'en suis pas (plus) très sûr
Le code FireMonkey/FireDac semble fonctionnel :
Mais je n'obtiens pas directement le résultat escompté quand les tables sont définies comme elles devraient l'être, la table MySQL ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 // mySQLcurrentRow, SQLiteCurrentRow : TFDDatSRow; {Récupération de la structure de la table SQLite : Table de destination} with SQLiteQuery do begin SQL.Clear; SQL.Add('SELECT * FROM ' + aTable + ' WHERE '+ aBRV + 'ID= ' + QuotedStr(arrToIns[aRow])+' LIMIT 1;'); Open; Close; end; {Récupération des données de l'enregistrement de la table source MySQL} with mySQLquery do begin SQL.Clear; SQL.Add('SELECT * FROM ' + aTable + ' WHERE '+ aBRV + 'ID= ' + QuotedStr(arrToIns[aRow])+' LIMIT 1;'); Open; if IsEmpty then begin Result := eSQLerr; Close; end; First; mySQLcurrentRow := GetRow; end; {Copie des données} if Result = eNoErr then with sqlitequery do begin if not active then active := true; Insert; SQLiteCurrentRow := GetRow; for aCol := 0 to mysqlCurrentRow.Table.Columns.Count - 1 do SQLiteCurrentRow.SetData(aCol, mysqlCurrentRow.GetData(aCol)); Post; end;alors que la table SQLite l'est ainsi :CREATE TABLE `users` (
`usID` CHAR(20) NOT NULL DEFAULT '' ,
`usNOM` VARCHAR(30) NULL DEFAULT NULL ,
`usPRENOM` VARCHAR(30) NULL DEFAULT NULL ,
`usLOGIN` VARCHAR(30) NULL DEFAULT NULL ,
`usPASSWORD` VARCHAR(30) NULL DEFAULT NULL ,
`xxSTAMP` CHAR(17) NULL DEFAULT NULL ,
PRIMARY KEY (`usID`),
UNIQUE INDEX `uNOM` (`usNOM`, `usPRENOM`),
UNIQUE INDEX `uLOGIN` (`usLOGIN`, `usPASSWORD`)
)
COLLATE='utf8_roman_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;Initialement la table MySQL a été créée avec un xxSTAMP en VARCHAR(20), bien avant que je ne porte le code de mon projet sous FMX. Puis j'ai corrigé sa structure en CHAR(17) alors que le portage était commencé, sachant que les valeurs des données de ce champ ont toujours été NULL (jamais remplies).csCREATEusers: string = 'CREATE TABLE IF NOT EXISTS [users] (' +
'[usID] NCHAR(20) NOT NULL,' +
'[usNOM] VARCHAR(30) COLLATE UTF16NoCase,' +
'[usPRENOM] VARCHAR(30) COLLATE UTF16NoCase,' +
'[usLOGIN] NVARCHAR(30),' +
'[usPASSWORD] NVARCHAR(30),' +
'[xxSTAMP] NCHAR(17),' +
'CONSTRAINT [] PRIMARY KEY ([usID]));' +
'CREATE UNIQUE INDEX IF NOT EXISTS [uNOM] ON [users] ([usNOM], [usPRENOM]);' +
'CREATE UNIQUE INDEX IF NOT EXISTS [uLOGIN] ON [users] ([usLOGIN], [usPASSWORD]);';
La table SQLite est créée dynamiquement par Delphi. Avec [xxSTAMP] NCHAR(17) dans la table SQLite, j'obtiens alors une erreur de FireDac qui me signifie que les 2 xxSTAMP n'ont pas la même taille : [20] contre [17] . En précisant [xxSTAMP] NCHAR(20) pour la table SQLite, cela fonctionne normalement. Donc, pour FireDac, la structure de la table MySQL semble être la première définie (VARCHAR (20)) et pas celle corrigée ultérieurement (CHAR(17)). Comment expliquer cela ? J'ai appliqué sur ma table innodb un "repair". Sans effet
Pour avoir gain de cause (avec l'écriture "normale" de définition des tables), il a fallu que je sauvegarde ma table MySQL dans une autre table avec la "bonne structure" dès le départ, détruise la première et renomme la seconde. Dans la mesure où j'ai quelques tables quand même avec le même vieux xxSTAMP, j'aurais bien aimé comprendre le problème. Maintenant compte tenu du temps passé, quelques moments de plus a les recréer ne seront pas un drame. Mais par curiosité j'aimerais comprendre le problème.
Merci. Zac.
Partager