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 :

Problemes de requêtes


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 74
    Points
    74
    Par défaut Problemes de requêtes
    Bonjour,

    J'ai une table avec laquelle je remplis un dictionnaire:

    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
    foreach (DataRow row in myLocalDataTable.Rows)
                    {
                        Dictionary<String, Object> parameterList = new Dictionary<String, Object>(); 
                        parameterList["idsResultSessionLap"] = row["idsResultSessionLap"];
                        parameterList["idsResultSession"] = row["tblResultSessionLap.idsResultSession"];
                        parameterList["lngCycle"] = row["lngCycle"];
                        parameterList["lngLapNumber"] = row["lngLapNumber"];
                        parameterList["dtmTestEnd"] = row["dtmTestEnd"];
                        parameterList["blnECEnable"] = row["blnECEnable"];
                        parameterList["strECMode"] = row["strECMode"];
                        parameterList["dblECTemperature"] = row["dblECTemperature"];
                        parameterList["intECSegment"] = row["intECSegment"];
                        parameterList["blnAllTest"] = row["blnAllTest"];
                        parameterList["blnSuccess"] = row["blnSuccess"];
                        parameterList["blnNewLapTranfered"] = row["blnNewLapTranfered"];
                        parameterList["blnReadyToTransfer"] = row["blnReadyToTransfer"];
    puis, j'insere certains enregistrements:

    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
    String queryResultSessionLap = "INSERT INTO ResultSessionLap ";
                    queryResultSessionLap += " (idsResultSession, lngCycle, lngLapNumber, dtmTestStart, dtmTestEnd, blnECEnable, strECMode, dblECTemperature, intECSegment, blnAllTest, ";
                    queryResultSessionLap += " blnSuccess) ";
                    queryResultSessionLap += " VALUES (" + iParameterList["idsResultSession"] + "," + iParameterList["lngCycle"] + ",";
                    queryResultSessionLap += iParameterList["lngLapNumber"] + ", CONVERT(DATETIME, " + iParameterList["dtmTestStart"] + ")," + ", CONVERT(DATETIME, " + iParameterList["dtmTestEnd"] + "),";
                    queryResultSessionLap += iParameterList["blnECEnable"] + ", CONVERT(NVARCHAR(255), " + iParameterList["strECMode"] + ")," + iParameterList["dblECTemperature"] + ",";
                    queryResultSessionLap += iParameterList["intECSegment"] + ", CONVERT(BIT, " + iParameterList["blnAllTest"] + ")," + " CONVERT(BIT, " + iParameterList["blnSuccess"] + "))";
     
      SqlConnection myConnection = null;
                try
                {
                    String connectionString = @"Data Source=SRVSQL2\DEV;Initial Catalog=ATE_Results;User ID=sa;Password=sadevpass";
                    myConnection = new SqlConnection(connectionString);
                    SqlCommand myCommand = new SqlCommand(iQuery, myConnection);
                    myConnection.Open();
                    myCommand.ExecuteNonQuery();
     
     
                }
                catch (Exception e)
                {
                    Console.WriteLine("L'erreur suivante a été rencontrée :" + e.Message);
                }
     
                finally
                {
                    myConnection.Close();
                }

    Mon probleme est le suivant: bien souvent, des valeures du dictionnaire sont vides et ma requete lancée au serveur ne passe pas. La chaine de caractere qui est passée est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ResultSessionLap  (idsResultSession, lngCycle, lngLapNumber, dtmTestStart, dtmTestEnd, blnECEnable, strECMode, dblECTemperature, intECSegment, blnAllTest,  blnSuccess)  VALUES (30,1,20, CONVERT(DATETIME, 2011-07-06 09:57:49),, CONVERT(DATETIME, ),False, CONVERT(NVARCHAR(255),),,, CONVERT(BIT, True), CONVERT(BIT, False))
    On voit bien qu'il manque certaines valeures. De quelle façon puis-je modifier l'initialisation du dictionnaire pour que la requête fonctionne?

    J'obtiens l'exception suivante : {"Incorrect syntax near '09'."}

    merci

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Ce n'est pas le dictionnaire qui pose problème, c'est ton INSERT. C'est une catastrophe du point de vue de la sécurité/maintenance/efficacité.
    Utilise des paramètres SQL pour passer proprement les valeurs dans ta requête.
    Plus d'infos ici: http://webman.developpez.com/article...ameter/csharp/
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Le problème n'est pas seulement les valeurs vides... par exemple je suis pas convaincu que ce bout là fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(DATETIME, 2011-07-06 09:57:49)
    De toutes façons il faut utiliser des requêtes paramétrées pour éviter ce genre de problèmes (cf. ce tuto)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    string queryResultSessionLap = "INSERT INTO ResultSessionLap ";
    queryResultSessionLap += " (idsResultSession, lngCycle, lngLapNumber, dtmTestStart, dtmTestEnd, blnECEnable, strECMode, dblECTemperature, intECSegment, blnAllTest, blnSuccess) ";
    queryResultSessionLap += " VALUES (@idsResultSession, @lngCycle, @lngLapNumber, @dtmTestStart, @dtmTestEnd, @blnECEnable, @strECMode, @dblECTemperature, @intECSegment, @blnAllTest, @blnSuccess)";
     
    ...
     
    SqlCommand myCommand = new SqlCommand(iQuery, myConnection);
    myCommand.Parameters.AddWithValue("@idsResultSession", iParameterList["idsResultSession"]);
    myCommand.Parameters.AddWithValue("@lngCycle", iParameterList["lngCycle"]);
    ...
     
    myCommand.ExecuteNonQuery();
    C'est plus lisible, il n'y a pas de problèmes de format, pas de risque d'injection SQL, et c'est plus performant si tu l'exécutes souvent. Bref, tu gagnes sur tous les tableaux...


    EDIT: oops, grillé

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 74
    Points
    74
    Par défaut
    Bon, j'ai implémenté la procédure mais je un probleme de DateTime que je ne peux résoudre. J'ai essayé plusieurs combinaisons (SqlDbType.DateTime, SqlDbType.DateTime2, etc..) et je ne trouve 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
    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
    SqlConnection maConnexionSQLsrv; 
                SqlCommand myCommand; 
                String ConnexionSQL; 
     
                //Récupération de la chaine de connexion au serveur de base de données 
                ConnexionSQL = @"Data Source=SRVSQL2\DEV;Initial Catalog=ATE_Results;User ID=sa;Password=sadevpass";
                maConnexionSQLsrv = new SqlConnection(ConnexionSQL); 
     
                String queryResultSessionLap = "INSERT INTO ResultSessionLap ";
                queryResultSessionLap += " (idsResultSession, lngCycle, lngLapNumber, dtmTestStart, dtmTestEnd, blnECEnable, strECMode, dblECTemperature, intECSegment, blnAllTest, ";
                queryResultSessionLap += " blnSuccess) ";
                queryResultSessionLap += " VALUES (@idsResultSession,@lngCycle, @lngLapNumber, @dtmTestStart, ";
                queryResultSessionLap += " @dtmTestEnd, @blnECEnable, @strECMode, @dblECTemperature, @intECSegment, @blnAllTest, @blnSuccess)";
     
     
                myCommand = new SqlCommand(queryResultSessionLap, maConnexionSQLsrv); 
     
                //Parameters
                myCommand.Parameters.Add(new SqlParameter("@idsResultSession", SqlDbType.Int, 4));
                myCommand.Parameters.Add(new SqlParameter("@lngCycle", SqlDbType.Int, 4));
                myCommand.Parameters.Add(new SqlParameter("@lngLapNumber", SqlDbType.Int, 4));
     
                myCommand.Parameters.Add(new SqlParameter("@dtmTestStart", SqlDbType.DateTime, 32));
                myCommand.Parameters.Add(new SqlParameter("@dtmTestEnd", SqlDbType.DateTime, 32));
                myCommand.Parameters.Add(new SqlParameter("@blnECEnable", SqlDbType.Bit, 4));
     
                myCommand.Parameters.Add(new SqlParameter("@strECMode", SqlDbType.NVarChar, 255));
                myCommand.Parameters.Add(new SqlParameter("@dblECTemperature", SqlDbType.Float, 25));
                myCommand.Parameters.Add(new SqlParameter("@intECSegment", SqlDbType.SmallInt, 4));
     
                myCommand.Parameters.Add(new SqlParameter("@blnAllTest", SqlDbType.Bit, 8));
                myCommand.Parameters.Add(new SqlParameter("@blnSuccess", SqlDbType.Bit, 25)); 
     
     
     
                //Parameters initialization
                myCommand.Parameters["@idsResultSession"].Value = Convert.ToInt32(iParameter["idsResultSession"]);
                myCommand.Parameters["@lngCycle"].Value = Convert.ToInt32(iParameter["lngCycle"]);
                myCommand.Parameters["@lngLapNumber"].Value = Convert.ToInt32(iParameter["lngLapNumber"]);
     
                myCommand.Parameters["@dtmTestStart"].Value = Convert.ToDateTime(iParameter["dtmTestStart"]);
                myCommand.Parameters["@dtmTestEnd"].Value = Convert.ToDateTime(iParameter["dtmTestEnd"]);
                myCommand.Parameters["@blnECEnable"].Value = Convert.ToByte(iParameter["blnECEnable"]);
     
                myCommand.Parameters["@strECMode"].Value = Convert.ToString(iParameter["strECMode"]);
                myCommand.Parameters["@dblECTemperature"].Value = Convert.ToDouble(iParameter["dblECTemperature"]);
                myCommand.Parameters["@intECSegment"].Value = Convert.ToInt32(iParameter["intECSegment"]);
     
                myCommand.Parameters["@blnAllTest"].Value = Convert.ToByte(iParameter["blnAllTest"]);
                myCommand.Parameters["@blnSuccess"].Value = Convert.ToByte(iParameter["blnSuccess"]); 
     
                try 
                { 
     
                  myCommand.Connection.Open(); 
                  myCommand.ExecuteNonQuery(); 
                  myCommand.Connection.Close(); 
                } 
                catch (SqlException ex) 
                {
                    Console.WriteLine("Ex: " + ex);  // shows exception message in console if any errors occured             
                }

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 179
    Points : 4 493
    Points
    4 493
    Par défaut
    La colonne dans la table est bien défini en datetime?

    quelle est l'erreur?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 74
    Points
    74
    Par défaut
    Voila! Merci!

    {System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
    at System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value)
    at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value)
    at System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime, Byte cb)
    at System.Data.SqlClient.TdsParser.WriteValue(Object value, MetaType type, Byte scale, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    at DataNotUploadedOnSqlServer.DataBaseGateway.insertResultSessionLap(Dictionary`2 iParameter) in C:\Documents and Settings\mbazinet\My Documents\Visual Studio 2010\Projects\DataNotUploadedOnSqlServer\DataNotUploadedOnSqlServer\DataBaseGateway.cs:line 212
    at DataNotUploadedOnSqlServer.Program.uploadRecords(Dictionary`2 iParameterList) in C:\Documents and Settings\mbazinet\My Documents\Visual Studio 2010\Projects\DataNotUploadedOnSqlServer\DataNotUploadedOnSqlServer\Program.cs:line 217
    at DataNotUploadedOnSqlServer.Program.Main(String[] args) in C:\Documents and Settings\mbazinet\My Documents\Visual Studio 2010\Projects\DataNotUploadedOnSqlServer\DataNotUploadedOnSqlServer\Program.cs:line 130}

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 179
    Points : 4 493
    Points
    4 493
    Par défaut
    Beuh mets un break point et regarde ce que vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Convert.ToDateTime(iParameter["dtmTestStart"]);
    Convert.ToDateTime(iParameter["dtmTestEnd"]);
    et si la table est bien definie en datetime
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Si tes colonnes Sql Server et tes variables .net sont typées proprement, il n'est pas utile de préciser le DbType pour créer le paramètre.

    En général, c'est même complétement inutile pour des paramétres en entrée.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 74
    Points
    74
    Par défaut
    J'ai enlevé le Convert et tout se passe bien.

    Un gros merci!

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 179
    Points : 4 493
    Points
    4 493
    Par défaut
    Moi j'aurai regarder pourquoi le ConvertTo pose problème plutot que de le supprimer
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    Moi j'aurai regarder pourquoi le ConvertTo pose problème plutot que de le supprimer
    Dans la mesure où il ne sert strictement à rien ici je ne vois pas trop l'interêt.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 179
    Points : 4 493
    Points
    4 493
    Par défaut
    1) Comprendre pourquoi une opération plante est toujours utile, même si celle-ci ne sert à rien et qu'on la supprime après

    2) Oui c'est vrai qu'ici iParameter[] sont correctement typer,je pensais que c'était des strings et donc laisser la conversion en mode automatique n'est pas une bonne idée ("05/11/2011" faudra-t-il le 05 novembre ou le 11 mai...)

    ps : donc en analysant le problème, il aurait enlever les ConvertTo parce qu'ils sont déjà typer et donc inutile
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL-SERVER] Déconnecter user d'une BD probleme de requête
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/06/2006, 08h19
  2. Probleme avec requête Ajout dans VBA
    Par deglingo37 dans le forum Access
    Réponses: 1
    Dernier message: 26/05/2006, 11h49
  3. [MySQL] php probleme de requête sql
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 03/04/2006, 23h52
  4. [SQL] probleme de requête
    Par Le Rebel dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 15/02/2006, 11h52
  5. Probleme de requête SQL
    Par breizhoo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h22

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