2011-02-01 2 views
0

データベースを更新しましたが、他のものではない最初の行に対してのみ行います。私の更新ボタンは、最初にチェックされた行だけを更新します。その他のものはありません。

 Protected Sub btnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) 

    For Each row As GridViewRow In GridView6.Rows 
     ' Selects the text from the TextBox 
     Dim selectedcheck As CheckBox = CType(row.FindControl("chkselect"), CheckBox) 

     If selectedcheck.Checked = True Then 
      Dim id As Label = CType(row.FindControl("id"), Label) 
      cmd.Parameters.AddWithValue("@id", id.Text) 
      cmd.Parameters.AddWithValue("@compby", txtagent.Text) 
      cmd.Parameters.AddWithValue("@compdate", lbldate.Text) 
      cmd.Parameters.AddWithValue("@comments", txtcomments.Text) 


      cmd.CommandText = "dbo.updatetasks" 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Connection = conn 

      conn.Open() 

      cmd.BeginExecuteNonQuery() 

      conn.Close() 
     End If 

    Next 

End Sub 

enter image description here

UPDATE dashboardtasks 
     SET compby = @compby, 
      comments = @comments, 
      compdate = @compdate 


     WHERE id = @id; 
+0

'BeginExecuteNonQuery'は、コマンドの実行が完了する前に戻ります。あなたは確かにすぐ後に接続を閉じるべきではありません。コマンドを完了させるには、同期ExecuteNonQueryを使用します。あなたは非同期コマンドを引き続き使用したい場合は、接続を開いたままにしたIAsyncResultがBeginExecuteNonQuery' 'から返さキャプチャし、それをやっているかを理解するために、ストアドプロシージャのコードが必要になる場合がありますEndExecuteNonQuery' –

+0

'で、後でそれを使用する必要があります。あなたはキーIDで行を更新しているようです。 idが一意の場合は、1つのレコードのみを更新します。あなたが一連のidフィールドをループしていないのを見て、私はそれが期待どおりに動作すると言います。しかし、ストアドプロシージャを見ることは役に立ちます。 – anothershrubery

+0

私は私のストアドプロシージャコードを追加しました、私はアイデンティティを介してループですか? – MyHeadHurts

答えて

1

私は仕事に次を期待する:

Protected Sub btnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) 

    For Each row As GridViewRow In GridView6.Rows 
     ' Selects the text from the TextBox 
     Dim selectedcheck As CheckBox = CType(row.FindControl("chkselect"), CheckBox) 

     If selectedcheck.Checked = True Then 
      Dim id As Label = CType(row.FindControl("id"), Label) 
      cmd.Parameters.Clear()  '<---- Stop adding more and more parameters 
      cmd.Parameters.AddWithValue("@id", id.Text) 
      cmd.Parameters.AddWithValue("@compby", txtagent.Text) 
      cmd.Parameters.AddWithValue("@compdate", lbldate.Text) 
      cmd.Parameters.AddWithValue("@comments", txtcomments.Text) 


      cmd.CommandText = "dbo.updatetasks" 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Connection = conn 

      conn.Open() 

      cmd.ExecuteNonQuery() '<--- Don't use the asynchronous variant if you're not going to obey the contract 

      conn.Close() 
     End If 

    Next 

End Sub 

あなたがしたい場合は、悪いことをしたい、何を言って素敵な例外を得ているでしょうExecuteNonQueryの同期バリアントを使用するか、非同期メソッドの契約に従います(ここでは、EndExecuteNonQueryに電話してSQL呼び出しの結果を検出する必要があります)

+0

はあなたをとても感謝更新 – MyHeadHurts

関連する問題