2011-01-19 17 views
0

リストボックスの値でテーブルを更新する必要があります。私はリストの中にある項目と同じくらい多くのパラメータを作成しようとしていますが、私のコードは以下のようになります。彼らはお互いを上書きしないように?ストアドプロシージャの動的パラメータ?

For Each item As ListItem In ris 
     Dim pID As New SqlParameter("@userid", SqlDbType.Int) 
     pID.Value = objFormat.CheckSQL(item.Value) 
     myCommand.Parameters.Add(pID) 
    Next 

SQL側では、パラメータの動的な数を取る更新文を書くことは可能ですか?区切ら

ので、例えば、私は「アクティブ」フィールドに同じ値を持つ複数のユーザーを更新する必要があります...

答えて

1

ここでは、その上に1つのテイクだ、基本的には単一の文字列のparamで「リスト」を渡し、コンマ(または何でも)とそれをsprocで解析します。

http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

がこの

Since there is no Sqlserver array parameter, what's the best way to proceed?

+0

ありがとう、リスト項目をループして何度もストアドプロシージャを呼び出すのは悪いですか? 1つのストアドプロシージャですべてを行うのではなく、 –

0

再もあります:「ありがとう、それはリスト項目をループに悪いですが、とcすべてのストアドプロシージャは何回ですか? 1つのストアドプロシージャですべてを行うのではなく、 - xrum Jan 19 at 16:55 "

もしあなたがそれについて考えているなら、あなたはどこかで何か反復をやっているでしょう - あなたの値をすべてリストにロードして、記述どおりに更新するのはどうですか?これは少しあなたの特定のuseageにチューニングする必要があります、私は確かではないよ、あなたの組み立てで何をしているか、明らかに

Dim CommandText As String = _ 
    "UPDATE MyTYable SET SomeField = @SomeField " & _ 
    "WHERE UserID = @UserID" 

    Using cn As New SqlClient.SqlConnection(MyConnectionString) 
     Using cmd As New SqlClient.SqlCommand(cn, CommandText) 

      'The Record key in the database: 
      cmd.Parameters.AddWithValue("@UserID", -1) 

      'Whatever it is you plan to UPDATE: 
      cmd.Parameters.Add("@SomeField", "") 

      cn.Open() 

      For Each Item As ListItem In ris 
       cmd.Parameters("@UserID").Value = Item.Value 
       cmd.Parameters("SomeField").Value = SomeValueFromSomeWhere 
       cmd.ExecuteNonQuery() 
      Next 

     End Using 
    End Using 

:それは私だった、私はちょうど私が一度だけの接続を開いたことを確認しますユーザIDのリストであるが、上記のコードスケルトンは、全体的な接続の開閉のオーバーヘッドを招くことなく、一連のINSERTまたはUPDATESを実行する比較的効率的な手段を表す。

実行する必要がある更新の数が本当に厄介な場合は、上記の文字列連結方法のほうが効率的であるか、またはすべての値をUPDATEDにすばやく挿入して裏面Dbの一時表に挿入します、サーバー上の一括INSERTを処理するSELECT INTOステートメントが続きます。

関連する問題