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 :

SqlParameter Typage pour t-sql


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut SqlParameter Typage pour t-sql
    Bonjour,


    Je travail actuellement sur un vieux un projet ou j'ai quelques problèmes avec le typage en VB.NET -> T-SQL notamment sur tout ce qui est float, decimal, money ...

    Le système actuellement utilisé par le projet est le constructeur "SqlParameter (String, Object)", mais à l'heure actuel je ne trouve pas le moyen de faire SqlParameter (String, Object, SqlDbType).

    Ce que j'ai trouvé qui se rapproche le plus de ce que je souhaite mettre en place c'est sur MSDN : "SqlParameter (String, SqlDbType, Int32, String)" ... mais je comprends pas comment il fonction, ou est passé Object ?


    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
     
        Public Function ExecuteDataSet(ByVal commandtext As String) As DataSet
            If arParams.Count > 0 Then
                Dim arParamsList() As SqlParameter = New SqlParameter(arParams.Count) {}
                For i As Integer = 0 To arParams.Count - 1
                    arParamsList(i) = New SqlParameter(CStr(arParams(i)(0)), CStr(arParams(i)(1)))
                Next
                Return SqlHelper.ExecuteDataset(cnn, CommandType.Text, commandtext, arParamsList)
            Else
                Return SqlHelper.ExecuteDataset(cnn, CommandType.Text, commandtext)
            End If
            arParams.Clear()
        End Function
     
        Public Sub AddParam(ByVal paramname As String, ByVal paramvalue As Object)
            Dim tParams As String() = {paramname, paramvalue}
            arParams.Add(tParams)
        End Sub
     
        Public ReadOnly Property Parameters() As ArrayList
            Get
                Return arParams
            End Get
        End Property
    Merci de votre aide

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand la conversion peut se faire implicitement ca marche bien sans préciser le type (decimal vers float ou autre)

    après la syntaxe que tu cherches doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim p as new sqlparameter("@nom", sqldbtype.float)
    p.value = variable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2013
    Messages : 51
    Points : 72
    Points
    72
    Par défaut
    Bien penser à remplacer les valeurs nulles pour les paramètres (Nothing en vb net) par des DBNull.Value

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    @Pol63 :
    quand la conversion peut se faire implicitement ca marche bien sans préciser le type (decimal vers float ou autre)
    Malheureusement sa fonctionne pas avec la syntaxe qu'utilise le projet.

    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
        Private Sub myTest()
     
            Dim dbl As Double = 4.44
            Dim dcl As Decimal = 3.33
     
            Dim reqSql As String = ""
     
            'reqSql = "INSERT INTO SqlTest023 (dcl1, dcl2, flt1, flt2, mny1, mny2) VALUES (@dbl, @dcl, @dbl, @dcl, @dbl, @dcl) "
            'reqSql = "INSERT INTO SqlTest023 (dcl1, dcl2, flt1, flt2, mny1, mny2) VALUES (CAST(@dbl AS decimal(18, 4)), CAST(@dcl AS decimal(18, 4)), CAST(@dbl AS float), CAST(@dcl AS float), CAST(@dbl AS money), CAST(@dcl AS money)) "
            'reqSql = "INSERT INTO SqlTest023 (dcl1, dcl2, flt1, flt2, mny1, mny2) VALUES (CAST('@dbl' AS decimal(18, 4)), CAST('@dcl' AS decimal(18, 4)), CAST('@dbl' AS float), CAST('@dcl' AS float), CAST('@dbl' AS money), CAST('@dcl' AS money)) "
            'reqSql = "INSERT INTO SqlTest023 (dcl1, dcl2, flt1, flt2, mny1, mny2) VALUES (CAST('" & dbl & "' AS decimal(18, 4)), CAST('" & dcl & "' AS decimal(18, 4)), CAST('" & dbl & "' AS float), CAST('" & dcl & "' AS float), CAST('" & dbl & "' AS money), CAST('" & dcl & "' AS money)) "
            'reqSql = "INSERT INTO SqlTest023 (dcl1, dcl2, flt1, flt2, mny1, mny2) VALUES (CAST('" & Replace(dbl, ",", ".") & "' AS decimal(18, 4)), CAST('" & Replace(dcl, ",", ".") & "' AS decimal(18, 4)), CAST('" & Replace(dbl, ",", ".") & "' AS float), CAST('" & Replace(dcl, ",", ".") & "' AS float), '" & Replace(dbl, ",", ".") & "', '" & Replace(dcl, ",", ".") & "') "
     
            'reqSql = "INSERT INTO SqlTest023 (dcl1) VALUES (CAST(@dbl AS decimal(18, 4))) "
            'reqSql = "INSERT INTO SqlTest023 (dcl2) VALUES (CAST(@dcl AS decimal(18, 4))) "
            'reqSql = "INSERT INTO SqlTest023 (flt1) VALUES (CAST(@dbl AS float)) "
            'reqSql = "INSERT INTO SqlTest023 (flt2) VALUES (CAST(@dcl AS float)) "
            'reqSql = "INSERT INTO SqlTest023 (mny1) VALUES (CAST(@dbl AS money)) "
            'reqSql = "INSERT INTO SqlTest023 (mny2) VALUES (CAST(@dcl AS money)) "
     
     
     
     
            Dim statement As String = "---"
            If reqSql <> "" Then
                Dim db As New DAL_SQL
                db.AddParam("@dbl", dbl)
                db.AddParam("@dcl", dcl)
                Try
                    db.ExecuteNonQuery(reqSql)
                    statement = "isOk"
                Catch ex As Exception
                    statement = ex.ToString
                End Try
                db = Nothing
            Else
                statement = "reqSql isEmpty"
            End If
            litRslt.Text = statement
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	Public Function ExecuteNonQuery(ByVal commandtext As String) As Integer
    		Dim x As Integer = -1
    		If arParams.Count > 0 Then
    			Dim arParamsList() As SqlParameter = New SqlParameter(arParams.Count) {}
    			For i As Integer = 0 To arParams.Count - 1
    				arParamsList(i) = New SqlParameter(CStr(arParams(i)(0)), CStr(arParams(i)(1)))
    			Next
    			x = SqlHelper.ExecuteNonQuery(cnn, CommandType.Text, commandtext, arParamsList)
    		Else
    			x = SqlHelper.ExecuteNonQuery(cnn, CommandType.Text, commandtext)
    		End If
    		Return x
    	End Function
    REQ 1 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données varchar en numeric
    REQ 2 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données nvarchar en numeric
    REQ 3 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données varchar en numeric
    REQ 4 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données varchar en numeric
    REQ 5 : OK
    idST23 dcl1 dcl2 flt1 flt2 mny1 mny2
    ----------- --------------------------------------- --------------------------------------- ---------------------- ---------------------- --------------------- ---------------------
    4 4.4400 3.3300 4,44 3,33 4,44 3,33

    REQ 6 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données nvarchar en numeric
    REQ 7 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données nvarchar en numeric
    REQ 8 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données nvarchar en float
    REQ 9 : System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion du type de données nvarchar en float
    REQ 10 : Ok - mais résultat ne correpond pas à l'entrée
    idST23 dcl1 dcl2 flt1 flt2 mny1 mny2
    ----------- --------------------------------------- --------------------------------------- ---------------------- ---------------------- --------------------- ---------------------
    12 0.0000 0.0000 0 0 444,00 0,00
    REQ 11 : Ok - mais résultat ne correpond pas à l'entrée
    idST23 dcl1 dcl2 flt1 flt2 mny1 mny2
    ----------- --------------------------------------- --------------------------------------- ---------------------- ---------------------- --------------------- ---------------------
    13 0.0000 0.0000 0 0 0,00 333,00
    CAST; CONVERT même combat

    @dzediar :

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est pas de ma faute si toi tu donnes un string en paramètre ...
    et c'est une mauvaise idée pour plein de raisons, le séparateur de décimale n'est pas forcément le même d'un pc à l'autre, y compris côté base de données

    je pense que c'est l'origine des données qui est à revoir car un nombre ce n'est pas un string ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    c'est pas de ma faute
    hein ???

    je pense que c'est l'origine des données qui est à revoir car un nombre ce n'est pas un string ...
    Jusque là on est d'accord ...

    tu donnes un string en paramètre ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim dbl As Double = 4.44
            Dim dcl As Decimal = 3.33
    moi ce que j'envoie est "casté" ?!

    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arParamsList(i) = New SqlParameter(CStr(arParams(i)(0)), CStr(arParams(i)(1)))
    tu parles surement de ça du coup ?
    je n'avais pas remarqué mais après test, que ce arParams(i)(1) soit casté string, non casté, ou casté object, j'ai toujours les mêmes résultats.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    efface tout et recommence en plus simple, mais normalement si tu as une variable de type decimal et que tu fais un sqlparameter en lui donnant le decimal sans cast et qu'il n'y a pas de cast dans la requete ca doit passer

    de toute façon s'il y a "impossible de caster un varchar/nvarchar en autre chose" c'est bien que tu as fourni un string au lieu de quelque chose de bien typé au départ


    tu peux aussi mettre un point d'arrêt avant l'execution de la requete pour regarder le contenu des paramètres (shift+F9), et ca te dira le type réel de Value malgré qu'il soit as object
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2017
    Messages : 1
    Points : 0
    Points
    0
    Par défaut hi
    super!

Discussions similaires

  1. Recherche 1 responsable + des contributeurs pour FAQ SQL
    Par trotters213 dans le forum Evolutions du club
    Réponses: 21
    Dernier message: 20/04/2006, 17h10
  2. Quel outil pour PL/SQL ?
    Par ftrifiro dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/09/2005, 13h51
  3. [debutant] probleme pour lancer sql
    Par tomsoyer dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 04/08/2004, 18h29
  4. [debutant] probleme pour lancer sql
    Par tomsoyer dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 03/08/2004, 23h42
  5. Taille Maxi pour un SQL SERVEUR 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/07/2003, 09h37

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