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 :

Utiliser des fonctions VB dans des clauses SQL [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Utiliser des fonctions VB dans des clauses SQL
    Bonjour,

    J'ai un cas particulier de requête avec jointures qui me génère des cases vides dans une colonne supposée comporter des valeurs numériques.
    Pour la suite de mon projet, j'ai besoin que ces valeurs vides soient remplacées par des 0.

    Par exemple si
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select Prix from MaTable
    me sort une colonne avec des valeurs vides (détectables par IsNothing je suppose), je souhaite que ces valeurs passent à zéro.

    Sous Access, que je maîtrise mieux que VB.NET, la solution était simple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Select nulltozero(Prix) from MaTable

    où nulltozero était une fonction définie par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function NullToZero(UneValeur As Variant) As Variant
    ' Argument(s)           : une valeur de type Variant
    ' Action                : convertit les valeurs Null en zéros.
    ' Valeur(s) renvoyée(s) : une valeur non-Null ou zéro
     
        If IsNull(UneValeur) Then
            NullToZero = 0
        Else
            NullToZero = UneValeur
        End If
    End function
    J'ai bien tenté la même méthode en adaptant cette fonction en langage VB.NET mais le problème n'est pas la syntaxe de la fonction mais le fait qu'elle soit reconnue dans la SQL ce qui n'est pas le cas ; en effet, un message d'erreur apparaît disant que "nulltozero" n'est pas reconnue par SQL Server Compact Edition.

    Donc ma question est générale :
    - Existe-t-il un moyen d'utiliser des fonctions dans une requête SQL ?

    Nota : le cas de syntaxe SQL que j'ai donné pour exemple est trivial. Il est bien entendu que ma syntaxe réelle est bien plus compliquée.

  2. #2
    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
    Non, on ne peut pas appeler une fonction VB depuis SQL (quoi qu'avec SQLite c'est possible en fait...)

    Par contre, la plupart des dialectes SQL proposent une fonction pour remplacer NULL par une autre valeur : NVL sous Oracle, ISNULL sous SQL Server, IFNULL sous MySQL ou SQLite...

    Sous SQL Server Compact, ISNULL existe mais ne fonctionne pas comme sous SQL Server (ça prend un seul paramètre et ça renvoie un booléen). A la place, tu peux utiliser COALESCE, une méthode plus générale qui prend un nombre indéterminé d'arguments et renvoie le premier qui n'est pas NULL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COALESCE(Prix, 0) FROM MaTable

    Ca a aussi l'avantage d'exister sur la plupart des SGBD

  3. #3
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    En SQL tu as ISNULL qui correspondrait à ce que tu cherches.

    Et oui il est possible d'utiliser des fonctions Vb.Net à l'intérieur de ta requête mais ça dépend de plein de choses (ta fonction, ta finallité, etc )... Et bien sûr que tu sois dans l'appli, depuis un SGBD non. (Edit Post-Tomlev)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim req as String = "Insert into matable values('" & FonctionTruc() & "'")
    Dans ton cas la solution est faisable en SQL, mais le cas échéant tu aurais pu lire le jeu d'enregistrement retourné, et pour chaque enregistrement remplacer Nothing(Null) par 0.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  4. #4
    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
    Citation Envoyé par _Ez3kiel Voir le message
    En SQL tu as ISNULL qui correspondrait à ce que tu cherches.
    Sous SQL Server, oui, mais sous SQL Compact la fonction ISNULL fonctionne différemment (ISNULL(test) vérifie juste si test est NULL, comme si faisais test IS NULL)

    Citation Envoyé par _Ez3kiel Voir le message
    Et oui il est possible d'utiliser des fonctions Vb.Net à l'intérieur de ta requête mais ça dépend de plein de choses (ta fonction, ta finallité, etc )... Et bien sûr que tu sois dans l'appli, depuis un SGBD non. (Edit Post-Tomlev)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim req as String = "Insert into matable values('" & FonctionTruc() & "'")
    Oui mais dans ce cas ce n'est pas vraiment dans la requête, tu utilises juste la fonction pour construire la requête... le SGBD ne peut pas aller exécuter du code qui se trouve chez le client.

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Ca marche nickel avec COALESCE. Merci ! J'ai cherché plusieurs heures sans trouver.

    @_Ez3kiel

    Désolé mais avec ISNULL, bien que la SQL l'accepte, le résultat numérique n'est pas correct. J'ai pas trop creusé pourquoi parce que COALESCE fonctionne mais merci du tuyau.

    C'est sûr que dans le cas de ton bout de code, l'insertion d'une fonction marche parce qu'elle remplace un valeur unique convertible en string dans la clause SQL.
    Mais mon exemple, quoique trivial est plus compliqué parce que la fonction doit impacter chaque ligne de la table.

    Dans ton cas la solution est faisable en SQL, mais le cas échéant tu aurais pu lire le jeu d'enregistrement retourné, et pour chaque enregistrement remplacer Nothing(Null) par 0.
    Avant que vous me répondiez, c'est la piste que j'étais en train d'explorer. J'allais tester la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function ReplacePrix(ByVal table As DataTable, ByVal champ As DataColumn) As DataTable
            Dim monview As New DataView(table)
            For Each ligne As DataRowView In monview
                If ligne(champ.ColumnName) = Nothing Then
                  ligne(champ.ColumnName) = 0
                End If
            Next
            Return table
        End Function
    Mais je pense qu'elle est foireuse. notamment la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne(champ.ColumnName) = 0
    Je suppose qu'il y a une instruction plus spécifique pour modifier une valeur de la table. J'avoue encore patauger avec les Datatruc...

    Et puis de toute façon, ça aurait été vachement plus compliqué dans ma vraie SQL car il aurait fallu que j'applique cette fonction au champ d'une requête et non d'une table...

    Sinon, pour ma gouverne personnelle, SQLite est-il mieux ou moins bien que SQL Server compact ?
    Qu'est ce qui change fondamentalement ? (Sachant que mon usage est surtout la gestion de base de donnée locale intimement associée à l'application VB)

  6. #6
    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
    Citation Envoyé par noftal Voir le message
    Sinon, pour ma gouverne personnelle, SQLite est-il mieux ou moins bien que SQL Server compact ?
    C'est difficile de répondre de façon objective... c'est un peu comme si je te demandais ce qui est le mieux entre Renault et Peugeot, chacun a un avis différent et forcément subjectif...

    Les deux ont des caractéristiques un peu similaires :
    - SGBD léger "in process" (les requêtes s'exécutent dans le processus de l'application, et non sur un serveur)
    - pas de serveur, juste un fichier sur le disque
    - fonctionnalités réduites par rapport à un SGBD serveur
    - adapté pour l'embarqué

    J'ai utilisé les deux, et chacun a ses avantages et ses inconvénients :
    - SQLite est multi-plateforme, on le retrouve sous Linux, sous Android, sous iOS, sous Windows, etc
    - SQL Compact s'intègre un peu mieux avec les outils Microsoft (Visual Studio, SQL Server Management Studio, Sync Framework...)
    - SQLite permet de définir en C# ou VB des fonctions qui seront utilisables à partir de SQL
    - SQLite supporte une moins grande partie du standard SQL
    - SQL Compact est un peu plus compliqué à déployer (il faut soit l'installer sur la machine cible, ce qui est un peu lourd, soit déployer une vingtaine de fichiers avec l'application), alors qu'un fichier DLL suffit pour SQLite.

    Ayant l'expérience des deux, j'aurais plutôt tendance à choisir SQLite pour mes futurs projets, mais ce n'est qu'un avis personnel...

  7. #7
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Je serais assez tenté de basculer sur SQLite notamment pour la raison suivante
    - SQL Compact est un peu plus compliqué à déployer (il faut soit l'installer sur la machine cible, ce qui est un peu lourd, soit déployer une vingtaine de fichiers avec l'application), alors qu'un fichier DLL suffit pour SQLite.
    J'ai trouvé la page suivante pour installer SQLite : http://system.data.sqlite.org/index....downloads.wiki

    Seulement, je ne sais pas exactement quel lien utiliser. Pouvez-vous m'orienter sachant que je suis sous Win7 64 bits et que j'utilise Visual Studio Express 2010 ?

  8. #8
    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
    Citation Envoyé par noftal Voir le message
    Seulement, je ne sais pas exactement quel lien utiliser. Pouvez-vous m'orienter sachant que je suis sous Win7 64 bits et que j'utilise Visual Studio Express 2010 ?
    Oui c'est un peu galère leur page de téléchargement, on sait jamais quel package il faut prendre

    Le plus simple, c'est de l'installer avec Nuget (si tu n'as pas encore Nuget, installe-le à partir d'ici). Prends le package System.Data.SQLite

  9. #9
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Euh, je crois me souvenir que cette méthode n'est pas possible sur la version Express de VS.

    Pourtant j'ai bien un truc qui ressemble à ça dans le gestionnaire d'extension (voir photo en PJ) mais je ne sais pas comment l'utiliser ensuite.
    Images attachées Images attachées  

  10. #10
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Je suis sous VS2012 Express, chez moi il faut passer par OUTILS>Gestionnaire de Package de Bibliothèque>Gérer les packages NuGet pour la solution.

    Et dans le formulaire qui apparaît tu recherches sqlite dans la barre de recherche.

    Un exemple en screen :
    Images attachées Images attachées   
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  11. #11
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Petite précision : Nuggets est fourni avec VS2012 par défaut mais pas avec VS2010 Express (et n'est pas non plus installable avec VS2010 Express).

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

Discussions similaires

  1. [PostgreSQL] Utiliser une fonction PHP dans une requête SQL
    Par Toiine dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/11/2014, 12h16
  2. Réponses: 5
    Dernier message: 09/09/2011, 23h07
  3. Réponses: 6
    Dernier message: 22/05/2006, 13h54
  4. Creer des fonctions qui émule des fonctions Access
    Par steelidol dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2006, 18h42
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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