none
Appeler requêtes sql dans C# RRS feed

  • Question

  • Bonjour,

    Je suis entrain de développer une application, qui permet , grosso modo, de manipuler des données d'une BD sur sql server, à savoir, tester des variables de la base, et selon des conditions, faire les instructions adéquates. La question est: comment je pourrai exécuter plusieurs requêtes sql, et les appeler dans mon programme en C#, sachant que les conditions( if, case, for), je veux les utiliser directement dans mes requêtes sql ?

    mardi 16 octobre 2012 13:33

Réponses

  • OK,

    Alors dans un premier temps c'est de savoir quelles tables vont être la source, ensuite quelles seront les destinations ? Est-ce que ça risque de changer ? Est-ce que les colonnes vont aussi changer ou est-ce que ce sera toujours les mêmes ? Quel serait la condition pour insérer ?

    Vous pouvez faire quelque chose du genre :

    INSERT INTO la_table1 (champ1,champ2) SELECT champ1,Champ2 FROM la_table2 WHERE champ_valider=1;

    On suppose dans ce cas que champ_valider est la condition à vérifier. Cette requête vous évites de faire un parcoure des données et de refaire un INSERT. Le mieux serait de faire une procédure ou fonction socké coté SQL qui fait le traitement avec vos condition imbriquées. Sinon en .Net par code faire quelque chose du genre :

    string req=string.Format("INSERT INTO {0} (champ1,champ2) SELECT champ1,Champ2 FROM {1} WHERE champ_valider=1;", "la_table1", "la_table2")

    les valeurs "la_table1/2" seront remplacées par vos variables dynamiques du cas. Vous pouvez faire de même avec champ1, champ2... afin de recréer dynamiquement la chaîne sans faire de redondance contenant plusieurs requêtes imbriquées. Et utiliser ExecuteNonQuery()

    Ceci est un exemple général

     

    Est-ce que vous avez compris ? Et est-ce que c'est ce que vous souhaitez faire ?

     

    Cordialement



    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine mercredi 17 octobre 2012 17:20
    • Marqué comme réponse jackbauer47 jeudi 18 octobre 2012 14:04
    mercredi 17 octobre 2012 17:17

Toutes les réponses

  • Bonjour,

    Dans SQL Server vous avez l'opérateur CASE (http://msdn.microsoft.com/fr-fr/library/ms181765.aspx) qui permet de faire un "if" en SQL.
    La notion de "for" n'existe pas en SQL.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 16 octobre 2012 14:31
    Modérateur
  • Mais le problème, c'est que, je vais utiliser plusieurs tables de ma BDD. Donc pour faire coopérer le tout dans une fonction, que je dois par la suite appeler dans C#, que dois-je faire ?
    mardi 16 octobre 2012 18:56
  • Bonjour,

    Vous pouvez sérialiser vos tables

    ou bien lire vos tables en début de programme et faire des requêtes en mémoire

    Pouvez-vous nous donner un exemple précis ?

    Quelle est la taille de votre BDD ou des tables à requêter ?


    fred on youTube

    fred

    mardi 16 octobre 2012 19:18
  • Je travaille sur un système de calcul MRP, donc la BDD regroupe une centaine de tables, mais moi, je travaille sur seulement 4 ou 5 tables. Je dois, selon la variable que j'ai en entrée, saisie par l'utilisateur, faire des opérations(exemple: je sélectionne les lignes , qui correspondent à la variable entrée, dans une table, et je dois boucler selon le nombre de lignes de la table, remplir des champs dans les autres tables de la BDD, etc.). 

    Donc, je sais pas si je dois boucler sur C# et appeler les requêtes directement, ou je code mes conditions dans SQL server, et j'appelle le tout dans C# ?

    mardi 16 octobre 2012 19:52
  • Moi je bouclerai en C# et j’appellerai les requêtes directement mais peut être que par SQL ce serait plus performant notamment avec des procédures stockées.


    fred on youTube

    fred

    mardi 16 octobre 2012 21:34
  • Merci pour votre aide.

    Juste une dernière chose. J'ai déterminé le nombre de lignes dans une table (select count (*) from dbo.xxx), et je voudrai boucler sur ce nombre, càd, pour chaque ligne de la table, faire des opérations. j'ai pas trouvé une opération sur sql qui me permet d'extraire ligne par ligne et ainsi pouvoir faire ma boucle dans C# ?

    mardi 16 octobre 2012 23:36
  • Merci pour votre aide.

    Juste une dernière chose. J'ai déterminé le nombre de lignes dans une table (select count (*) from dbo.xxx), et je voudrai boucler sur ce nombre, càd, pour chaque ligne de la table, faire des opérations. j'ai pas trouvé une opération sur sql qui me permet d'extraire ligne par ligne et ainsi pouvoir faire ma boucle dans C# ?

    Bonjour,

    il faut utiliser SqlCommand en indiquant une requête select puis utiliser SQLDataReader avec une boucle. Cette méthode va lire ligne par ligne la table.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mercredi 17 octobre 2012 06:35
  • Merci pour votre aide.

    Juste une dernière chose. J'ai déterminé le nombre de lignes dans une table (select count (*) from dbo.xxx), et je voudrai boucler sur ce nombre, càd, pour chaque ligne de la table, faire des opérations. j'ai pas trouvé une opération sur sql qui me permet d'extraire ligne par ligne et ainsi pouvoir faire ma boucle dans C# ?

    Bonjour,

    il faut utiliser SqlCommand en indiquant une requête select puis utiliser SQLDataReader avec une boucle. Cette méthode va lire ligne par ligne la table.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    Donc, dans ce cas là, si je vais lire différentes lignes sur plusieurs tables (différentes conditions IF dans mon programme), je dois affecter plusieurs variables à SQLDataReader ?
    mercredi 17 octobre 2012 14:35
  • Merci pour votre aide.

    Juste une dernière chose. J'ai déterminé le nombre de lignes dans une table (select count (*) from dbo.xxx), et je voudrai boucler sur ce nombre, càd, pour chaque ligne de la table, faire des opérations. j'ai pas trouvé une opération sur sql qui me permet d'extraire ligne par ligne et ainsi pouvoir faire ma boucle dans C# ?

    Bonjour,

    il faut utiliser SqlCommand en indiquant une requête select puis utiliser SQLDataReader avec une boucle. Cette méthode va lire ligne par ligne la table.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    Donc, dans ce cas là, si je vais lire différentes lignes sur plusieurs tables (différentes conditions IF dans mon programme), je dois affecter plusieurs variables à SQLDataReader ?

    Vous avez différente table à lire ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mercredi 17 octobre 2012 15:09
  • Oui. Je vais lire par exemple un champ d'une table, faire une condition sur ce champ, puis selon le résultat, remplir d'autres champs dans d'autres tables.
    mercredi 17 octobre 2012 15:11
  • OK,

    Alors dans un premier temps c'est de savoir quelles tables vont être la source, ensuite quelles seront les destinations ? Est-ce que ça risque de changer ? Est-ce que les colonnes vont aussi changer ou est-ce que ce sera toujours les mêmes ? Quel serait la condition pour insérer ?

    Vous pouvez faire quelque chose du genre :

    INSERT INTO la_table1 (champ1,champ2) SELECT champ1,Champ2 FROM la_table2 WHERE champ_valider=1;

    On suppose dans ce cas que champ_valider est la condition à vérifier. Cette requête vous évites de faire un parcoure des données et de refaire un INSERT. Le mieux serait de faire une procédure ou fonction socké coté SQL qui fait le traitement avec vos condition imbriquées. Sinon en .Net par code faire quelque chose du genre :

    string req=string.Format("INSERT INTO {0} (champ1,champ2) SELECT champ1,Champ2 FROM {1} WHERE champ_valider=1;", "la_table1", "la_table2")

    les valeurs "la_table1/2" seront remplacées par vos variables dynamiques du cas. Vous pouvez faire de même avec champ1, champ2... afin de recréer dynamiquement la chaîne sans faire de redondance contenant plusieurs requêtes imbriquées. Et utiliser ExecuteNonQuery()

    Ceci est un exemple général

     

    Est-ce que vous avez compris ? Et est-ce que c'est ce que vous souhaitez faire ?

     

    Cordialement



    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine mercredi 17 octobre 2012 17:20
    • Marqué comme réponse jackbauer47 jeudi 18 octobre 2012 14:04
    mercredi 17 octobre 2012 17:17
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 18 octobre 2012 13:34