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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    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
    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 : 43
    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    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
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    quelle est l'erreur?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    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
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    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

+ 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