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

VB.NET Discussion :

Erreur Select Datatable


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut Erreur Select Datatable
    Bonjour à tous et à toutes,
    Je bute contre une erreur

    "Une exception non gérée du type 'System.Data.EvaluateException' s'est produite dans System.Data.dll

    Informations supplémentaires : Impossible d'effectuer une opération '<=' sur System.DateTime et System.Double."


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RequeteSql = "client='" & DicoClient.Keys(X) & "' AND [Date anomalie]>=" & DateDebut & " AND [Date anomalie]<=" & DateFin
     
                Dim Result() As DataRow = DtBase.Tables(0).Select(RequeteSql)
    valeur de RequeteSQL au moment du plantage :
    client='PEINTURES DU CENTRE' AND [Date anomalie]>=01/07/2016 AND [Date anomalie]<=30/06/2017

    JE bute dessus je vais regarder dans un datagridview les valeurs de la table ( il se peut que j'ai un couac vu que c'est un dataset généré par une fiche excel qui lui même est un export d'un logiciel, il se peut qu'il comprenne la date en version US ???).
    Merci

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    et avec des DbParameters bien typés ça ne fonctionne pas mieux ? (en plus d'être plus propre et plus sûr).
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Merci,
    Peux tu développer un peu je ne connais pas dbparameters ?
    Cdt

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Vu que tu mets des crochets pour tes noms de table je vais assumer que tu utilises Sql Server.

    Tout d'abord la fiche MSDN du SqlParameter (il y a des info, des exemples et plein de liens utiles).

    L'idée c'est d'utiliser des objets pour générer ta requête plutôt que faire une concaténation à la mano qui peut poser des soucis (injections SQL et erreurs de typage/formatage) et peut être plus difficile à maintenir.

    Voici un petit exemple avec une SqlConnection, une SqlCommand et un SqlDataReader (en C#, je sais pas faire le VB.NET) :

    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
    public void PrintSomeData(string cnxString, int iVal, string strVal, DateTime dtVal) {
    	// on ouvre une connexion en se servant du 'using' qui se charge des closes/dispose
    	using (SqlConnection cnx = new SqlConnection(cnxString)) {
    		// une command pour construire notre requête
    		SqlCommand cmd = new SqlCommand("SELECT someField_1, someField_2 FROM someTable"
    			+ " WHERE someIntegerField = @iField"
    			+ " AND someStringField = @strField"
    			+ " AND someDatetimeField = @dtField", cnx);
    		// on y colle nos paramètres typés, directement valorisés
    		cmd.Parameters.Add("@iField", SqlDbType.Int).Value = iVal;
    		cmd.Parameters.Add("@strField", SqlDbType.VarChar).Value = strVal;
    		cmd.Parameters.Add("@dtField", SqlDbType.VarChar).Value = dtVal;
    		// on utilise un reader pour avoir les données sous forme de flux, et pas un gros paquet en mémoire
    		SqlDataReader rdr = cmd.ExecuteReader();
    		// tant que le reader nous renvoie des tuples
    		while (rdr.Read()) {
    			// on affiche ce qu'on trouve histoire de dire qu'on a pas requêter pour rien
    			Console.Write("> " + rdr["someField_1"].ToString() + " / " + rdr["someField_2"].ToString() + "\r\n");
    		}
    		// on pense bien à fermer le reader
    		rdr.Close();
    	}
    }
    Si t'as du mal à traduire en VB.NET, tu peux voir les exemples de code sur la MSDN.

    Bon dev.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Merci de ta réponse,
    Je pense que si je fais des commandes SQL j'aurai un résultat mais il sera abracadabrant.
    Je m'explique, je viens de vérifier les données dans un datagridview.
    Mes dates sont au format Européennes du coup par exemple il doit mal comprendre une date tel que le 30/01/2014 par exemple il essai de comprendre la version US 01/30/2014 ( vu qu'on est en VB.net) et c'est une date impossible du coup il plante en pensant que c'est une valeur numérique.
    Enfin je crois.

    Si je fais tout en requeteSQL avec des command je vais avoir effectivement un resultat en retour mais les données ne seront pas exploitables.

    Table.select ressemble a du SQL en a l'odeur mais ça n'en est pas. ( la preuve je devrai en SQL ecrire un truc genre Between [colonne]<= 124 AND [colonne]>=105 )

    JE vais creuser de ce cote la
    Merci

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Si tu passes par des objets les locales sont, normalement, gérées automatiquement. Et comme tu sembles être situé en France ta locale doit être fr-FR. Pour la connaitre tu peux regarder la valeur que te renvoie CultureInfo.CurrentCulture.Name (dans System.Globalization). A noter que si ta date en entrée est d'abord une string tu peux lui donner un format lors du parse.

    Dans ta requête concaténée il pense que c'est un chiffre car il n'a aucune indication qu'il s'agit d'autre chose (pas de quote, ni d'appel à une fonction SQL, il tombe directement sur un chiffre). Tu dois pouvoir trouver des fonctions de parse dans SQL Server qui sauront transformer ta string en vraie date, par contre n'oublie pas les quotes ... et ça reste une concat' toute moche :p
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    à jopopmk

    je ne sais pas si on peut utiliser des parametres avec table.select

    à Ashireon
    essaie avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RequeteSql = "client='" & DicoClient.Keys(X) & "' AND [Date anomalie] BetWEEN" & DateDebut & " AND  & DateFin"

  8. #8
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    L'objet DtBase est de type DataSet ?
    Si oui, et que son utilité n'est que d'avoir ce lot de données recherchées, alors tu peux le remplir avec une DbCommand en utilisant un DataAdapter (ou SqlDataAdapter). Tu dois également pouvoir remplir une DataTable de manière similaire.

    Maintenant je connais pas trop ces objets, j'extrais toujours mes données via des flux.
    Tout garder en mémoire n'est pas souvent -jamais ?- utile.
    Plus je connais de langages, plus j'aime le C.

  9. #9
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Bonjour,
    Between ne fonctionne pas car n'est pas reconnu dans l'expression datatable.select (il ne fait pas partie des opérandes reconnues).
    Par contre j'ai trouvé le moyen de faire fonctionner en partie mon expression.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RequeteSql = "(client='" & DicoClient.Keys(X) & "') AND ([Date anomalie]>= #" & DateDebut & "#"
    L'expression fonctionne mais j'ai besoin des dates entre 2 valeurs donc j'ai modifié comme suit mais la nouvelle erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RequeteSql = "(client='" & DicoClient.Keys(X) & "') AND ([Date anomalie]>= #" & DateDebut & "# ) AND ([Date anomalie]<= #" & DateFin & "#)"
    j' ai l'erreur suivante

    Une exception non gérée du type 'System.FormatException' s'est produite dans mscorlib.dll

    Informations supplémentaires : La chaîne n'a pas été reconnue en tant que DateTime valide.

  10. #10
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    De quel type sont tes object DateDebut et DateFin ? Des DateTime ou des string ?
    Plus je connais de langages, plus j'aime le C.

  11. #11
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    peut etre ainsi

    ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imports System.Globalization
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim culture As CultureInfo = New CultureInfo("fr-FR")
     
            RequeteSql = "(client='" & DicoClient.Keys(X) & "') AND ([Date anomalie]>= " & Convert.ToDateTime(DateDebut, culture) & " ) AND ([Date anomalie]<= " & Convert.ToDateTime(DateFin, culture) & ")"

  12. #12
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    A Jopopmk

    Les variables Datedebut ET DateFin sont bien 2 variables Dates construit par Cdate au début du code.

    A shayW

    Cela n'a rien changé du tout , je pense que c’était fait implicitement déjà
    J'ai du ajouter les # à ton code pour borner les dates sinon j'ai l'ancienne erreur qui resurgit.

    Si je ne borne pas les date que je fait un simple controle de typ < cela fonctionne mais si je veux selectionner entre deux dates ca plante. De plus Between n'est pas supportés.

  13. #13
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Oki, alors tu peux essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim rqt As String = "(client='" & DicoClient.Keys(X) & "')" _
    	& " AND ([Date anomalie]>= CONVERT(DATETIME, '" & DateDebut.ToString("dd/MM/yyyy") & "', 103)) " _
    	& " AND ([Date anomalie]<= CONVERT(DATETIME, '" & DateFin.ToString("dd/MM/yyyy") & "', 103))"
    Plus je connais de langages, plus j'aime le C.

  14. #14
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Ca ne fonctionne pas desolé par contre je viens d'avoir une idée
    j'ai ecris en dur ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Request As String = "[client]='PEINTURES DU CENTRE' AND [Date anomalie]<= #06/30/2017# AND [Date anomalie]>= #07/01/2016#"
    cette requête fonctionne , du coup il faut que je transforme tout en string je pense
    Cdt

  15. #15
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Bon ben j'abandonne : soit la doc officielle ne colle pas à ta version, soit la méthode select() est une fraude
    Je retourne à mon connecteur Oracle en C qui, lui, fonctionne comme prévu :p

    Juste par curiosité :
    - c'est quel SGBD/version que tu utilises ?
    - à quoi ressemble la string que je t'ai filée une fois concaténée ?
    - lors de l'exécution obtiens-tu une exception ou juste un résultat incorrect ?
    Plus je connais de langages, plus j'aime le C.

  16. #16
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Je viens de trouver tu étais sur la bonne piste

    Je m'explique il faut écrire la valeur en string de la date au format US pour la requête.
    si je fais une simple conversion to string je l'ai en version europ.
    J'ai donc convertit en version string US du coup cela fonctionne.

    Cdt

  17. #17
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    L'origine du problème est que j'ai fait un travail en vba.
    Mais long a executer et à extraire les données.

    Du coup l’idée est de faire un prog ( je ne connais que le vb.net). Envoyer ma feuille excel dans un dataset et faire mes tris etc...
    Du coup c'est concluant le travail ,effectué en 10min sur excel.vba, est fait en1.5s en travaillant avec des dataset en vb.net
    A la fin je fais interop excel et je réexporte les resultats dans une feuille excel.

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

Discussions similaires

  1. Erreur "SELECT INTO" dans une fonction
    Par mercure07 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/02/2009, 11h34
  2. Erreur SELECT INTO dans une procédure stockée
    Par mercure07 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/12/2008, 08h54
  3. erreur avec datatable
    Par samir dans le forum XMLRAD
    Réponses: 7
    Dernier message: 28/11/2006, 18h09
  4. erreur select case
    Par maximedrouet dans le forum ASP
    Réponses: 4
    Dernier message: 15/05/2006, 14h40
  5. erreur select case
    Par maximedrouet dans le forum ASP
    Réponses: 12
    Dernier message: 06/01/2005, 15h33

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