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

"" と "+" を使用してこのようなクエリをフォーマットするのは少し面倒ですか? 再フォーマットせずに (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 での答えは実際には No だと思います。vb.net では、" や + などを使用せずに複数行にわたって文字列を作成することはできません。C# では、"@" エスケープ文字を使用して複数行にわたって文字列をスパンできます。ビットこのような:

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

しかし、VB.Net には同等のものはありません。

アップデート

以下の D.. のコメントによると、Xml リテラルはこの問題を解決できます。http://www.codeproject.com/Articles/292152/Mutliline-String-Literals-in-VB-NETを参照してください。

基本的に、リンクに従って、Xml リテラルを使用して次のような巧妙なことを行うことができます。

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

コードでは生の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 に答える
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 に答える
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はプレースホルダー "{0}" を your_id に置き換えます。your_id は選択された person の ID です。

于 2012-04-17T08:51:10.000 に答える