0

sproc を実行する関数に渡す関数で辞書を作成します。

    Dim PParamDict As New Dictionary(Of String, String)
    PParamDict.Add("sname", name)
    PParamDict.Add("sdescription", description)
    PParamDict.Add("sLoggedInID", LoggedInID)
    PParamDict.Add("sCompanyID", CompanyID)

辞書は関数 PParamDict -> ParameterDict に渡されます

    Dim dbComm As New MySqlCommand(ProcedureName, PConnection)

    Dim pair As KeyValuePair(Of String, String)
    For Each pair In ParameterDict
        dbComm.Parameters.AddWithValue(pair.Key, pair.Value)
    Next

パラメータはディクショナリから追加されます。

これは単純な sproc であり、特別なことはなく、単純な挿入です。

CREATE PROCEDURE `NewCollection`(
IN `sLoggedInID` INT(5), 
IN `sCompanyID` INT(5), 
IN `sname` VARCHAR(20),  
IN `sdescription` VARCHAR(500))

BEGIN
INSERT INTO `collection`
(`userid`, `companyid`, `name`, `description`, `generated`) 
VALUES 
(sLoggedInID, sCompanyID, sname, sdescription, CURRENT_TIMESTAMP);
END

これは、PParamDict.Add ステートメントがその順序である限り機能します。それらが異なる順序である場合、それらは入ってくるときに渡されます。これは私が今まで見た中で最もばかげたことです.sprocで文字ごとに定義されているMySqlCommandにいまいましいキーを渡しています。私は何かが足りないに違いない、助けてください!

4

2 に答える 2

1

同様の問題がありますが、パラメーター値のリストはリフレクションを介して取得されたため、手動でリストを作成せず、順序を制御できません。

ピートの答えでは、パラメーターのバインドは常に正しい順序になります。これはストアド プロシージャではなく、パラメーター名がプレース ホルダーとして使用されるテキスト コマンドであるため、追加される順序は関係ありません。

順序の問題を回避するために、次のように command.CommandType = System.Data.CommandType.StoredProcedure を使用するのではなく、プロシージャを明示的にテキストとして呼び出します (Pete の INSERT のように)。

command.CommandText = "call procname (@param1, @param2, @param3 ... );"

次に、パラメーターを任意の順序で追加できます

command.Parameters.AddWithValue("@param3", 123)
command.Parameters.AddWithValue("@param2", 456)
command.Parameters.AddWithValue("@param1", 789)

お役に立てれば。

編集:出力パラメータがある場合、このメソッドは機能しません

于 2013-10-18T11:23:42.340 に答える
0

おそらくこれが役立つでしょう。StringDictionary"は、オブジェクトではなく文字列に強く型付けされたキーと値を持つハッシュ テーブルを実装します" 。

"は、キーのハッシュ コードに基づいて編成されたキーと値のペアのコレクションを表しますHashTable" .

にペアを追加するStringDictionaryと、キー文字列のハッシュ コードによって再編成されます。

SqlParameterCollectionの代わりにを作成するStringDictionaryと、パラメーターに名前が付けられ、for each反復子は sproc のパラメーターとうまく一致するはずです。

アップデート

コード例を追加します。

Private Function GetParameters(ByVal name As String, ByVal description As String, ByVal LoggedInID As Integer, ByVal CompanyID As Integer) As SqlParameterCollection
    Dim cmd As SqlCommand = New SqlCommand()
    Dim pc As SqlParameterCollection = cmd.Parameters 'SqlParameterCollection constructor is marked as "Friend" so it has to be instantiated this way.'

    pc.AddWithValue("sname", name)
    pc.AddWithValue("sdescription", description)
    pc.AddWithValue("sLoggedInID", LoggedInID)
    pc.AddWithValue("sCompanyID", CompanyID)

    Return pc
End Function

Private Sub ExecuteStoredProcedure(ByVal pc As SqlParameterCollection)
    Dim sp As String = String.Empty
    Dim conn As SqlConnection = Nothing
    Dim cmd As SqlCommand = Nothing
    Dim da As SqlDataAdapter = Nothing
    Dim ds As DataSet = Nothing
    Dim p As SqlParameter = Nothing

    Try
        sp = "INSERT INTO `collection` (`user_id`, `company_id`, `name`, `description`, `generated`) VALUES (`sLoggedInID`, `sCompanyID`, `sname`, `sdescription`, CURRENT_TIMESTAMP)"
        conn = New SqlConnection("your connection string here")
        cmd = New SqlCommand(sp, conn)
        For Each p In pc
            cmd.Parameters.Add(p)
        Next

        da = New SqlDataAdapter(cmd)
        ds = New DataSet
        da.Fill(ds)

    Catch ex As SqlException
        'handle exception'
    Catch ex As Exception
        'handle exception'
    Finally
        If conn IsNot Nothing Then
            conn.Dispose()
        End If
        If cmd IsNot Nothing Then
            cmd.Dispose()
        End If
        If da IsNot Nothing Then
            da.Dispose()
        End If
    End Try
End Sub
于 2012-05-12T17:49:34.377 に答える