Comment utiliser un DataSet ???

[Résolu]
Signaler
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005
-
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005
-
Salut,

J'aimerai savoir comment faire pour utiliser un DataSet ??

Actuellement j'ai réussie :

- à générer un DataSet.xsd (cela me permet d'avoir une modélisation de ma table SQL).

- à remplir mes tables:

SIVDataSet m_dsSIV = null;
// Connexion SQL.
OleDbConnection m_sqlConnection = null;
// Connecteur SQL.
OleDbDataAdapter m_sqlAdapter = null;
String szQuery = "select id as Id, nom as Name, prenom as Subname from client";
m_sqlAdapter.SelectCommand = new OleDbCommand(szQuery, m_sqlConnection);
m_sqlAdapter.Fill(m_dsSIV.Exploitant);

Cela fonctionne puisque j'ai bien mes données dans la table que j'ai modélisée.

Par contre je n'arrive pas à accéder aux données (comme dans une table SQL) avec une requéte SQL.

Voilà ce que j'ai trouvée sur Internet:

XmlDataDocument xmlDoc = new XmlDataDocument(m_dsSIV);
XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("//client/*");

String toto = m_dsSIV.GetXml();
DataRow myRow;
foreach (XmlNode myNode in nodeList)
{
myRow = xmlDoc.GetRowFromElement((XmlElement)myNode);
if (myRow != null)
Console.WriteLine(myRow[0]);
}

Pour le moment j'essaye de récupérer les données de la table "client", mais je n'y arrive pas.

Comment faire pour utiliser "xmlDoc.DocumentElement.SelectNodes" correctement ?

Est il possiblement de passer un requête sous la forme SQL ???

En bref comment sa fonctionne ?????????

Merci d'avance pour votre aide

Arlequine.

20 réponses

Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Voilà, j'ai finie par trouver....

Allez voir la source suivante:

http://www.csharpfr.com/code.aspx?ID=26857
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
m_dsSIV.Tables["client"].Rows

pour acceder aux champs de la table "client" est plus sympatique je pense

Cocoricoooooooo !!!!
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Oui, je sais, que je peux faire ça :

foreach (DataRow myRow in m_dsSIV.Client)
{
Console.Writeline(myRow["Name"] ;
}

Mais cela n'est pas trés pratique, surtout quand tu utilise plusieurs table.
J'ai mis des contraintes et des jointures à droite et à gauche, comme dans une vrai table SQL.

Ce que tu me propose ne me permet pas de les utiliser. En théorie, il me semble qu'il est possible de passer en paramêtre une requête semblabe à celle utilisé en SQL
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
ah, je n'avais pas bien saisi alors
il existe bien une methode Select sur les DataTable mais je ne pense pas non plus que ça corresponde à ce que tu veux faire
je manque un peu de pratique (et même de théorie ^^) dans ce domaine donc je ne vois vraiment pas dsl

Cocoricoooooooo !!!!
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Merci d'avoir essayé
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
il existe bien une méthode qui te permet de faire un select sur un dataset :

string requete = "monCHoix1=" + textbox1.text+ " AND monChoix2 = "+textbox2.text+"";
DataRow[] aRow = ds.Tables["MATABLE"].Select(requete);


(monchoix1 et 2 sont des champs de ton dataset...

tu obtient donc un tableau de row que tu peux traiter...en modifiant ton dataset d'origine etc...

si c'est ce que tu veux faire...
Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Ta solution est pas trop mal, mais cela ne me permet pas d'utiliser les jointures que j'ai faite entre chaque table (à moins que je me trompe ??)
Cela permet juste (est c'est déjà pas mal !) de faire des requétes sur une seul table.

Mon probléme:
exemple:

1°Table Client:
IdClient = > clé primaire
Nom
Prenom
IdAdresse => jointure de la table Adresse

2°Table Adresse:
IdAdresse => clé primaire
Adresse
CodePostal
Ville

Sur SQL, si je veux retourner l'adresse d'un client, on ferait comme ceci:

SELECT Nom,Prenom, Adresse, CodePostal, Ville FROM Client,Adresse WHERE IdClient = 1;

Et on obtiendrait les informations que l'on souhaite

Comment faire pour executer le même genre de requête dans mon cas ????

Merci d'avance de vos réponses.

Arlequine
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
Exigeant avec ca... :o)))

et pourquoi ne pas remplir directement ton dataset avec les resultat de tes requetes avec jointure

sinon rien ne t'empeche de remplir ton dataset avec une requete style
SELECT Nom,Prenom, Adresse, CodePostal, Ville FROM Client,Adresse

et après utiliser la méthode du select pour mettre ton idclient=1...

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Je ne peux pas....

Mon DataSet est une copie conforme de ma base de données
Il est soit rempli par une base de données existantes, soit par des fichiers de type *.txt.

Je ne peux pas remplir directement mon Dataset avec les résultats de mes requêtes avec jointure.
Je suis obligée de le faire en direct. Donc d'utiliser les jointures. (Si je créais des tables temporaires cela risque d'alourdir énormément le temps d'exécution, ainsi que la mémoire du PC)

Arlequine
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
je ne vois pas pourquoi tu ne peux pas...
rien ne t'empeche au moment ou tu en a besoin de remplir un dataset (qui n'est pas forcement l'image exacte de ta bdd) de chercher les infos qu'il te faut sur un form load...
en aucun cas je disais de charger toute ta base...
pour ce qui est des tables temporaires...c clair c'est pas la solution...
reste celle des vues que tu pourrais créer sur ta bdd et les consulter par un simple select...
tu fais ta vue avec jointure...
tu consulte ta vue par un bete select...mais sans jointure...
puisque tu consulte la vue comme une table standard...

tu utilise quoi comme bdd ???
sql serveur ??

si oui je peux te filer un exemple de script qui te rempli un dataset en partant de ta requete avec jointure...

bref je vois pas trop ou ce situe ton pb...

utilisation des dataset..;remplisage des dataset....
??

mais si tu me guide je pourrais essayer de te répondre...
tu peux tres bien remplir le dataset avec une requete avec jointure...

sans que ton dataset est exactement la meme tete que ta bdd...

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Voici en détail mon problème:

Le logiciel a pour objectif de générer des fichiers *.txt sur différents formats.

Les données sont celle d'une base de données ou de fichiers *.txt.

Pour cette raison, je modélise la base de données (qui doit étre de la même forme que celle dans SQL Server) afin de montée en mémoire mes données (plus rapide pour le traitement).
Quand je monte en mêmoire, je ne peux pas pré-exécuter mes jointures à l'avance car elles sont différent suivant le format de sortie.

Aprés il faut que j'éxécute différentes réquêtes sur cette base "fictive" afin de générer mes fichiers dans le format souhaité.

Etant donné que j'ai plusieurs formats de fichier différents, donc plusieurs programmes différents, j'ai décidée qu'ils s'appuyeraient tous sur le même DataSet (car la base de données, et la même quelque soit le format de sortie).

Donc quand l'un de ces programmes ce lance, il a pour objectif:

- De remplir mon dataset (commun à l'ensemble des différents programmes => donc pas modifiables ou adaptable en fonction des différents programmes qui l'appelle) avec les données (soit fichier, soit bases de données).

- D'éxécuter les différents requétes afin de récupérer les informations (informations différentes suivant le programme) que le programme a besoin pour créer sont fichier *.txt.

- de remplir le fichier *.txt dans le bon format avec les informations dont il a besoin.

C'est assez compliqué, mais je n'ai pas le choix. C'est pour cette raison que je souhaiterai utilisée l'équivalent des réquétes SQL sur le dataset.

Voilà, j'espére que mon explication est assez claire.

Arlequine
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
oui ben la je comprend mieux le pkoi du comment...

du coup dans ton dataset tu dois avoir des foreign key de défini entre les différentes tables de ton dataset...
avec des tablerelation et tout ca...

tu as jeter un oeuil si tu ne pouvait pas agir sur les tablerelations pour faire tes jointures...

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

En effet entre mes tables, je possède bien des foreign key et tout le tralala qui va avec.

Sa aussi pour conséquence que je suis obligée de la chargée dans un ordre bien précis.

Pour ce qui est d'agir sur les relations, je ne vois pas comment faire. Il faut que je regarde sur Internet si je trouve quelque chose la dessus.
Je ne sais pas si cela permettra de résoudre mon problème, mais il faut toujours essayer ;-).
Si tu as des propositions, je suis preneuse.

Arlequine
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
il y a aussi un moyen de "disabler" :o)) les contraintes...
comme cela tu pourrais charger ton dataset...a l'arrache...

//desactive les contraintes
Mondataset.EnforceConstraints = false;

//Reactive les contraintes
Mondataset.EnforceConstraints = true;



voila qui peux deja t'aider...

pour le reste j'y reflechi pendant la pause repas :o)))

bonne ap a ct'ap...
:big)

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
ca peut peut etre aider ...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconintroductiontodatasetrelations.asp
Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Sa ne me permet pas d'utiliser les jointures.

Je sais que cela doit étre possible car le dataset à été créé dans le but de travailler en mode déconnecté avec des tables de données.

Mais bon tant pis, je vais essayée de faire sans => Je vais bidouillée.

Arthenius, je te remercie pour ton aide.

Arlequine
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
a ton service ....

si jamais tu trouve une solution (pas trop bidouilleuse... :) )
pourra tu me decrire ton mod opératoire par msg privé ou autre :o)))

bon courage pour la suite...

si jamais j'avais une lumière soudaine qui viendrait se poser sur mon clavier..je t'en ferais part....

mais j'ai pas encore assez bossé avec les dataset et les tablerelation.... :blush)

@+

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
J'ai lu en diagonale le problème , mais dans le XML les requêtes se font par XPath notemment le selectnodes

http://xmlfr.org/w3c/TR/xpath/
http://www.google.fr/search?hl=fr&ie=UTF-8&q=xpath&btnG=Rechercher&meta=cr%3DcountryFR

::|The S@ib|::
MVP C#.NET
Messages postés
18
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
18 février 2005

Bon voila, aprés avoir fouillé de tous les cotés, j'ai fini par prendre la solution d'Arthenius, en essayant de l'adapter au mieux
Cela permet tout de même un sacré gain de temp, mais hélas pour remplacer les jointures je suis obligée de passer par des boucles imbriqués.
Voici un exemple:

string resultat ="";

//Trie ascendant efféctuée sur la colonne 1 et 2
string strsort = "colonne1 ASC, colonne2 ASC";

//On récupére que les champs dont la colonne 3 égale à 1. (si on veut faire que la fonction trie, on met la variable requete à vide et sa fonctionne quand même).string requete "colonne3 1";

//On exécute la requéte sur la table MATABLE
DataRow[] aRow = ds.Tables["MATABLE"].Select(requete,STSORT);

//On parcours la table
foreach (DataRow bRow in aRow)
{
//On recupére tous les champs dont la colonne4 (de la table MATABLE2) est égale à la colonne 1 de la table MATABLE.
string requete2 = "colonne4 like " + bRow["colonne1"];

//On exécute la requéte
DataRow[] cRow = ds.Tables["MATABLE2"].Select(requete2);

//On parcours la table
foreach (DataRow dRow in cRow)
{
//On récupére le résultat
resultat = dRow["colonne5"];
}
}


Voilà cela fonctionne trés bien et c'est assez rapide.
Certe quand j'attaque plus de 4 tables à la fois cela commence à faire un peu compliqué, mais en terme de puissance sa peut aller.

J'espére que vous comprenez l'exemple ... ;)

Si quelqu'un trouve un jour une solution pour éxécuter des jointures et ainsi éviter tous ces "foreach", je suis preneuse :big)

Merci à tous.

Arlequine.
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
en l'etat je pense que c'est le mieux....
mais c clair...bonjour les boucles imbriquées....

dioit bien avoir un moyen de travailler sur les table relations....

un jour on trouvera .... :o)))

@+

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."