2016-07-20 8 views
0

私はwindows forms applicationにレコードを追加するデータテーブルを持っています。このデータテーブルは2列しか持たず、最初の列は主キーで整数です。 2番目の列には名前が含まれているので、リストボックスからテーブルに名前のリストを自動的に追加する必要があります。これらの名前の大部分はすでにテーブルに独自のレコードがありますが、そのたびにリストボックスに異なる名前が表示されます。私は重複が追加されていないことを確認するために、既存のレコード項目をリストボックス項目と照合する必要がありますが、リストボックスにデータテーブルに存在しない名前がある場合は、その名前の新しいレコードを追加します。リストボックス項目に対して既存のデータベースレコード項目を確認する

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文です:私がこれまで試してみました何

はこれです。このコードを実行すると、データベースに既にレコードがある場合、リストに含まれ、データテーブルにない最初の名前がデータテーブルに追加されます。次に、リストの最初の名前を新しいレコードに追加します。これはリスト内の各項目について約20回ですが、リストの長さによって異なります。私は別のものを試してきました。私は近いと知っていますが、私はしばらく詰まっています。

答えて

0

ロジックを反転させます。リストボックス内の項目をループし、それらがDataTable.Selectメソッドを使用してデータテーブル

.... 
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 
... 

に存在しているかどうかをチェックし、重複を見つけるために、明示的なループを記述するために避けることができます。そして、重複がないことが確かなときに行を直接追加することができます

+0

私は今試してみて、私はそれが動作するようになった後、これを答えとしてマークします。ありがとう、結構です! – Lacuna

+0

'IsNothing'を' Is Nothing'に変更して、 'DataRow'をエラーにしていたので' Boolean'型に変換しないようにしなければなりませんでした。彼らの間の違いは分かりませんが、期待どおりに動作します。おかげで束 – Lacuna

+0

私の悪い、訂正。ここで相違点を参照してくださいhttp://stackoverflow.com/questions/5791/vb-net-isnothing-versus-is-nothing – Steve

関連する問題