업데이트 구문을 한 번만 호출하고 업데이트 구문에 조건이 없으므로 모든 행이 업데이트되므로 코드가 작동하지 않습니다. 루프에서 update 문을 호출하고 조건을 포함하면 한 번에 한 행만 업데이트됩니다. 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 FROM ApplicationsPaths WHERE TagNum = 3
입니다. 업데이트 문은 UPDATE ApplicationsPaths SET TagNum = TagNum - 1 WHERE TagNum > 3
입니다. update 문은 한 번만 실행되며 2 행 (TagNum = 4 및 TagNum = 5)에만 영향을 미칩니다. 수천 개의 행이 있다고 상상해보십시오. 첫 번째 코드를 사용하면 몇 개의 update 문이 실행됩니까? 변수 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
아니요 응용 프로그램에서 모든 레코드를 프로그래밍 방식으로 추가 된 컨트롤로로드하고이 오름차순 번호를 사용하기 때문에 저는이 작업을 수행 할 수 없습니다. 따라서 마지막 레코드를 제외한 다른 레코드를 제거하면 응용 프로그램에서 아무 것도로드하지 않거나 일부 레코드를로드합니다. 내 응용 프로그램을 통해 새 레코드를 추가하려고하면 동일한 문제가 발생합니다. 마지막 레코드를 제외하고 하나의 레코드가 누락 된 경우라도 모두 엉망입니다 !!! –