根据列表框项目检查现有数据库记录项目

Checking existing database record items against listbox items

我有一个数据table,我要在 windows forms application 中添加记录。这个datatable只有2列,第一列是主键,是一个整数。第二列包含姓名,我需要将列表框中的姓名列表自动添加到 table。这些名称中的大多数已经在 table 中有自己的记录,但每次列表框中都会有不同的名称。我需要根据列表框项目检查现有记录项目,以确保没有添加重复项,但如果列表框中有一个名称在数据 table 中不存在,请为该名称添加一条新记录。

到目前为止我尝试过的是:

Private m_cn As New SqlConnection()
Private m_DA As SqlDataAdapter
Private m_CB As SqlCommandBuilder
Private m_DataTable As New DataTable
Private m_IntRowPosition As Integer = 0

Private Sub btnInsertIntoDatabase_Click(sender As Object, e As EventArgs) Handles btnInsertIntoDatabase.Click
    Dim drReadRow As DataRow = m_DataTable.NewRow()
    Dim dcReadCol As DataColumn = m_DataTable.Columns.Item(1)
    Dim intLoopCounter As Integer = 0
    Dim unique As Boolean = True

    If m_DataTable.Rows.Count = 0 Then
        For m_IntRowPosition = 0 To (lstScannedNames.Items.Count() - 1)
            Dim drNewRow As DataRow = m_DataTable.NewRow()
            drNewRow("emp_id") = m_IntRowPosition
            drNewRow("emp_name") = RTrim(lstScannedNames.Items.Item(RTrim(m_IntRowPosition)))

            m_DataTable.Rows.Add(drNewRow)
        Next m_IntRowPosition
        GoTo SomeWhereElse
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ElseIf m_DataTable.Rows.Count > 0 Then

        For m_IntRowPosition = 0 To m_DataTable.Rows.Count
            For intLoopCounter = 0 To lstScannedNames.Items.Count - 1
                If RTrim(m_DataTable.Rows(m_IntRowPosition).Item(1)) = lstScannedNames.Items.Item(intLoopCounter) Then
                    unique = False

                ElseIf RTrim(m_DataTable.Rows(m_IntRowPosition).Item(1)) <> lstScannedNames.Items.Item(intLoopCounter) Then
                    unique = True
                    lstScannedNames.SelectedIndex = intLoopCounter
                    intLoopCounter = lstScannedNames.Items.Count - 1
                End If
            Next intLoopCounter
            If (unique) = True Then
                Dim drNewRow As DataRow = m_DataTable.NewRow()
                drNewRow("emp_id") = m_DataTable.Rows.Count()
                drNewRow("emp_name") = lstScannedNames.Items.Item(lstScannedNames.SelectedIndex)
                m_DataTable.Rows.Add(drNewRow)
            Else
                unique = True
            End If
        Next m_IntRowPosition
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    End If
SomeWhereElse:
    m_DA.Update(m_DataTable)
    MessageBox.Show("Operation Completed")
End Sub

重点领域是 ElseIf 语句。当我 运行 此代码并且数据库中已有记录时,它会将列表中而不是数据 table 中的名字添加到数据 table 中。然后它将列表中的名字添加到新记录中,对于列表中的每个项目,这大约是 20 次,但这取决于列表长度。我一直在尝试不同的事情,我知道我很接近,但我已经停滞了一段时间。

颠倒你的逻辑。遍历列表框中的项目并检查它们是否存在于数据表中

....
For intLoopCounter = 0 To lstScannedNames.Items.Count - 1
   Dim name = lstScannedNames.Items.Item(intLoopCounter)
   Dim rowExist = m_DataTable.Select("emp_name = '" & name & "'")
   if rowExist Is Nothing OrElse rowExist.Length = 0 Then
       Dim drNewRow As DataRow = m_DataTable.NewRow()
       drNewRow("emp_id") = m_DataTable.Rows.Count()
       drNewRow("emp_name") = name
       m_DataTable.Rows.Add(drNewRow)
   End If
Next m_IntRowPosition
...

使用DataTable.Select 方法可避免编写显式循环来查找重复项。并且可以在确定没有重复的情况下直接添加行