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

Phénomène étrange avec SQL Server

4 réponses
Avatar
ILoveCSharp
J'effectue cette requ=EAte dans SQL Server :

SELECT TOP 5 *
FROM awe_actualites
ORDER BY DateActu DESC

Aucun probl=E8me, ce qui est obtenu est le r=E9sultat=20
escompt=E9. Maintenant, dans mon application C#, j'effectue=20
la requ=EAte suivante, cens=E9e =EAtre exactement la m=EAme :

command =3D "use [" + this.DataBase + "]\r\n"+
"SELECT TOP " + number.ToString () + " *\r\n"=20
+
"FROM awe_actualites\r\n" +
"ORDER BY DateActu DESC";

Je stocke les r=E9sultats dans un Hashtable, et le r=E9sultat=20
est compl=E8tement diff=E9rent. Je suppose donc que cela=20
provient de mon code.

Le voici, en substance :

public Hashtable GetNews ()
{
Hashtable ht =3D new Hashtable ();

int number =3D 5; // Nombre d'actualit=E9s =E0 retourner

command =3D "use [" + this.DataBase + "]\r\n"+
"SELECT TOP " + number.ToString () + " *\r\n"=20
+
"FROM awe_actualites\r\n" +
"ORDER BY DateActu DESC";

SQLDMO.QueryResults results =3D serv.ExecuteWithResults (=20
command, command.Length );

for ( int i =3D 1; i <=3D results.Rows; i++ )
{
Je stocke les r=E9sultats sous la forme d'un objet=20
appel=E9 actu
ht.Add ( actu.Id, actu )
}
}

Pr=E9cision : le champ DateActu est de type Varchar, les=20
dates sont au format AAAA-MM-JJ HH:MM:SS

Pour r=E9cup=E9rer les r=E9sultats, je fais :

Hashtable ht;
ht =3D bdd.GetNews ();

ArrayList al =3D new ArrayList ();

foreach ( Actualite actu in ht.Values ) // Mon objet=20
Actualite
{
al.Add ( new ListValues ( actu ) );
}
Repeater1.DataSource =3D al;
Repeater1.DataBind();

Je place donc le tout dans un aspRepeater.

L=E0, mes actualit=E9s apparaissent non ordon=E9es. Auriez-vous=20
une solution ?

4 réponses

Avatar
ILoveCSharp
J'ai finalement résolu mon problème par l'utilisation
d'un ArrayList à la place d'un Hashtable, mais j'avoue
que j'ai du mal à comprendre pourquoi maintenant ça
marche :s
Avatar
Bruno Jouhier [MVP]
Une hashtable set à "indexer" des objets. On les insère avec une clé, et on
peut ensuite les retrouver rapidement à partir de la clé. L'accès par clé
est très rapide mais en revanche la hashtable ne préserve pas l'ordre dans
lequel les couples clé/objet ont été insérés. L'ordre que l'on obtient en
énumérant les Values de la hashtable est très différent de l'ordre
d'insertion (et difficile à prévoir).

En revanche un ArrayList conserve l'ordre d'insertion.

Bruno

"ILoveCSharp" a écrit dans le message
de news: 434901c4a038$235b5f60$
J'effectue cette requête dans SQL Server :

SELECT TOP 5 *
FROM awe_actualites
ORDER BY DateActu DESC

Aucun problème, ce qui est obtenu est le résultat
escompté. Maintenant, dans mon application C#, j'effectue
la requête suivante, censée être exactement la même :

command = "use [" + this.DataBase + "]rn"+
"SELECT TOP " + number.ToString () + " *rn"
+
"FROM awe_actualitesrn" +
"ORDER BY DateActu DESC";

Je stocke les résultats dans un Hashtable, et le résultat
est complètement différent. Je suppose donc que cela
provient de mon code.

Le voici, en substance :

public Hashtable GetNews ()
{
Hashtable ht = new Hashtable ();

int number = 5; // Nombre d'actualités à retourner

command = "use [" + this.DataBase + "]rn"+
"SELECT TOP " + number.ToString () + " *rn"
+
"FROM awe_actualitesrn" +
"ORDER BY DateActu DESC";

SQLDMO.QueryResults results = serv.ExecuteWithResults (
command, command.Length );

for ( int i = 1; i <= results.Rows; i++ )
{
Je stocke les résultats sous la forme d'un objet
appelé actu
ht.Add ( actu.Id, actu )
}
}

Précision : le champ DateActu est de type Varchar, les
dates sont au format AAAA-MM-JJ HH:MM:SS

Pour récupérer les résultats, je fais :

Hashtable ht;
ht = bdd.GetNews ();

ArrayList al = new ArrayList ();

foreach ( Actualite actu in ht.Values ) // Mon objet
Actualite
{
al.Add ( new ListValues ( actu ) );
}
Repeater1.DataSource = al;
Repeater1.DataBind();

Je place donc le tout dans un aspRepeater.

Là, mes actualités apparaissent non ordonées. Auriez-vous
une solution ?
Avatar
Ambassadeur Kosh
parceque la Hashtable range les elements dans l'ordre qui l'arrange elle. en
fait, on ne devrait meme pas dire ça. il n'y a pas de notion d'ordre dans
une hashtable. c'est comme dans un ensemble. ça a seulement la possibilité
d'être enumeré.
Avatar
ILoveCSharp
Merci beaucoup :)