Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/06/2011, 16h27   #1
Membre à l'essai
 
Homme Mathieu
Étudiant
Inscription : mai 2011
Messages : 86
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 86
Points : 21
Points : 21
Par défaut [SQL Server 2008 & C#] Datareader imbriques

Bonjour,

J'ai la table suivante (unique table de ma base de donnee sql server) :

Code :
1
2
3
4
5
6
7
8
9
 
 
Name  Description     Type   Min   Max    Feature   Storage   FileName
-----  -----------  ----   ---  ---   -------   -------   --------
ACM     untruc        int     0     50     bla       imported  un.xml
ACM     untruc        int     5     50     bla       imported  deux.xml
ACM     untruc        int     0     50     bla       imported  trois.xml
ACM     untruc2       int     7     50     bla       imported  quatre.xml
ACM     untruc2       int     0     35     bla       imported  cinque.xml
Je souhaiterais recuperer les FileName des lignes possedant les memes caracteristiques de la colonne Description a la collonne Feature (comprise)

J'ai d'abord essaye avec les datareader en selectionnant d'abord les lignes distinctes aue je souhaite (SqlCommand "val") et ensuite pour chaque ligne de mon reader je recherche tous les FileName possedant cette ligne (SqlCommand "select") et je traite le resultat :

Code :
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
 
 
SqlCommand val = new SqlCommand("SELECT DISTINCT Description, Type, Min, Max, Feature FROM Variables WHERE Name = @Name", form1.con);
val.Parameters.ADD(new SqlParameter("@Name", SqlDbType.VarChar, 400));
val.Parameters["@Name"].Value = name;
rdr = val.ExecuteReader();
 
while (rdr.READ())
{
descr = rdr[0].ToString();
type = rdr[1].ToString();
min = rdr[2].ToString();
max = rdr[3].ToString();
feat = rdr[4].ToString();
SqlDataReader rdr2 = NULL;
SqlCommand selec = new SqlCommand("SELECT FileName FROM Variables WHERE Description = @desc AND Type = @type AND Min = @min AND Max = @max AND Feature = @feat AND Name = @Name", form1.con);
selec.Parameters.ADD(new SqlParameter("@desc", SqlDbType.VarChar, 400));
selec.Parameters["@desc"].Value = DESC;
selec.Parameters.ADD(new SqlParameter("@type", SqlDbType.VarChar, 400));
selec.Parameters["@type"].Value = type;
selec.Parameters.ADD(new SqlParameter("@min", SqlDbType.VarChar, 400));
selec.Parameters["@min"].Value = min;
selec.Parameters.ADD(new SqlParameter("@max", SqlDbType.VarChar, 400));
selec.Parameters["@max"].Value = max;
selec.Parameters.ADD(new SqlParameter("@feat", SqlDbType.VarChar, 400));
selec.Parameters["@feat"].Value = feat;
rdr2 = selec.ExecuteReader();
while (rdr2.READ()) // erreur 
{
     // Je traite mes FileName
}
rdr2.Close();
}
rdr.Close();
Mais bien sur j'ai une erreur au niveau du
Code :
rdr2 = selec.ExecuteReader();
J'ai vu plusieurs sujets traitant de cela mais je n'ai pas vraiment compris les solutions ... ou alors elles ne marchent pas.

Merci d'avance,

Mathieu
poupou63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 16h45   #2
Membre à l'essai
 
Homme Mathieu
Étudiant
Inscription : mai 2011
Messages : 86
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 86
Points : 21
Points : 21
En fait j'ai trouve une solution !

Je ne sais pas si c'aest la meilleure et la plus optimal mais elle marche.

J'ai tout simplement ouvert une seconde connection que j'affecte a mon datareader rdr2.

Si jamais il existe de mailleures solutions, je suis preneur !
poupou63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 19h05   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Une simple requête SQL suffit...

Comme vous n'avez pas respecté la charte de postage, voici le script DDL employé
Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE T_MATABLE_TBL
(TBL_NAME         VARCHAR(32),
 TBL_DESCRIPTION  VARCHAR(256),
 TBL_TYPE         VARCHAR(16),
 TBL_MIN          INT,
 TBL_MAX          INT,
 TBL_FEATURE      VARCHAR(32),
 TBL_STORAGE      VARCHAR(32),
 TBL_FILENAME     VARCHAR(128))
Code :
1
2
3
4
5
6
7
INSERT INTO T_MATABLE_TBL
VALUES 
('ACM', 'untruc', 'int', 0, 50, 'bla', 'imported', 'un.xml'),
('ACM', 'untruc', 'int', 5, 50, 'bla', 'imported', 'deux.xml'),
('ACM', 'untruc', 'int', 0, 50, 'bla', 'imported', 'trois.xml'),
('ACM', 'untruc2','int', 7, 50, 'bla', 'imported', 'quatre.xml'),
('ACM', 'untruc2', 'int', 0, 35, 'bla', 'imported', 'cinque.xml');
et maintenant la requête :

Code :
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
WITH 
T0 AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY TBL_DESCRIPTION, TBL_TYPE, TBL_MIN, TBL_MAX, TBL_FEATURE 
                             ORDER BY TBL_FILENAME) AS N
 FROM T_MATABLE_TBL),
T1 AS
(SELECT N, TBL_DESCRIPTION, TBL_TYPE, TBL_MIN, TBL_MAX, TBL_FEATURE, CAST(TBL_FILENAME AS VARCHAR(max)) AS ALL_FILENAME, 1 AS NB
 FROM   T0
 UNION ALL
 SELECT T0.N, T0.TBL_DESCRIPTION, T0.TBL_TYPE, T0.TBL_MIN, T0.TBL_MAX, T0.TBL_FEATURE, T1.ALL_FILENAME +', ' + T0.TBL_FILENAME, T1.NB + 1
 FROM   T0
        INNER JOIN T1
              ON T1.N = T0.N + 1
                 AND T0.TBL_DESCRIPTION = T1.TBL_DESCRIPTION
                 AND T0.TBL_TYPE = T1.TBL_TYPE
                 AND T0.TBL_MIN = T1.TBL_MIN
                 AND T0.TBL_MAX = T1.TBL_MAX
                 AND T0.TBL_FEATURE = T1.TBL_FEATURE),
T2 AS
(SELECT TBL_DESCRIPTION, TBL_TYPE, TBL_MIN, TBL_MAX, TBL_FEATURE, ALL_FILENAME,
        ROW_NUMBER() OVER(PARTITION BY TBL_DESCRIPTION, TBL_TYPE, TBL_MIN, TBL_MAX, TBL_FEATURE 
                          ORDER BY NB DESC) AS NN 
 FROM   T1)                                          
SELECT *
FROM   T2
WHERE  NN = 1
Au passage, beaucoup d'horreur :
  • nom de table avec un S
  • nom de colonne étant des mots réservés de SQL : Name, Description, Type, Min, Max, FileName...

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h59.


 
 
 
 
Partenaires

Hébergement Web