44 votes

Java, bouclage de l'ensemble des résultats

En Java, j'ai une requête comme celle-ci :

String querystring1= "SELECT rlink_id, COUNT(*)"
                   + "FROM dbo.Locate  "
                   + "GROUP BY rlink_id ";

La table rlink_id contient ces données :

Sid        lid
 3           2
 4           4
 7           3
 9           1

Comment extraire ces valeurs à l'aide d'un ResultSet Java ?

Voici ce que j'ai pour l'instant :

String show[] = {rs4.getString(1)};
String actuate[] = {rs4.getString(2)};
asString = Arrays.toString(actuate);

45voto

Maurice Perry Points 18154
List<String> sids = new ArrayList<String>();
List<String> lids = new ArrayList<String>();

String query = "SELECT rlink_id, COUNT(*)"
             + "FROM dbo.Locate  "
             + "GROUP BY rlink_id ";

Statement stmt = yourconnection.createStatement();
try {
    ResultSet rs4 = stmt.executeQuery(query);

    while (rs4.next()) {
        sids.add(rs4.getString(1));
        lids.add(rs4.getString(2));
    }
} finally {
    stmt.close();
}

String show[] = sids.toArray(sids.size());
String actuate[] = lids.toArray(lids.size());

0 votes

Cela ne devrait-il pas être un "do- while" ? L'itérateur n'est-il pas déjà dans la bonne position pour accéder à la première ligne au début ? (sinon, pourquoi les tutoriels n'accédant qu'à la première ligne fonctionneraient-ils autrement) ?

0 votes

Certainement pas (la requête pourrait ne renvoyer aucune ligne). De quel tutoriel parlez-vous ?

0 votes

Ok, merci, cela a résolu mon problème. U.U il y avait un mauvais tutoriel en première position dans une recherche google, il semble avoir disparu maintenant.

17voto

Rangi Lin Points 3636

Result Set contiennent en fait plusieurs lignes de données et utilisent un curseur pour indiquer la position actuelle. Ainsi, dans votre cas, rs4.getString(1) ne permet d'obtenir que les données de la première colonne de la première ligne. Pour passer à la ligne suivante, vous devez appeler next()

un exemple rapide

while (rs.next()) {
    String sid = rs.getString(1);
    String lid = rs.getString(2);
    // Do whatever you want to do with these 2 values
}

Il existe de nombreuses méthodes utiles dans ResultSet Vous devriez y jeter un coup d'œil :)

1 votes

Lorsque j'appelle ce sid n lid quelque part dans la boucle, il ne me donne que la première ligne de valeurs.

0 votes

La fonction rs.next() de la boucle while ne permet-elle pas de sauter le premier résultat ?

4 votes

@Durin : Vérifier la javadoc de ResultSet.next() le "curseur" est en fait un point avant la première ligne lorsqu'elle est créée :)

1voto

i000174 Points 106
  • Le ResultSet doit être fermé.
  • PreparedStatement peut protéger contre l'injection SQL.
  • Le PreparedStatement doit finalement être fermé.

L'extrait pourrait donc ressembler à ceci :

PreparedStatement ps = connection.prepareStatement(sql);
try(ResultSet rs = ps.executeQuery()){
    while(rs.next()) {
        String val = rs.getString(1);
    }
}

-2voto

Santosh Points 9794

Le problème avec votre code est :

     String  show[]= {rs4.getString(1)};
     String actuate[]={rs4.getString(2)};

Cela créera un nouveau tableau à chaque fois que vous bouclerez (et non pas un append comme vous pouvez le supposer) et donc à la fin vous n'aurez qu'un seul élément par tableau.

Voici une autre façon de résoudre ce problème :

    StringBuilder sids = new StringBuilder ();
    StringBuilder lids = new StringBuilder ();

    while (rs4.next()) {
        sids.append(rs4.getString(1)).append(" ");
        lids.append(rs4.getString(2)).append(" ");
    }

    String show[] = sids.toString().split(" "); 
    String actuate[] = lids.toString().split(" ");

Ces tableaux contiendront tous les éléments nécessaires.

4 votes

C'est la façon la plus étrange de créer des tableaux que j'ai jamais vue. De plus, que se passe-t-il si l'une des chaînes que vous obtenez contient un espace ?

0 votes

OP stocke un int et non une chaîne de caractères. Il n'y aura donc pas d'espace, c'est certain. C'est juste une autre façon de créer un tableau en dehors des méthodes suggérées par d'autres personnes.

0 votes

Ok, cette fois ça va marcher. Pour moi, c'est comme un anti-modèle. Les programmeurs devraient désapprendre les mauvais modèles, et apprendre les bons modèles avant que cela ne conduise à un crash critique du système. J'ai vu cela plusieurs fois (malheureusement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X