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

Quoi une date dans un nom ?

14 réponses
Avatar
Gloops
Bonjour tout le monde,

Je suis en train de cr=E9er un formulaire de saisie sur une page web aspx=
,=20
il y a une zone de texte et un bouton, afin d'introduire dans une table=20
SQL Server le contenu de la zone de texte et le nom de la page.

Sur une requ=EAte INSERT INTO vers deux champs texte, m'est reproch=E9 de=
ne=20
pas avoir format=E9 une date correctement.

C'est quoi ces blagues ?
Je pr=E9cise que taper la m=EAme requ=EAte dans SQL Management Studio Exp=
ress=20
(en rempla=E7ant les param=E8tres par leurs valeurs entre apostrophes) do=
nne=20
le r=E9sultat attendu sans aucun probl=E8me.

Voici le code du bouton :
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D D=E9but =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
Parameter insertedKey =3D new Parameter("@AdrMail", TypeCode.Char);
insertedKey.Direction =3D ParameterDirection.Output;
insertedKey.DefaultValue =3D "toto";
// ben oui c'est une phase de test, apr=E8s je mettrai TextBox1.Text

Parameter insertedKey2 =3D new Parameter("@PageSujet", TypeCode.Char);
insertedKey2.Direction =3D ParameterDirection.Output;
insertedKey2.DefaultValue =3D "page";

SqlDataSource1.InsertParameters.Add(insertedKey);
SqlDataSource1.InsertParameters.Add(insertedKey2);
SqlDataSource1.Insert();
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Fin =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D

Dans le code aspx du SqlDataSource :
InsertCommand=3D"INSERT INTO tblListeDist(lsdAdrMail, lsdPageSujet)=20
VALUES(@AdrMail, @PageSujet)">

(en d=E9sespoir de cause j'ai ajout=E9 des apostrophes avant et apr=E8s c=
haque=20
param=E8tre ; bon, mauvaise id=E9e, c'=E9tait juste pour voir)

Taille du champ lsdAdrMail : 80 caract=E8res
Taille du champ lsdPageSujet : 30 caract=E8res

La table comporte des champs date que je pense laisser =E0 nul dans un=20
premier temps.

Et voil=E0 le flot d'injures que je re=E7ois sur l'instruction Insert :

System.FormatException was unhandled by user code
Message=3D"String must be exactly one character long."
Source=3D"mscorlib"
StackTrace:
at System.Convert.ToChar(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToChar(IFormatProvider=20
provider)
at System.Convert.ChangeType(Object value, TypeCode typeCode,=20
IFormatProvider provider)
at System.Web.UI.WebControls.Parameter.GetValue(Object value,=20
String defaultValue, TypeCode type, Boolean convertEmptyStringToNull,=20
Boolean ignoreNullableTypeChanges)
at System.Web.UI.WebControls.Parameter.get_ParameterValue()
at=20
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext=20
context, Control control)
at=20
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbComman=
d=20
command, ParameterCollection parameters, IDictionary exclusionList)
at=20
System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary=20
values)
at System.Web.UI.WebControls.SqlDataSource.Insert()
at TestData.Button1_Click(Object sender, EventArgs e) in=20
c:\(documents and settings)\Mes documents\Visual Studio=20
2005+\Zailes0\TestData.aspx.cs:line 31
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String=20
eventArgument)
at=20
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.Rais=
ePostBackEvent(String=20
eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler=20
sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection=20
postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean=20
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

10 réponses

1 2
Avatar
Faust
petite indication, la direction des paramètres s'indique par rapport au
serveur de base de données (ou de la base de données pour
simplifier).... pas par rapport à ton code

/Dans son message précédent, _Gloops_ a écrit/ :
Bonjour tout le monde,



Je suis en train de créer un formulaire de saisie sur une page web aspx, il y
a une zone de texte et un bouton, afin d'introduire dans une table SQL Server
le contenu de la zone de texte et le nom de la page.



Sur une requête INSERT INTO vers deux champs texte, m'est reproché de ne pas
avoir formaté une date correctement.



C'est quoi ces blagues ?
Je précise que taper la même requête dans SQL Management Studio Express (en
remplaçant les paramètres par leurs valeurs entre apostrophes) donne le
résultat attendu sans aucun problème.



Voici le code du bouton :
========== Début =============== > Parameter insertedKey = new Parameter("@AdrMail", TypeCode.Char);
insertedKey.Direction = ParameterDirection.Output;
insertedKey.DefaultValue = "toto";
// ben oui c'est une phase de test, après je mettrai TextBox1.Text



Parameter insertedKey2 = new Parameter("@PageSujet", TypeCode.Char);
insertedKey2.Direction = ParameterDirection.Output;
insertedKey2.DefaultValue = "page";



SqlDataSource1.InsertParameters.Add(insertedKey);
SqlDataSource1.InsertParameters.Add(insertedKey2);
SqlDataSource1.Insert();
========== Fin ===============
Dans le code aspx du SqlDataSource :
InsertCommand="INSERT INTO tblListeDist(lsdAdrMail, lsdPageSujet)
VALUES(@AdrMail, @PageSujet)">



(en désespoir de cause j'ai ajouté des apostrophes avant et après chaque
paramètre ; bon, mauvaise idée, c'était juste pour voir)



Taille du champ lsdAdrMail : 80 caractères
Taille du champ lsdPageSujet : 30 caractères



La table comporte des champs date que je pense laisser à nul dans un premier
temps.



Et voilà le flot d'injures que je reçois sur l'instruction Insert :



System.FormatException was unhandled by user code
Message="String must be exactly one character long."
Source="mscorlib"
StackTrace:
at System.Convert.ToChar(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToChar(IFormatProvider provider)
at System.Convert.ChangeType(Object value, TypeCode typeCode,
IFormatProvider provider)
at System.Web.UI.WebControls.Parameter.GetValue(Object value, String
defaultValue, TypeCode type, Boolean convertEmptyStringToNull, Boolean
ignoreNullableTypeChanges)
at System.Web.UI.WebControls.Parameter.get_ParameterValue()
at
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext context,
Control control)
at
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbCommand
command, ParameterCollection parameters, IDictionary exclusionList)
at
System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary values)
at System.Web.UI.WebControls.SqlDataSource.Insert()
at TestData.Button1_Click(Object sender, EventArgs e) in
c:(documents and settings)Mes documentsVisual Studio
2005+Zailes0TestData.aspx.cs:line 31
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String
eventArgument)
at
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection
postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)



--
*/Teträm/*
http://www.tetram.org

"Avale tout sans réfléchir, ce qui n'est pas commestible resortira
toujours" - Proverbe Troll
Avatar
Gloops
Faust a écrit, le 20/06/2009 07:45 :
petite indication, la direction des paramètres s'indique par rapport au
serveur de base de données (ou de la base de données pour
simplifier).... pas par rapport à ton code




Effectivement, j'étais moi-même surpris, mais ce code est copié de
l'aide, d'un exemple d'insertion dans une base, et j'ai peine à me
représenter dans quels cas on fait une insertion dans une base avec des
paramètres entrants, et dans quels cas on fait une insertion avec des
paramètres sortants. Eh bien par défaut, apparemment, pour Microsoft,
insérer un enregistrement dans une base, ça se fait avec des paramè tres
sortants.

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/P_Syste m_Web_UI_WebControls_SqlDataSource_InsertCommand.htm

Alors j'ai fait un essai avec Input et ensuite j'ai mis InputOutput
histoire qu'on n'en parle plus, et le message d'erreur est toujours le
même, entre un champ de type CHAR de taille 80 caractères et un champ de
type CHAR de taille 30 caractères, on trouve moyen de me reprocher
d'avoir mal formaté une date, et de prendre plus d'un caractère.

Ma réaction, c'est crénom toutes les dates de l'enregistrement sont à
nul sans exception, comment se fait-il qu'il y ait plus d'un octet
dedans ? Et surtout, elles sont à nul parce que c'est la valeur par
défaut, mais il n'en est pas fait mention dans le code.

J'ai dû louper un truc, quelque part.

J'ai vu qu'on peut aussi déclarer les paramètres dans le code asp,
j'imagine que l'intérêt alors est de pouvoir le faire avec l'interfac e
de création, mais je n'ai pas vu où. Je les ai mis dans le code,
j'imagine que ça doit aussi faire la rue Michel, puisqu'on trouve aussi
des exemples avec les paramètres déclarés par code.

(Je viens de vérifier dans l'explorateur de serveur, la propriété
Nullable est à false pour les deux champs texte, type char, et true pou r
les trois champs de dates, deux de type datetime et un de type timestamp) .
Avatar
Gloops
ça y est, ça avance.

Le "smarttag" de l'objet SqlDataSource donne accès à sa configuration .

Une chose que j'avais négligée, après avoir sélectionné les cha mps, est
de cliquer sur le bouton Advanced, de façon à pouvoir cocher "Generat e
INSERT, UPDATE, and DELETE statements".

En revanche à la page suivante, après avoir fait apparaître l'aperç u des
enregistrements, le bouton Next n'est pas actif : l'interface ne permet
pas de corriger les requêtes INSERT, UPDATE et DELETE.

Je vais donc dans le code aspx pour corriger la requête INSERT et ne
laisser que les deux premiers arguments (lsdAdrMail, lsdPageSujet) de
INTO et de VALUES.

A ce stade ça ne marche pas mieux, mais ensuite, puisque j'ai créé des
paramètres dans le code aspx, je peux supprimer ceux définis dans le
code csharp. Le code de mon bouton devient ceci :

SqlDataSource1.InsertParameters[0].DefaultValue = TextBox1.Tex t;
SqlDataSource1.InsertParameters[1].DefaultValue = "page";
SqlDataSource1.Insert();

Et là, certes la machine met un peu de temps à me rendre le contrôl e
mais ce n'est guère nouveau, en tout cas l'enregistrement a été cré é et
aucun message d'erreur n'est apparu.

Voilà. Alors maintenant, il ne reste plus qu'à ne pas mourir idiot.
J'aimerais assez comprendre au juste dans quels cas il est approprié de
définir par code csharp la requête d'insertion plutôt que d'utilise r
celle générée dans le code du contrôle (grâce au bouton Advance d), et
alors si quelqu'un était capable de me dire à quel niveau au juste s' est
produit le dépassement de capacité ...

Ah oui et puis aussi, si il est normal que je n'aie pas eu accès dans
l'interface visuelle à la modification des requêtes INSERT, UPDATE et
DELETE, et que j'aie dû aller manuellement modifier la source aspx.

En tout état de cause, merci d'avoir pris le temps de lire.
Avatar
Jérémy Jeanson
Bonjour Gloops,

Comme malheureusement à chaque fois que tu nous parles de la version
Express, ça me défrise...

Je vais finir par me faire une VPC avec histoire de simuler ton cas, on
verra je ne te promet rien, le temps m'est compté en ce moment, (c'est
un peu pour cela que je post un peu moins).

@+
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gloops
Bonjour Jérémy,

Penses-tu que les problèmes soient liés à la version Express ?

Pour ce qui est du sous-état (ben oui parce que ça me trotte toujours
dans la tête) ce n'est pas exclus, mais franchement ça ne m'arrangera it
pas. Un peu aussi pour ça que j'ai fait un descriptif des opérations,
pour savoir si quelqu'un d'autre arrivait au même résultat. Pour les
mises à jour rétives, de temps en temps je plonge dedans, mais si je
sais quand je m'y engage, je ne sais pas quand je peux m'en éloigner un peu.

Ah oui alors tu as vu, j'ai fini par réussir à faire une saisie vers SQL
Server, après je posais des questions pour cloturer le truc, histoire d e
mieux comprendre.

Maintenant je suis en train de faire la même chose vers MySQL, mais là
ce n'est pas certain que ça relève du même forum. Surtout que j'ai
l'impression que les pilotes pourraient marquer un peu de progrès en
matière de stabilité.
_____________________________________________
Jérémy Jeanson a écrit, le 22/06/2009 08:38 :
Bonjour Gloops,

Comme malheureusement à chaque fois que tu nous parles de la version
Express, ça me défrise...

Je vais finir par me faire une VPC avec histoire de simuler ton cas, on
verra je ne te promet rien, le temps m'est compté en ce moment, (c'es t
un peu pour cela que je post un peu moins).

@+


Avatar
Jérémy Jeanson
Bonjour Gloops,

Non je ne pense pas que ce soit du fait de ta version express. Juste que
dans cette version il y a quelques différences d'ergonomie qui changent
finalement plus que je ne le pensais.

Pour ce qui est des riports, je n'ai effectivement pas la même
expérience que toi avec le produit car en fait je ne laisse pas se
charger des accès aux données : je lui fourni des DataSet ou des listes
d'objets qui sont déjà peuplé. C'est très simple à faire et dans le cas
des sous raports ça fonctionne aussi très bien.

Le pourquoi du comment j'utilise le report de la sorte est qu'en faite
j'utilise le report comme élément dédié à l'impression mais que mes
formulaires ont déjà une vue dans laquelle les données sont chargées
(datagrid winform ou web), donc charger les données à deux reprises
juste car l'utilisateur a deux visualisations de la donnée,... ce n'est
pas très sympa pour la BDD donc j'évite ;).

Si tu veux des exemple de code pas de souci je peux en formater un ou
deux pour te monter la chose.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gloops
Jérémy Jeanson a écrit, le 24/06/2009 09:23 :
Bonjour Gloops,

Non je ne pense pas que ce soit du fait de ta version express. Juste qu e
dans cette version il y a quelques différences d'ergonomie qui change nt
finalement plus que je ne le pensais.



Ah, forcément, je ne me rends pas bien compte.
Je craignais qu'il n'y ait pas la place sur le disque pour installer la
version complète de SQL Server (là, si jamais j'ajoute une vidéo ç a y
est c'est plein, alors forcément j'ai intérêt à défragmenter so uvent).
La version complète prend plus de place que la version Express j'imagin e ?


Pour ce qui est des riports, je n'ai effectivement pas la même
expérience que toi avec le produit car en fait je ne laisse pas se
charger des accès aux données : je lui fourni des DataSet ou des li stes
d'objets qui sont déjà peuplé. C'est très simple à faire et d ans le cas
des sous raports ça fonctionne aussi très bien.



Tu veux dire mettre tous les champs dans la requête du rapport principa l
? Evidemment, comme ça, on n'a pas le souci de synchroniser deux requê tes :)

Bien sûr, je pourrais faire ça. Si je m'obstine un peu, préciséme nt
c'est pour l'intérêt de l'exercice, pour m'assurer d'être capable d e le
faire, car j'imagine qu'il peut y avoir des situations où la place
assignée à la requête principale ne permet pas de tout mettre.


Le pourquoi du comment j'utilise le report de la sorte est qu'en faite
j'utilise le report comme élément dédié à l'impression mais q ue mes
formulaires ont déjà une vue dans laquelle les données sont charg ées
(datagrid winform ou web), donc charger les données à deux reprises
juste car l'utilisateur a deux visualisations de la donnée,... ce n'e st
pas très sympa pour la BDD donc j'évite ;).

Si tu veux des exemple de code pas de souci je peux en formater un ou
deux pour te monter la chose.



J'imagine qu'un exemple peut aider à bien comprendre ce que tu veux
dire, si ce n'est pas l'interprétation que j'ai proposée plus haut.
Avatar
Jérémy Jeanson
Bonjour Gloops,

Arg je n'ai pas été forcément très claire...

En fait non je ne parlait pas de requête, mais du résultat d'une
requête. Imaginons que tu as un DataSet et que tu l'a déjà chargé dans
ton application. Tu peux prendre ce DataSet qui contient des données et
le passer à ton report pour qu'il affiche ces données. Cela ce fait
comme ceci (petit exemple d'un code que j'utilise souvant avec ASP.net):

ReportViewer1.LocalReport.ReportPath = "fichier.rdlc"
ReportViewer1.LocalReport.DataSources.Clear();

ReportViewer1.LocalReport.DataSources.Add(
new Microsoft.Reporting.WebForms.ReportDataSource(
"NoDeMonDateSetDansLeReport",
MonDataSet));

ReportViewer1.LocalReport.Refresh();

ReportViewer1.DataBind();
ReportViewer1.CurrentPage = 1;

Là où c'est sympathique c'est que le DataSet peut être remplacé par une
liste d'objets.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Patrice
A piroir c'est causé TypeCode.Char (un caractère). Remplacer par
TypeCode.String...

--
Patrice

"Gloops" a écrit dans le message de groupe de
discussion :
Bonjour tout le monde,

Je suis en train de créer un formulaire de saisie sur une page web aspx,
il y a une zone de texte et un bouton, afin d'introduire dans une table
SQL Server le contenu de la zone de texte et le nom de la page.

Sur une requête INSERT INTO vers deux champs texte, m'est reproché de ne
pas avoir formaté une date correctement.

C'est quoi ces blagues ?
Je précise que taper la même requête dans SQL Management Studio Express
(en remplaçant les paramètres par leurs valeurs entre apostrophes) donne
le résultat attendu sans aucun problème.

Voici le code du bouton :
========== Début =============== > Parameter insertedKey = new Parameter("@AdrMail", TypeCode.Char);
insertedKey.Direction = ParameterDirection.Output;
insertedKey.DefaultValue = "toto";
// ben oui c'est une phase de test, après je mettrai TextBox1.Text

Parameter insertedKey2 = new Parameter("@PageSujet", TypeCode.Char);
insertedKey2.Direction = ParameterDirection.Output;
insertedKey2.DefaultValue = "page";

SqlDataSource1.InsertParameters.Add(insertedKey);
SqlDataSource1.InsertParameters.Add(insertedKey2);
SqlDataSource1.Insert();
========== Fin =============== >
Dans le code aspx du SqlDataSource :
InsertCommand="INSERT INTO tblListeDist(lsdAdrMail, lsdPageSujet)
VALUES(@AdrMail, @PageSujet)">

(en désespoir de cause j'ai ajouté des apostrophes avant et après chaque
paramètre ; bon, mauvaise idée, c'était juste pour voir)

Taille du champ lsdAdrMail : 80 caractères
Taille du champ lsdPageSujet : 30 caractères

La table comporte des champs date que je pense laisser à nul dans un
premier temps.

Et voilà le flot d'injures que je reçois sur l'instruction Insert :

System.FormatException was unhandled by user code
Message="String must be exactly one character long."
Source="mscorlib"
StackTrace:
at System.Convert.ToChar(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToChar(IFormatProvider
provider)
at System.Convert.ChangeType(Object value, TypeCode typeCode,
IFormatProvider provider)
at System.Web.UI.WebControls.Parameter.GetValue(Object value,
String defaultValue, TypeCode type, Boolean convertEmptyStringToNull,
Boolean ignoreNullableTypeChanges)
at System.Web.UI.WebControls.Parameter.get_ParameterValue()
at
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext
context, Control control)
at
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbCommand
command, ParameterCollection parameters, IDictionary exclusionList)
at
System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary
values)
at System.Web.UI.WebControls.SqlDataSource.Insert()
at TestData.Button1_Click(Object sender, EventArgs e) in
c:(documents and settings)Mes documentsVisual Studio
2005+Zailes0TestData.aspx.cs:line 31
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String
eventArgument)
at
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection
postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Avatar
Gloops
Hum, j'ai l'impression qu'il faut que je remette les mains dans le
cambouis pour bien capter le message.

Hier je me suis plongé dans l'équivalent sur MySQL, où d'ailleurs j e me
pose des questions sur la stabilité du pilote —questions que j'ai
répercutées sur le forum qui va bien.

Alors bon, maintenant une sieste :) et puis ensuite on remet ça.

Jérémy Jeanson a écrit, le 25/06/2009 08:46 :
Bonjour Gloops,

Arg je n'ai pas été forcément très claire...

En fait non je ne parlait pas de requête, mais du résultat d'une
requête. Imaginons que tu as un DataSet et que tu l'a déjà chargé dans
ton application. Tu peux prendre ce DataSet qui contient des données et
le passer à ton report pour qu'il affiche ces données. Cela ce fait
comme ceci (petit exemple d'un code que j'utilise souvant avec ASP.net) :

ReportViewer1.LocalReport.ReportPath = "fichier.rdlc"
ReportViewer1.LocalReport.DataSources.Clear();

ReportViewer1.LocalReport.DataSources.Add(
new Microsoft.Reporting.WebForms.ReportDataSource(
"NoDeMonDateSetDansLeReport",
MonDataSet));



ça ressemble à ce qu'on fait avec l'interface, ça, non ?


ReportViewer1.LocalReport.Refresh();

ReportViewer1.DataBind();
ReportViewer1.CurrentPage = 1;

Là où c'est sympathique c'est que le DataSet peut être remplacé par une
liste d'objets.



Ah, tiens, il va falloir que je regarde ça de près ...
1 2