更新ステートメントを1回しか呼び出さず、更新ステートメントに条件が含まれていないため、すべての行が更新されるため、コードが機能しません。ループ内の更新ステートメントを呼び出し、条件を含めると、一度に1つの行のみが更新されます。私はAppsCount_Label2がそのテーブルの合計行を保持していると仮定します。カウンタが削除されたものと等しい場合は、ステートメントの呼び出しをスキップします。
Private Sub AppsPaths_DelButton_Click(sender As Object, e As EventArgs) Handles AppsPaths_DelButton.Click
MyConnection.ConnectionString = ConnString
MyConnection.Open()
Dim DBCount As Integer = AppsCount_Label2.Text
Dim i As Integer = 0, j As Integer = 0
Dim strDelete As String
Dim strUpdate As String
strDelete = "DELETE FROM ApplicationsPaths WHERE TagNum = '" & AppToDel_Label.Text & "'"
Try
Dim cmdDelete As OleDbCommand = New OleDbCommand(strDelete, MyConnection)
cmdDelete.ExecuteNonQuery()
cmdDelete.Dispose()
Do
i += 1
If i <> AppToDel_Label.Text Then
j += 1
strUpdate = "UPDATE [ApplicationsPaths] SET [TagNum] = '" & j.ToString & "' WHERE TagNum = '" & i.ToString & "'"
Dim cmdUpdate As OleDbCommand = New OleDbCommand(strUpdate, MyConnection)
cmdUpdate.ExecuteNonQuery()
cmdUpdate.Dispose()
End If
Loop Until i = DBCount
MyConnection.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
のは、あなたが5行を持っていて、delete文がDELETE FROM ApplicationsPaths WHERE TagNum = '2'
あるTagNum = 2を削除しましょう。各反復で更新文は、このようなものです:
変数i = 2(TagNumを削除した)、それは更新ステートメントと変数jの増分の実行をスキップし
UPDATE [ApplicationsPaths] SET [TagNum] = '1' WHERE TagNum = '1'
UPDATE [ApplicationsPaths] SET [TagNum] = '2' WHERE TagNum = '3'
UPDATE [ApplicationsPaths] SET [TagNum] = '3' WHERE TagNum = '4'
UPDATE [ApplicationsPaths] SET [TagNum] = '4' WHERE TagNum = '5'
。しかし、このステートメントは、更新ステートメントのn-1回の実行があり、nは削除ステートメントの前の行数であるため、テーブルに多数の行があると、このコードは良くありません。 RDBMSは、個々の行ではなく行のセットで動作します。したがって、バッチ内のすべてのレコードを更新する方がよいでしょう。コードを修正しましょう。
まず、表のTagNum型を数値型に更新します。
Private Sub AppsPaths_DelButton_Click(sender As Object, e As EventArgs) Handles AppsPaths_DelButton.Click
Try
MyConnection.ConnectionString = ConnString
MyConnection.Open()
Dim strQuery As String
Dim DBCount As Integer = AppsCount_Label2.Text
strQuery = "DELETE FROM ApplicationsPaths WHERE TagNum = " & AppToDel_Label.Text
Using cmd = New OleDbCommand(strQuery, MyConnection)
cmd.ExecuteNonQuery()
End Using
strQuery = "UPDATE ApplicationsPaths SET TagNum = TagNum - 1 WHERE TagNum > " & AppToDel_Label.Text
Using cmd = New OleDbCommand(strQuery, MyConnection)
cmd.ExecuteNonQuery()
End Using
MyConnection.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
まだ5行あり、TagNum = 3を削除したとします。 deleteステートメントはDELETE FROM ApplicationsPaths WHERE TagNum = 3
です。更新ステートメントはUPDATE ApplicationsPaths SET TagNum = TagNum - 1 WHERE TagNum > 3
です。更新文は一度だけ実行され、2行(TagNum = 4およびTagNum = 5)にのみ影響します。何千もの行があると想像してください。最初のコードを使用する場合、いくつの更新ステートメントが実行されますか?変数iがAppToDel_Labelよりも低いときに更新の実行をスキップするように最初のコードを最適化することはできますが、何度も繰り返し実行されます。
EDIT:不要な更新をスキップするように最初のコードを最適化します。あなたが5行を持っているとTagNum = 3を削除した場合
MyConnection.ConnectionString = ConnString
MyConnection.Open()
Dim DBCount As Integer = AppsCount_Label2.Text
Dim i As Integer = 0, j As Integer = AppToDel_Label.Text
Dim strDelete As String
Dim strUpdate As String
strDelete = "DELETE FROM ApplicationsPaths WHERE TagNum = '" & AppToDel_Label.Text & "'"
Try
Dim cmdDelete As OleDbCommand = New OleDbCommand(strDelete, MyConnection)
cmdDelete.ExecuteNonQuery()
cmdDelete.Dispose()
Do
i += 1
If i > AppToDel_Label.Text Then
strUpdate = "UPDATE [ApplicationsPaths] SET [TagNum] = '" & j.ToString & "' WHERE TagNum = '" & i.ToString & "'"
Dim cmdUpdate As OleDbCommand = New OleDbCommand(strUpdate, MyConnection)
cmdUpdate.ExecuteNonQuery()
cmdUpdate.Dispose()
j += 1
End If
Loop Until i = DBCount
MyConnection.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
は更新文は、次のとおりです。TagNum値が変更されないため
UPDATE [ApplicationsPaths] SET [TagNum] = '3' WHERE TagNum = '4'
UPDATE [ApplicationsPaths] SET [TagNum] = '4' WHERE TagNum = '5'
TagNum = 1とTagNum = 2更新文は必要ありません。しかし、行を個別に更新するためにたくさんある場合、それはまだ良くありません。
なぜ迷惑でしょうか?順序付けのために重要なのは相対値だけであり、絶対値ではありません。そこに穴を残すだけで、ソート結果はまったく同じになります。 – jmcilhinney
いいえアプリケーションはプログラムで追加されたコントロールにすべてのレコードをロードし、この昇順の番号を使用するため、できません。したがって、最後のレコードを除く他のレコードを削除した場合、アプリケーションは何もロードしません。私のアプリケーションを通して新しいレコードを追加しようとすると、同じことが起こります。最後のものを除いて1つのレコードが欠落していても、すべてがうんざりです! –