IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Requete SQL avec c#


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut Requete SQL avec c#
    Bonjour à tous,

    J'ai fais un petit programme qui effectue des requetes SQL sur une base de données SQL server 2000.

    Tout fonctionne bien pour les requete de base.
    Le soucis vient quand je veux integrer un COUNT.

    Voici ma requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    maRequeteNG = "SELECT *" +
                              "FROM dbo.TECommandsAll with (NOLOCK)" +
                              "INNER JOIN dbo.ProcessData with (NOLOCK)" +
                              "ON ((CASE WHEN PDData01 LIKE '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END)=dbo.TECommandsAll.Code)" +
                              "INNER JOIN dbo.ProcessPassgeNavi with (NOLOCK)" +
                              "ON (PPPCBSerialNumber=PDPCBSerialNumber and PPProcessNumber=PDProcessNumber and PDTimeStamp=PPTimeStamp)" +
                              "WHERE " +
                              "PPProcessNumber=@localprocess " +
                              "AND PPPostID = @localhost " +
                              "AND PPQCStatus = 1 " +
                              "AND PPPassageNumber = 1 " +
                              "AND PPPCBSerialNumber like @PCBSerialNumber " +
                              "AND PPTimeStamp >= @dateToStart and PPTimeStamp <= @dateToStop ";
    ensuite celle ou je veux intégrer le COUNT et qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    maRequeteNG = "SELECT COUNT(CASE WHEN PDData01 like '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END) AS NombreErrCode, " +
                             "FROM dbo.TECommandsAll with (NOLOCK) " +
                             "INNER JOIN dbo.ProcessData with (NOLOCK) " +
                             "ON ((CASE WHEN PDData01 LIKE '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END)=dbo.TECommandsAll.Code) " +
                             "INNER JOIN dbo.ProcessPassgeNavi with (NOLOCK) " +
                             "ON (PPPCBSerialNumber=PDPCBSerialNumber and PPProcessNumber=PDProcessNumber and PDTimeStamp=PPTimeStamp) " +
                             "WHERE " +
                             "PPProcessNumber= @localprocess " +
                             "AND PPPostID = @localhost " +
                             "AND PPQCStatus = 1 " +
                             "AND PPPassageNumber = 1 " +
                             "AND PPPCBSerialNumber like @PCBSerialNumber " +
                             "AND PPTimeStamp >= @dateToStart and PPTimeStamp <= @dateToStop " +
                             "GROUP BY (CASE WHEN PDData01 like '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END) ";
    Ma requete fonctionne sur SQL server management studio...

    Merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Par défaut
    Comment récupères-tu ton résultat?
    Tu utilises un ExecuteScalar()?

  3. #3
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Salut,

    Peux-tu nous montrer l'erreur générée et un peu plus de détails au niveau du code?

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    ca ne sert surtout à rien de faire un count d'un case

    count(*) ou count(un champ) ou count(case ) retournera toujours le meme nombre !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Voici plus de détails :

    J'appuie sur un bouton qui active ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     var p = new clsWorkerParams();
                p.dateToStart = dateToStart;
                p.dateToStop = dateToStop;
                p.project = project;
     
                foreach (CheckBox c in panel1.Controls)
                {
                    if (c.Checked)
                    {
                        ProcessAndHost = c.Tag.ToString();
                        SplitProcessAndHost(ProcessAndHost, out process, out host);
                        p.localprocess = process;
                        p.localhost = host;
                        backgroundWorker1.RunWorkerAsync(p);
     
                        while (this.backgroundWorker1.IsBusy == true)
                        {
                            Application.DoEvents();
                        }
                    }
                }
    mon backgroundWorker1 est en faite ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    ....
    ....
     
    maRequeteNG = "SELECT COUNT(CASE WHEN PDData01 like '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END) AS NombreErrCode, " +
                             "FROM dbo.TECommandsAll with (NOLOCK) " +
                             "INNER JOIN dbo.ProcessData with (NOLOCK) " +
                             "ON ((CASE WHEN PDData01 LIKE '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END)=dbo.TECommandsAll.Code) " +
                             "INNER JOIN dbo.ProcessPassgeNavi with (NOLOCK) " +
                             "ON (PPPCBSerialNumber=PDPCBSerialNumber and PPProcessNumber=PDProcessNumber and PDTimeStamp=PPTimeStamp) " +
                             "WHERE " +
                             "PPProcessNumber= @localprocess " +
                             "AND PPPostID = @localhost " +
                             "AND PPQCStatus = 1 " +
                             "AND PPPassageNumber = 1 " +
                             "AND PPPCBSerialNumber like @PCBSerialNumber " +
                             "AND PPTimeStamp >= @dateToStart and PPTimeStamp <= @dateToStop " +
                             "GROUP BY (CASE WHEN PDData01 like '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,5) END) ";
                //"ORDER BY COUNT(CASE WHEN PDData01 like '_;[0-9][0-9][0-9][0-9][0-9]%' THEN SUBSTRING(PDData01,3,5) ELSE SUBSTRING(PDData01,1,4) END) DESC";
     
                MessageBox.Show(maRequeteNG);
     
                //Création de la commande SQL 
                myCommandNG = new SqlCommand(maRequeteNG, maConnexionSQLsrv);
     
                //Création et décalartion des paramètres 
                myCommandNG.Parameters.Add(new SqlParameter("@localprocess", SqlDbType.VarChar, 6));
                myCommandNG.Parameters.Add(new SqlParameter("@localhost", SqlDbType.VarChar, 6));
                myCommandNG.Parameters.Add(new SqlParameter("@PCBSerialNumber", SqlDbType.VarChar, 11));
                myCommandNG.Parameters.Add(new SqlParameter("@dateToStart", SqlDbType.VarChar, 30));
                myCommandNG.Parameters.Add(new SqlParameter("@dateToStop", SqlDbType.VarChar, 30));
     
                //Attribution des valeurs aux paramètres
                myCommandNG.Parameters["@localprocess"].Value = localprocess;
                myCommandNG.Parameters["@localhost"].Value = localhost;
                myCommandNG.Parameters["@PCBSerialNumber"].Value = PCBSerialNumber;
                myCommandNG.Parameters["@dateToStart"].Value = dateToStart;
                myCommandNG.Parameters["@dateToStop"].Value = dateToStop;
     
                try
                {
                    myCommandNG.Connection.Open();
                    myCommandNG.ExecuteNonQuery();
                    myReaderNG = myCommandNG.ExecuteReader();
                    dtNG.Load(myReaderNG);
                    myCommandNG.Connection.Close();
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("catch");
                    ErrCode = "";
                    NombreErrCode = "";
                    Description = "";
                    process = "";
                    host = "";
                    Console.Write(ex.Message);
                    maConnexionSQLsrv.Close();
                    return "Error connection";
                }
     
                if (dtNG.Rows.Count > 0)
                {
                    MessageBox.Show("collone");
                    ErrCode = dtNG.Rows[0].ItemArray[0].ToString();
                    NombreErrCode = dtNG.Rows[0].ItemArray[1].ToString();
                    Description = dtNG.Rows[0].ItemArray[2].ToString();
                    process = localprocess;
                    host = localhost;
                }
                else
                {
                    MessageBox.Show("pas de collone");
                    ErrCode = "0";
                    NombreErrCode = "0";
                    Description = "0";
                    process = localprocess;
                    host = localhost;
                }
     
                maConnexionSQLsrv.Close();
                return "No Rows";
            }

    J'ai mis des messageBox pour savoir ou il se situe et il m'affiche MessageBox.Show("catch");

    A mon avis cela viens de la syntax SQL.Mais pourquoi SQL Server management prend en compte ma requete....

    J'ai vu qu'il y a une remarque sur ca..
    ca ne sert surtout à rien de faire un count d'un case

    count(*) ou count(un champ) ou count(case ) retournera toujours le meme nombre !
    Que dois je mettre alors ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    count(*)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Requete SQL avec Rand()
    Par leloup84 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/02/2006, 16h41
  2. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58
  3. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  4. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo