1

SqlParameterVB.NET で sを作成および初期化するより良い方法を知っている人はいますか? 変数ごとに 3 行を使用するのは、かなり過剰に思えます。残念ながら、このクラスのコンストラクターはかなりばかげているので、各パラメーターを初期化するための独自のサブルーチンを作成することを考えています。これが私がやってきた方法です。

Dim ID As New SqlParameter("@ID", SqlDbType.Int)
ID.Value = val
query.Parameters.Add(ID)

以下は、引数を 1 つしかとらない単純なストア プロシージャにも使用する完全なコードです。ただし、15 ~ 20 かかるものもいくつかあります。これは、この不格好な方法を使用した大量のコード行です。

Dim query As New SqlCommand("spGetInitStatusEntry", connection)
query.CommandType = CommandType.StoredProcedure
Dim ID As New SqlParameter("@ID", SqlDbType.Int)
ID.Value = val
query.Parameters.Add(ID)
Dim dt As New DataTable
Dim da As New SqlDataAdapter(query)
da.Fill(dt)

最終的な実装

Module推奨どおり、2 つのサポート を使用して、次の を作成しました<Extension()>

Module TcomExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub AddParameter(ByRef dbCommand As SqlCommand, ByVal parameterName As String, _
            ByVal parameterValue As Object, ByVal dbType As SqlDbType)

        Dim dbParameter As SqlParameter = Nothing
        dbParameter = dbCommand.CreateParameter

        dbParameter.ParameterName = parameterName
        dbParameter.Value = parameterValue
        dbParameter.DbType = dbType

        dbCommand.Parameters.Add(dbParameter)
    End Sub

    <System.Runtime.CompilerServices.Extension()> _
    Public Function ToDataTable(ByVal value As SqlCommand) As DataTable
        Dim dt As New DataTable
        Using da As New SqlDataAdapter(value)
            da.Fill(dt)
        End Using
        Return dt
    End Function
End Module

そして、私の実装は次のようになります。

Dim spPrefill As New SqlCommand("spGetPrefillStatusEntry", connection) With {.CommandType = CommandType.StoredProcedure}
'Only one line per added parameter.
spPrefill.AddParameter("@ID", val, SqlDbType.Int)
'Populate the table.
dt = spPrefill.ToDataTable()
4

3 に答える 3

3

最初の 2 行を結合することもできます。

Dim query As New SqlCommand("spGetInitStatusEntry", connection) With {.CommandType = CommandType.StoreProcedure}

拡張メソッドもここであなたの友達になることができます:

<Extension()> _
Public Function ToDataTable(ByVal value As SqlCommand) As DataTable
  Dim dt As New DataTable
  Using da As New SqlDataAdapter(value)
    da.Fill(dt)
  End Using
  Return dt
End Function

に対する Mike Hofer の提案に加えてAddWithValue、これは次のように削減できます。

Dim query As New SqlCommand("spGetInitStatusEntry", connection) With {.CommandType = CommandType.StoreProcedure}
query.Parameters.AddWithValue("@ID", key)
Dim dt As DataTable = query.ToDataTable();

の使用に慣れていない場合はAddWithValue、パラメーター情報を 1 行で記述することもできます。

query.Parameters.Add(New SqlParameter("@ID", SqlDbType.Int) With {.Value = key})
于 2012-02-29T22:07:38.030 に答える
2

それらの拡張子で...

 <System.Runtime.CompilerServices.Extension()> _
Public Sub AddParameterValue(ByRef dbCommand As System.Data.Common.DbCommand, ByVal parameterName As String, ByVal parameterValue As Object)
    dbCommand.AddParameter(parameterName, parameterValue)
End Sub


<System.Runtime.CompilerServices.Extension()> _
Public Sub AddParameter(ByRef dbCommand As System.Data.Common.DbCommand, ByVal parameterName As String, Optional ByVal parameterValue As Object = Nothing, Optional ByVal sourceColumn As String = "")
    Dim dbParameter As System.Data.Common.DbParameter = Nothing


    dbParameter = dbCommand.CreateParameter

    dbParameter.ParameterName = parameterName
    dbParameter.Value = parameterValue
    dbParameter.SourceColumn = sourceColumn

    dbCommand.Parameters.Add(dbParameter)

End Sub

...1行のコードでパラメーターを追加できます

Dim query As New SqlCommand("spGetInitStatusEntry", connection)
query.CommandType = CommandType.StoredProcedure
query.AddParameterValue("@ID", key)
Dim dt As New DataTable
Dim da As New SqlDataAdapter(query)
da.Fill(dt) 

関数は非常に一般的で、パラメーターの型は指定されていませんが、本当に必要な場合はパラメーターとして追加できます。

于 2012-02-29T23:54:54.670 に答える
0

query.AddWithValue("@ID", キー)

于 2012-02-29T22:05:20.010 に答える