在VB.NET中编写Sql时,由于VB缺少多行字符串,常常会出现一些非常难以理解的内容。
例如:
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之间传输查询变得困难。
是否有一种解决方案可以使VB在VB中可读,并且还允许在VB代码和SSMS(或任何其他SQL编辑器/ IDE)之间轻松传输查询(通过复制/粘贴)?
答案 0 :(得分:3)
我找到的最佳解决方案是使用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实体:
<
变为<
而>
变为>
。
答案 1 :(得分:2)
您是否可以升级到 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。
注意:如果您希望暂时继续使用弃用的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的主要目标,此细节是其中的一部分。(但请记住,XML中这种改进形式的SQL也已弃用,它也可以使用,但请尽快放弃。)
答案 2 :(得分:0)
我打开和关闭自动换行。
Edit
&GT; Advanced
&GT; Word wrap
我发现值得将它添加为Visual Studio工具栏的按钮。