Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requête et champ texte > 255 caractères

9 réponses
Avatar
LiR
Bonjour,

Il apparaît, d'après les documentations et la pratique, qu'on ne peut pas
récupérer de texte de plus de 255 caractères dans le champ d'une requête,
sauf en utilisant directement un champ mémo issu d'un table.

J'ai par exemple la requête suivante :
SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

Où Table1 est une table quelconque (peu importe).
J'utilise Access 2002.

Cette requête s'afffiche correctement si je l'ouvre dans Access ou si je la
place comme source d'un formulaire ; correctement dans le sens où la zone de
texte affiche bien les B après les 255 A.

Ce qui m'intrigue est que si j'accède à cette requête par un Recordset ADO
ou DAO, la valeur du champ Expr1 me renvoie un texte de 259 caractères, mais
à partir du 256ème, ce sont des caractères qui n'ont pas de sens (à mon avis,
issus dun débordement de mémoire pour le champ).

Ma vraie question est :
- Pourquoi Access est-il capable de récupérer correctement le texte de ce
champ?
- Y a-t-til un moyen de récupérer le texte de ce champ correctement dans un
recordset ou cela reste-t-il un privilège souverain exclusif de Microsoft
Access?

Si quelqu'un avait des informations sur le sujet, j'en serais très
reconnaissant.

9 réponses

Avatar
Opus
On doit se contenter de 255 caractères. Bill l'a dit.


Bonjour,

Il apparaît, d'après les documentations et la pratique, qu'on ne peut pas
récupérer de texte de plus de 255 caractères dans le champ d'une requête,
sauf en utilisant directement un champ mémo issu d'un table.

J'ai par exemple la requête suivante :
SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

Où Table1 est une table quelconque (peu importe).
J'utilise Access 2002.

Cette requête s'afffiche correctement si je l'ouvre dans Access ou si je la
place comme source d'un formulaire ; correctement dans le sens où la zone de
texte affiche bien les B après les 255 A.

Ce qui m'intrigue est que si j'accède à cette requête par un Recordset ADO
ou DAO, la valeur du champ Expr1 me renvoie un texte de 259 caractères, mais
à partir du 256ème, ce sont des caractères qui n'ont pas de sens (à mon avis,
issus dun débordement de mémoire pour le champ).

Ma vraie question est :
- Pourquoi Access est-il capable de récupérer correctement le texte de ce
champ?
- Y a-t-til un moyen de récupérer le texte de ce champ correctement dans un
recordset ou cela reste-t-il un privilège souverain exclusif de Microsoft
Access?

Si quelqu'un avait des informations sur le sujet, j'en serais très
reconnaissant.



Avatar
Raymond [mvp]
Bonjour.

tu n'as oublié qu'une seule chose, le 256e caractère est un caractère Null
(00 en ascii) qui indique la fin de champ Access. dans certaines conditions,
il est possible de lire un nombre de caractères sans tenir compte du code
fin de zone, mais pas dans une utilisation normale d'access.
pour solutionner tu fais tes concaténations dans un contrôle texte de ton
formulaire ou état et là ça marche.

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Bonjour,
|
| Il apparaît, d'après les documentations et la pratique, qu'on ne peut pas
| récupérer de texte de plus de 255 caractères dans le champ d'une requête,
| sauf en utilisant directement un champ mémo issu d'un table.
|
| J'ai par exemple la requête suivante :
| SELECT String(255,"A") & String(4,"B") AS Expr1
| FROM Table1;
|
| Où Table1 est une table quelconque (peu importe).
| J'utilise Access 2002.
|
| Cette requête s'afffiche correctement si je l'ouvre dans Access ou si je
la
| place comme source d'un formulaire ; correctement dans le sens où la zone
de
| texte affiche bien les B après les 255 A.
|
| Ce qui m'intrigue est que si j'accède à cette requête par un Recordset ADO
| ou DAO, la valeur du champ Expr1 me renvoie un texte de 259 caractères,
mais
| à partir du 256ème, ce sont des caractères qui n'ont pas de sens (à mon
avis,
| issus dun débordement de mémoire pour le champ).
|
| Ma vraie question est :
| - Pourquoi Access est-il capable de récupérer correctement le texte de ce
| champ?
| - Y a-t-til un moyen de récupérer le texte de ce champ correctement dans
un
| recordset ou cela reste-t-il un privilège souverain exclusif de Microsoft
| Access?
|
| Si quelqu'un avait des informations sur le sujet, j'en serais très
| reconnaissant.
|
Avatar
LiR
C'est assez incroyable cette limitation. On est au XXI° siècle tout de même...
Ca doit faire partie des brides stratégiques d'Access, il faudrait que je
regarde si on a la même limitation dans d'autres SGBD...
En VBA sous Access, j'ai trouvé une méthode assez folle pour récupérer les
champs de + de 255 caractères, mais ça reste très bricolo...

Merci pour ta confirmation


On doit se contenter de 255 caractères. Bill l'a dit.


Bonjour,

Il apparaît, d'après les documentations et la pratique, qu'on ne peut pas
récupérer de texte de plus de 255 caractères dans le champ d'une requête,
sauf en utilisant directement un champ mémo issu d'un table.

J'ai par exemple la requête suivante :
SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

Où Table1 est une table quelconque (peu importe).
J'utilise Access 2002.

Cette requête s'afffiche correctement si je l'ouvre dans Access ou si je la
place comme source d'un formulaire ; correctement dans le sens où la zone de
texte affiche bien les B après les 255 A.

Ce qui m'intrigue est que si j'accède à cette requête par un Recordset ADO
ou DAO, la valeur du champ Expr1 me renvoie un texte de 259 caractères, mais
à partir du 256ème, ce sont des caractères qui n'ont pas de sens (à mon avis,
issus dun débordement de mémoire pour le champ).

Ma vraie question est :
- Pourquoi Access est-il capable de récupérer correctement le texte de ce
champ?
- Y a-t-til un moyen de récupérer le texte de ce champ correctement dans un
recordset ou cela reste-t-il un privilège souverain exclusif de Microsoft
Access?

Si quelqu'un avait des informations sur le sujet, j'en serais très
reconnaissant.





Avatar
LiR
Bonjour,

Je ne comprends pas très bien ton explication...
Cela fonctionne bien dans un formulaire Access comme j'ai dit, mais le
problème concerne les champs des recordset. Le champ du Recordset lit
réellement le nombre de caractères de la chaîne, mais c'est la chaîne qui
semble stockée dans un buffer de 255 caractères maximum. Ainsi, avec un champ
de 500 caractères, j'aurai 255 premiers caractères corrects suivis de 255
"caractères" aléatoires (comme j'imagine, pris sur la mémoire qui suit le
buffer mais qui n'est pas remplie avec le texte d'origine).
Il reste qu'il existe un mécanisme pour que la requête fournisse
correctement les caractères au-delà du 255ème, puisque Access y arrive. Mais
lequel?


Bonjour.

tu n'as oublié qu'une seule chose, le 256e caractère est un caractère Null
(00 en ascii) qui indique la fin de champ Access. dans certaines conditions,
il est possible de lire un nombre de caractères sans tenir compte du code
fin de zone, mais pas dans une utilisation normale d'access.
pour solutionner tu fais tes concaténations dans un contrôle texte de ton
formulaire ou état et là ça marche.

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Bonjour,
|
| Il apparaît, d'après les documentations et la pratique, qu'on ne peut pas
| récupérer de texte de plus de 255 caractères dans le champ d'une requête,
| sauf en utilisant directement un champ mémo issu d'un table.
|
| J'ai par exemple la requête suivante :
| SELECT String(255,"A") & String(4,"B") AS Expr1
| FROM Table1;
|
| Où Table1 est une table quelconque (peu importe).
| J'utilise Access 2002.
|
| Cette requête s'afffiche correctement si je l'ouvre dans Access ou si je
la
| place comme source d'un formulaire ; correctement dans le sens où la zone
de
| texte affiche bien les B après les 255 A.
|
| Ce qui m'intrigue est que si j'accède à cette requête par un Recordset ADO
| ou DAO, la valeur du champ Expr1 me renvoie un texte de 259 caractères,
mais
| à partir du 256ème, ce sont des caractères qui n'ont pas de sens (à mon
avis,
| issus dun débordement de mémoire pour le champ).
|
| Ma vraie question est :
| - Pourquoi Access est-il capable de récupérer correctement le texte de ce
| champ?
| - Y a-t-til un moyen de récupérer le texte de ce champ correctement dans
un
| recordset ou cela reste-t-il un privilège souverain exclusif de Microsoft
| Access?
|
| Si quelqu'un avait des informations sur le sujet, j'en serais très
| reconnaissant.
|





Avatar
Raymond [mvp]
"ton mécanisme" c'est le code Null à la 256e position.
cette limitation ne gêne en rien car tu peux remplacer ton champ texte par
un champ mémo et c'est ce qu'on fait dans les adresses depuis de nombreuses
années. à part les tris et regroupement, mais il est rare de trier ou de
regrouper sur 500 caractères.
--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Bonjour,
|
| Je ne comprends pas très bien ton explication...
| Cela fonctionne bien dans un formulaire Access comme j'ai dit, mais le
| problème concerne les champs des recordset. Le champ du Recordset lit
| réellement le nombre de caractères de la chaîne, mais c'est la chaîne qui
| semble stockée dans un buffer de 255 caractères maximum. Ainsi, avec un
champ
| de 500 caractères, j'aurai 255 premiers caractères corrects suivis de 255
| "caractères" aléatoires (comme j'imagine, pris sur la mémoire qui suit le
| buffer mais qui n'est pas remplie avec le texte d'origine).
| Il reste qu'il existe un mécanisme pour que la requête fournisse
| correctement les caractères au-delà du 255ème, puisque Access y arrive.
Mais
| lequel?
|
Avatar
LiR
Merci pour ton explication,

Mais le problème subsiste pour ma requête :

SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

En réalité je n'ai pas de champ, mais le résultat d'une expression.
A moins que l'on puisse expliquer au moteur Jet que Expr1 doit être
interprété comme Memo ou LONGTEXT, la valeur récupérée reste non pas tronquée
mais incorrecte.


"ton mécanisme" c'est le code Null à la 256e position.
cette limitation ne gêne en rien car tu peux remplacer ton champ texte par
un champ mémo et c'est ce qu'on fait dans les adresses depuis de nombreuses
années. à part les tris et regroupement, mais il est rare de trier ou de
regrouper sur 500 caractères.
--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Bonjour,
|
| Je ne comprends pas très bien ton explication...
| Cela fonctionne bien dans un formulaire Access comme j'ai dit, mais le
| problème concerne les champs des recordset. Le champ du Recordset lit
| réellement le nombre de caractères de la chaîne, mais c'est la chaîne qui
| semble stockée dans un buffer de 255 caractères maximum. Ainsi, avec un
champ
| de 500 caractères, j'aurai 255 premiers caractères corrects suivis de 255
| "caractères" aléatoires (comme j'imagine, pris sur la mémoire qui suit le
| buffer mais qui n'est pas remplie avec le texte d'origine).
| Il reste qu'il existe un mécanisme pour que la requête fournisse
| correctement les caractères au-delà du 255ème, puisque Access y arrive.
Mais
| lequel?
|





Avatar
Raymond [mvp]
tu ne peux pas exploiter (concaténer) tes deux expressions dans le VB ou le
formulaire ou l'état ? Chaque expression peut-elle faire plus de 255
caractères? ces expressions sont-elles le résultat de critères dans la
requête elle-même ?

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Merci pour ton explication,
|
| Mais le problème subsiste pour ma requête :
|
| SELECT String(255,"A") & String(4,"B") AS Expr1
| FROM Table1;
|
| En réalité je n'ai pas de champ, mais le résultat d'une expression.
| A moins que l'on puisse expliquer au moteur Jet que Expr1 doit être
| interprété comme Memo ou LONGTEXT, la valeur récupérée reste non pas
tronquée
| mais incorrecte.
|
Avatar
LiR
En fait, je ne veux pas utiliser ces données dans un formulaire ni un état,
mais les récupérer pour des traitements de mon application (qui fonctionne en
VB ou VBA indépendamment d'Access mais qui utilise une base Jet manipulée par
des recordsets ADO ou DAO).

Le champ résulte d'une expression qui est :

SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

Certes, cette requête ne sert à rien (c'est juste un exemple, le plus simple
possible), mais cette expression, aussi simple soit-elle, reste impossible à
évaluer correctement dans un recordset.



tu ne peux pas exploiter (concaténer) tes deux expressions dans le VB ou le
formulaire ou l'état ? Chaque expression peut-elle faire plus de 255
caractères? ces expressions sont-elles le résultat de critères dans la
requête elle-même ?

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Cet été, j'en ai rien à coder, je me forme : les devoirs de vacances
http://www.comscamp.com/Tracker/Redirect.ashx?linkidJd96883-a859-4212-b4a0-bce47c8e0d99


"LiR" a écrit dans le message de news:

| Merci pour ton explication,
|
| Mais le problème subsiste pour ma requête :
|
| SELECT String(255,"A") & String(4,"B") AS Expr1
| FROM Table1;
|
| En réalité je n'ai pas de champ, mais le résultat d'une expression.
| A moins que l'on puisse expliquer au moteur Jet que Expr1 doit être
| interprété comme Memo ou LONGTEXT, la valeur récupérée reste non pas
tronquée
| mais incorrecte.
|





Avatar
Michel_D
"LiR" a écrit dans le message de news:
En fait, je ne veux pas utiliser ces données dans un formulaire ni un état,
mais les récupérer pour des traitements de mon application (qui fonctionne en
VB ou VBA indépendamment d'Access mais qui utilise une base Jet manipulée par
des recordsets ADO ou DAO).

Le champ résulte d'une expression qui est :

SELECT String(255,"A") & String(4,"B") AS Expr1
FROM Table1;

Certes, cette requête ne sert à rien (c'est juste un exemple, le plus simple
possible), mais cette expression, aussi simple soit-elle, reste impossible à
évaluer correctement dans un recordset.



Et bien utilise 2 recordsets et dans ton code tu effectue la concaténation
des résultat des deux requètes, mais bon si c'est pour créer une variable
string supérieure à 255 caractères pas besoin de passer par une
requète.