2

我有一个项目,我们直接在代码中使用 SQL 查询。

Dim strSQL As String = "SELECT P.NAME, C.ID, C.NAME" +
         "FROM PERSONS P " + 
"INNER JOIN CITIES " +
"ON P.IDCITY = C.ID" +
"WHERE P.ID = {0}"

使用“”和“+”格式化这样的查询有点烦人有没有办法编写脚本“As Is”(来自 SQL 文件),而不重新格式化它?

我会用

strSQL = My.Resources.SELECT_PERSON_WITH_CITY

但在调试中我看不到/修改原始查询。

我知道,我知道,这不是直接使用 SQL 的最佳实践,但是,我使用我所拥有的。

PS。

正如 Conor Gallagher 提到的,在 C# 中有一种方法可以实现这一点:

string x = @"
  my 
  name 
  is {0}";
string y = string.Format(x, "jimmy");

有人知道VB.NET 等价物吗?

4

6 回答 6

5

我相信 vb.net 中的答案实际上是否定的,如果不使用 " 和 + 等,您不能在 vb.net 中创建多行字符串。在 C# 中,您可以使用 "@" 转义字符跨越多行字符串。位像这样:

string x = @"
  my 
  name 
  is {0}";
string y = string.Format(x, "jimmy");

但是 VB.Net 没有等价物。

更新

根据下面D.. 的评论,Xml Literals 可以解决这个问题。请参阅http://www.codeproject.com/Articles/292152/Mutliline-String-Literals-in-VB-NET

基本上,根据链接,您可以使用 Xml Literals 执行类似这样的巧妙操作:

Dim sourceText As String =
    <string>
        Imports Microsoft.VisualBasic
        Imports System
        Imports System.Collections
        Imports Microsoft.Win32
        Imports System.Linq
        Imports System.Text
        Imports Roslyn.Compilers
        Imports System.ComponentModel
        Imports System.Runtime.CompilerServices
        Imports Roslyn.Compilers.VisualBasic

        Namespace HelloWorld
          Module Program
            Sub Main(args As String())
              Console.WriteLine("Hello, World!")
            End Sub
          End Module
        End Namespace
    </string>

更新 2

一直在玩这个。XmlLiterals 实际上非常好!如果您想将变量添加到循环中,您可以执行以下操作:

Dim x As String
Dim y As String
y = "Jimmy"

x = <string>
        Select *
        From Person
        Where Person.FirstName = <%= y %>
    </string>
于 2012-04-17T09:00:49.953 回答
2

您必须使用SQLParameters,而不是手动格式化您的查询!!

Dim con AS New SqlConnection("...")
Dim cmd As New SqlCommand(
    "SELECT P.NAME, C.ID, C.NAME FROM PERSONS P " +
    "INNER JOIN CITIES ON P.IDCITY = C.ID " +   
    "WHERE P.ID = @id", con)
cmd.Parameters.AddWithValue("@id" , your_id)
于 2012-04-17T08:47:04.417 回答
1

我使用brijpad复制长 SQL 查询,粘贴到左侧,高级选项卡 > 单击文本到 VB.NET,它将生成等效的 VB.NET 字符串并在我们的代码中使用它。

如果有任何参数,我使用“自定义格式”来生成命令参数语法。

mycmd.Parameters.AddWithValue("@Par" , parVal)
于 2012-04-17T08:49:59.167 回答
1

http://www.dpriver.com/pp/sqlformat.htm

对我来说最好的辅助代码格式化程序。您只需粘贴长 SQL 语句,它就会为 vbnet 生成可复制的代码。它不仅支持VBNet,还支持C#、PHP、Delphi等。

于 2012-04-17T08:53:58.940 回答
1

您真的应该在代码中使用参数化查询而不是原始 SQL,而是为您的问题提供可能的答案:

您可以使用一个StringBilder类来添加改进的格式:

    Dim sb As New StringBuilder()
    With sb
        .Append("SELECT P.NAME, C.ID, C.NAME")
        .Append("  FROM PERSONS P ")
        .Append("  INNER JOIN CITIES ")
        .Append("    ON P.IDCITY = C.ID")
        .Append("  WHERE P.ID = {0}")
        Debug.WriteLine(sb.ToString)
    End With

我创建了自己的 DataAccess 类,该类对此进行了扩展,并允许我连接查询并在每行末尾添加一个空格,以防我忘记添加一个空格(如您的示例所示):

Class DataAccess
    Private _queryString As New StringBuilder(String.Empty)

    Public Sub QryAdd(ByVal query As String)
        _queryString.Append(query.TrimEnd + " ")
    End Sub

    Public ReadOnly Property QryStr As String
        Get
            Return _queryString.ToString.TrimEnd()
        End Get
    End Property
End Class
于 2012-04-17T10:26:59.440 回答
0

你可以这样做 :

Dim strSQL As String = "SELECT P.NAME, C.ID, C.NAME FROM PERSONS P INNER JOIN CITIES ON P.IDCITY = C.ID WHERE P.ID = {0}"
Dim formattedSQL As String = String.Format(strSQL,your_id)

String.Format将用 your_id 替换占位符“{0}”,your_id 是所选人员的 id。

于 2012-04-17T08:51:10.000 回答