2015-07-30 2 views
1

При написании Sql в VB.NET часто бывает что-то совершенно нечитаемое из-за отсутствия многострочных строк VB.Как написать читаемый SQL в VB.NET

Для примера:

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" 

Вы можете разбить строку с использованием линейного продолжения символов, но дополнительные кавычки и продолжения строки символов сделать это труднее читать. Также он затрудняет передачу запроса между кодом и SSMS.

Есть ли решение, которое делает чтение SQL внутри VB, а также позволяет легко передавать запросы (посредством копирования/вставки) между кодом VB и SSMS (или любым другим редактором SQL/IDE)?

ответ

2

Лучшим решением, которое я нашел, является использование функции VB XML literals (доступно с VS 2008).
XML-атрибуты литерала допускают многострочные строки.

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 

Одно предостережение в том, что больше чем и меньше, чем сравнения должны быть закодированы как сущности XML: < становится &lt; и > становится &gt;.

+0

с Visual Studio 2015, эта техника становится устаревшей обходной путь, полезно только для обратной совместимости с пользователями, застрявшими на старой Visual Basic. Больше не «лучшее решение». :) Кандидат на рефакторинг, всякий раз, когда это используется. – miroxlav

+0

@miroxlav Можете ли вы это объяснить. Функция VS 2015 поддерживает многострочные строки, но в конце каждой строки вставляет символы новой строки. – Blackwood

+0

@Blackwood - мы должны спросить «почему новые строки присутствуют» также с C# '@« Многострочная строка »? Считаете ли вы, что есть какая-то причина, по которой эквивалент VB этих мультилайнеров должен вести себя по-другому? В VB и C# вы всегда можете удалить новые строки, добавив '.Replace (...)'. – miroxlav

0

I toggle word wrap on and off.

Edit>Advanced>Word wrap

Я нашел его стоит добавить его в качестве кнопки на панели инструментов Visual Studio.

1

Возможно ли обновление до Visual Studio 2015?
Вы можете использовать новые Многострочные строковые литералы в 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 
" 

Там нет никаких ограничений, ранее известных из XML мульти-вкладышей (проблем с <, & ...). Единственное, что вам нужно избежать внутри строки: " (замените его на "").

И большой новая строка интерполяция функция позволяет сделать ваши строки для чтения, как никогда раньше:

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} 
" 

выражений внутри интерполяции строк также полностью не поддерживают переменные переименовывать, так что переименование tableName в mainTableName также будет выполнять переименование внутри строка.

Дополнительные символы должны заботиться о в этом типе строки являются { и } - вы должны заменить их {{ или }} соответственно. Но в T-SQL they have only one specific purpose.

Дополнительная информация: 1, 2


Примечание: Если вы хотите временно сохранить с помощью XML устаревший метод обхода, то НЕ используйте форму
<tag attribute="text" />.Attribute("attribute").Value
, потому что снимает новый строковые символы Что приводит к странным SQL-симуляторам, например
SELECT t1.Name, t1.Description, t2.Date FROM Users t1.

Вместо этого используйте форму
<tag>text</tag>.Value
который сохраняет строки окончаний так, что вы видите (в редакторе кода) является то, что вы получите (на входе командного процессора SQL). Чтение SQL является основной целью этого Q/A, и эта деталь является его частью.

(Но помните эту усовершенствованную форму SQL в XML является устаревшим, тоже = это работает, но отказаться от него как можно скорее.)

+0

Не каждый сможет обновить VS2015. Но да, новые многострочные строки и функции интерполяции строк являются лучшим решением, чем XML-литералы, если можно действительно обновить до 2015 года. Учитывая, что внутренние циклы обновления редко совпадают с выпусками продуктов, я бы с сомнением назвал решение XML-литеральное решение устарелым , Даже если вы можете обновить VS2015, вы не сможете настроить таргетинг на функции, доступные в VB 14. Не все члены команды могут обновляться одновременно, а некоторые клиенты могут настаивать на предыдущих версиях компилятора .. и т. Д. Устаревший не. –

Смежные вопросы