2015-07-30 1 views
1

Lors de l'écriture de SQL dans VB.NET, on finit souvent par quelque chose de complètement illisible en raison du manque de chaînes multilignes de VB.Comment écrire du SQL lisible dans VB.NET

Par exemple:

Dim sql As String = "SELECT t1.Name, t1.Description, t1.Address, t1.PhoneNumber, t2.RegistrationID, t2.Date, t2.Description, t2.RegistrationStatus FROM Users t1 JOIN Registrations t2 ON t1.UserID = t2.UserID WHERE t2.RegistrationID = @RegistrationID" 

Vous pouvez briser la chaîne en utilisant des caractères de continuation de ligne, mais les guillemets supplémentaires et des caractères de continuation de ligne font de ce plus difficile à lire. En outre, il rend le transfert de la requête entre le code et le SSMS difficile.

Existe-t-il une solution qui rend SQL lisible dans VB et permet également de transférer facilement des requêtes (via copier/coller) entre le code VB et SSMS (ou tout autre éditeur SQL/IDE)?

Répondre

2

La meilleure solution que j'ai trouvée est d'utiliser la fonctionnalité XML literals de VB (disponible depuis VS 2008).
Les attributs littéraux XML permettent des chaînes multilignes.

Dim sql As String = 
    <sql text=" 
     SELECT t1.Name, 
       t1.Description, 
       t1.Address, 
       t1.PhoneNumber, 
       t2.RegistrationID, 
       t2.Date, 
       t2.Description, 
       t2.RegistrationStatus 
     FROM Users t1 
       JOIN Registrations t2 ON t1.UserID = t2.UserID 
     WHERE t2.RegistrationID = @RegistrationID 
    " />.Attribute("text").Value 

L'une mise en garde est qu'il faut coder plus-que et moins que les comparaisons comme des entités XML: < devient &lt; et > devient &gt;.

+0

Avec Visual Studio 2015, cette technique devient une solution obsolète, utile uniquement pour la rétrocompatibilité avec les utilisateurs bloqués à Visual Basic plus ancien. Ce n'est plus "la meilleure solution". :) Un candidat pour le refactoring, chaque fois que cela est utilisé. – miroxlav

+0

@miroxlav Pouvez-vous expliquer cela. La fonctionnalité VS 2015 autorise les chaînes multilignes, mais insère des caractères de nouvelle ligne à la fin de chaque ligne. – Blackwood

+0

@Blackwood - devrions-nous demander "pourquoi les nouvelles lignes sont présentes" également avec C# '@" Chaîne multiligne "'? Pensez-vous qu'il y ait une raison pour que l'équivalent VB de ces multi-liners se comporte différemment? Dans VB et C#, vous pouvez toujours supprimer les nouvelles lignes en ajoutant '.Replace (...)'. – miroxlav

0

Je permute l'activation et la désactivation du mot.

Edit>Advanced>Word wrap

je l'ai trouvé intéressant d'ajouter comme un bouton à la barre d'outils Visual Studio.

1

Est-il possible pour vous de mettre à niveau vers Visual Studio 2015?
Vous pouvez utiliser les nouvelles littéraux de chaîne multi-ligne dans Visual Basic 14:

Dim sql As String = " 
    SELECT t1.Name, 
      t1.Description, 
      t1.Address, 
      t1.PhoneNumber, 
      t2.RegistrationID, 
      t2.Date, 
      t2.Description, 
      t2.RegistrationStatus 
    FROM Users t1 
      JOIN Registrations t2 ON t1.UserID = t2.UserID 
    WHERE t2.RegistrationID = @RegistrationID 
" 

Il n'y a pas de limitations déjà connues de XML multi-liners (problèmes <, &, ...). La seule chose dont vous avez besoin pour vous échapper à l'intérieur de la chaîne est " (remplacez-la par "").

Et nouvelle fonctionnalité vous permet de faire vos chaînes lisibles comme jamais avant d'interpolation de chaîne :

Dim tableName As String = "Registrations" 
Dim currentOrderByColumn As String = "t2.Date" 

Dim sql = $"SELECT t1.Name, t1.Description FROM {tableName} ORDER BY {currentOrderByColumn}" 

Dim sql2 = $" 
    SELECT t1.Name, t1.Description 
    FROM {tableName} 
    ORDER BY {currentOrderByColumn} 
" 

expressions à l'intérieur des chaînes interpolées soutenir également entièrement renommage, donc renommer tableName-mainTableName effectuerons également renommer à l'intérieur du chaîne.

caractères supplémentaires que vous devez prendre en charge dans ce type de chaîne sont { et } - vous devez les remplacer par {{ ou }} respectivement. Mais dans T-SQL they have only one specific purpose.

Plus d'informations: 1, 2


Avis: Si vous souhaitez conserver temporairement l'aide solution XML désapprouvée, alors NE PAS utiliser le formulaire
<tag attribute="text" />.Attribute("attribute").Value
parce qu'il supprime nouveau caractères de ligne ce qui conduit à étranges SQL single-liners comme
SELECT t1.Name, t1.Description, t2.Date FROM Users t1.

Au lieu de cela, utilisez le formulaire
<tag>text</tag>.Value
qui préserve les fins de ligne donc ce que vous voyez (dans l'éditeur de code) est ce que vous obtenez (à l'entrée du processeur de commande SQL). La lisibilité SQL est l'objectif principal de cette Q/A et ce détail en fait partie.

(Mais rappelez-vous cette amélioration de la forme de SQL en XML est obsolète, trop = cela fonctionne, mais abandonner le plus tôt possible.)

+0

Tout le monde ne pourra pas mettre à jour vers VS2015. Mais oui, les nouvelles chaînes multilignes et les fonctionnalités d'interpolation de chaînes sont une meilleure solution que les littéraux XML, si on peut effectivement mettre à jour jusqu'en 2015. Etant donné que les cycles de mise à jour internes coïncident rarement avec les versions, je hésiterais . Même si l'on est capable de mettre à jour vers VS2015, on ne peut pas cibler les fonctionnalités disponibles dans VB 14. Tous les membres de l'équipe ne peuvent pas mettre à jour en même temps et certains clients peuvent insister sur les versions précédentes du compilateur. ne pas. –