2012-05-12 20 views
0

私はsprocを実行する関数に渡す関数で辞書を作成します。VB.NET MySqlCommandストアドプロシージャパラメータの順序?

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に気の鍵を渡しています。私は何かが欠けている必要があります、助けてください!

+0

私はMySqlParameter名は文字で始まるべきであると考えます「?」ストアドプロシージャのパラメータについても同じです。私はこれがあなたの問題の理由であるかどうかは分かりませんが、試してみることができます。 – Steve

答えて

0

これはおそらく役立ちます。 StringDictionary "implements a hash table with the key and the value strongly typed to be strings rather than objects"。

HashTablerepresents a collection of key/value pairs that are organized based on the hash code of the key」。

StringDictionaryにペアを追加すると、キーストリングのハッシュコードによって再編成されます。

StringDictionaryの代わりにSqlParameterCollectionを作成すると、パラメータの名前が付けられ、for eachイテレータは、sprocのパラメータとよく一致する必要があります。

UPDATE

コード例を追加します。

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 
+0

ちょっとピート、答えてくれてありがとう。私は、辞書にパラメータを追加し、各辞書項目をパラメータ.key、.valueとして追加することと、SqlParameterCollectionにパラメータを追加してからそれをコマンドに割り当てることの違いを理解していません。私はまだParamCollectionまたはSqlCommandのいずれかの.AddWithValueオプションを使用しますか? – Theveloper

+0

@Theveloper:説明に役立つコード例を追加しました。違いは、パラメータの名前を付けているので、 'SqlCommand'パラメータコレクションに追加される順序は正しくマッピングされるため問題ではありません。私は別の関数(なぜなら 'SqlCommand'をインスタンス化するときに単純にパラメータを割り当てるのではなく)でパラメータを収集する理由が分かりませんが、それが必要ならば、コード例のようなアプローチを試みます。 – pete

+0

ピートの例をありがとう、私は間違いなく、コレクションに最初にそれらを追加するよりもむしろコマンドに正しく追加することが違いを理解していないにもかかわらず、それを試してみます。 "ExecuteStoredProcedure"にプロシージャ名と関数内で解析される辞書を呼び出す関数がいくつかあるので、前にパラメータを収集していますが、SqlCollectionで同じことをすることができると思います。ご協力いただきありがとうございます。 – Theveloper

0

私は同様の問題を抱えているが、しかし、パラメータ値の私のリストはので、私は手動でリストを作成し、順序の制御することはできませんしていない反射を経由して来ました。

Peteの答えでは、ストアドプロシージャではなく、パラメータ名がプレースホルダとして使用されるテキストコマンドであるため、パラメータのバインディングは常に正しい順序になります。が加えられる。そして、私ができる

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

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

任意の順序でパラメータを追加してください。

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

希望します。

EDIT:あなたは、出力パラメータを持っている場合、このメソッドは動作しません