2014-10-13 4 views
0

데이터베이스에서 동시에 ListView에있는 항목을 어떻게 삭제합니까? 나는이 코드를 가지고 있지만, 무엇이 잘못 되었는가를 잘 모른다. 그러나 그것은 잘 작동하고 에러가 없지만 어떤 아이템도 삭제하지 않는 것 같다.VB.NET에서 ListView 항목을 삭제하십시오.

여기 내 코드입니다 :

Imports MySql.Data.MySqlClient 
Public Class Form5 

Dim id As Integer 
Dim con As New MySqlConnection 
Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim con As New MySqlConnection 
    If con.State = ConnectionState.Closed Then 
     con.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
     con.Open() 
    End If 
    LoadPeople() 
End Sub 

Public Sub LoadPeople() 
    Dim sConnection As New MySqlConnection 
    sConnection.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
    sConnection.Open() 
    Dim sqlQuery As String = "SELECT * FROM candidate WHERE cfname<>'Select a Candidate' AND candidacy='Filed'" 
    Dim sqlAdapter As New MySqlDataAdapter 
    Dim sqlCommand As New MySqlCommand 
    Dim TABLE As New DataTable 
    Dim i As Integer 


    With sqlCommand 
     .CommandText = sqlQuery 
     .Connection = sConnection 
    End With 

    With sqlAdapter 
     .SelectCommand = sqlCommand 
     .Fill(TABLE) 
    End With 

    LvPeople.Items.Clear() 

    For i = 0 To TABLE.Rows.Count - 1 
     With LvPeople 
      .Items.Add(TABLE.Rows(i)("idn")) 
      With .Items(.Items.Count - 1).SubItems 
       .Add(AddFieldValue(TABLE.Rows(i), ("cpos"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("cfname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("cmname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("clname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("cparty"))) 
      End With 
     End With 
    Next 
End Sub 

Private Function AddFieldValue(ByVal row As DataRow, ByVal fieldName As String) As String 
    If Not DBNull.Value.Equals(row.Item(fieldName)) Then 
     Return CStr(row.Item(fieldName)) 
    Else 
     Return Nothing 
    End If 
End Function 

Private Sub lvPeople_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles LvPeople.MouseClick 
    id = LvPeople.SelectedItems(0).Selected 
End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Dim con As New MySqlConnection 
    Dim sqlCommand As New MySqlCommand 
    con.ConnectionString = "server = localhost; user id = root; database = db; password = root" 
    sqlCommand.Connection = con 
    con.Open() 

    If id = Nothing Then 
     MsgBox("Please choose a record to remove.", MsgBoxStyle.Exclamation) 
    Else 
     Dim result1 As DialogResult = MessageBox.Show("Are you sure to delete this entry?", "Delete Entry", MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
     If result1 = DialogResult.Yes Then 

      Dim sqlQuery As String = "DELETE FROM candidate WHERE cid='" & LvPeople.SelectedItems(0).Text & "'" 

      With sqlCommand 
       .CommandText = sqlQuery 
       .Connection = con 
       .ExecuteNonQuery() 
      End With 
      MsgBox("Record Removed", MsgBoxStyle.Information) 
      LoadPeople() 
      id = Nothing 
     End If 
    End If 
End Sub 
End Class 
+0

'id'는 정수이므로 실제로는 Nothing 일 수 없습니다. 'LvPeople.SelectedItems (0) .Remove()'를 시도 했습니까? – TyCobb

+0

'LvPeople.SelectedItems (0) .Remove()'가 적용 가능하지 않습니다. '표현식이 값을 생성하지 않습니다.'라고 말합니다. –

+0

뭔가 설정하려고 시도 했습니까? 그것은'Sub'입니다. – TyCobb

답변

0

좋아, 문제가 해결. 여기서 유일한 것은 WHERE 절의 내 DELETE 쿼리에 있습니다.

나는이 변경했습니다해야합니다

"DELETE FROM candidate WHERE cid='" & LvPeople.SelectedItems(0).Text & "'"

이에 다음 ListView 컬럼에없는

"DELETE FROM candidate WHERE idn='" & LvPeople.SelectedItems(0).Text & "'"

cid 그 때문이다.

Public Sub LoadPeople() 
Dim sConnection As New MySqlConnection 
sConnection.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
sConnection.Open() 
Dim sqlQuery As String = "SELECT * FROM candidate WHERE cfname<>'Select a Candidate' AND candidacy='Filed'" 
Dim sqlAdapter As New MySqlDataAdapter 
Dim sqlCommand As New MySqlCommand 
Dim TABLE As New DataTable 
Dim i As Integer 


With sqlCommand 
    .CommandText = sqlQuery 
    .Connection = sConnection 
End With 

With sqlAdapter 
    .SelectCommand = sqlCommand 
    .Fill(TABLE) 
End With 

LvPeople.Items.Clear() 

For i = 0 To TABLE.Rows.Count - 1 
    With LvPeople 
     .Items.Add(TABLE.Rows(i)("idn"))  <--------HERE----| 
     With .Items(.Items.Count - 1).SubItems 
      .Add(AddFieldValue(TABLE.Rows(i), ("cpos"))) 
      .Add(AddFieldValue(TABLE.Rows(i), ("cfname"))) 
      .Add(AddFieldValue(TABLE.Rows(i), ("cmname"))) 
      .Add(AddFieldValue(TABLE.Rows(i), ("clname"))) 
      .Add(AddFieldValue(TABLE.Rows(i), ("cparty"))) 
     End With 
    End With 
Next 
End Sub 

우! 하루가 걸렸어.

0

나는 이것이 오래된 게시물이라는 것을 알고있다. 그러나 데이터베이스 연결을 처리하는 서브 루틴을 만드는 것이 좋을 것이라고 지적하고 싶습니다. 각 하위에서 값을 흐리게하고 쿼리 연결을 반복해서 시작하는 것으로 나타났습니다. 여기 내가 단순화를 위해하는 일이있다.

1 개의 변수와 2 개의 함수를 만듭니다. 이것들은 자연스럽게 모듈에 배치되어야합니다. 변수의 이름이 'MyConnection'입니다. 그러면 연결 문자열이 상수로 선언됩니다.

Public Const MyConnection as String = "server=localhost;user id=root;database=db;password=root" 

이제 우리는 SQL 데이터베이스에서 데이터를 가져 오기위한 우리의 기능을해야합니다 : 지금

Public Function GetData(ByVal Command As String, Optional ByVal TableName As String = "", Optional ByRef RecErr As Boolean = False) As DataSet 
    Dim DB As New MySqlConnection 
    Dim DA As New MySqlDataAdapter 
    Dim Cmd As New MySqlCommand 
    Dim tmpData As New DataSet 

    Try 
     DB.ConnectionString = MyConnection 
     DB.Open() 
     Cmd.Connection = DB 
     Cmd.CommandText = Command 
     DA.SelectCommand = Cmd 
     If Len(TableName) > 0 Then 
      DA.Fill(tmpData, TableName) 
     Else 
      DA.Fill(tmpData) 
     End If 

     Return tmpData 
     DB.Close() 
     DB.Dispose() 
     DA.Dispose() 
     Cmd.Dispose() 
     tmpData.Dispose() 

    Catch ex As MySqlException 
     RecErr = True 
     MessageBox.Show("Unable to access database: " & ex.Message) 
    End Try 

    Return tmpData 

End Function 

그리고 SQL 데이터베이스에 데이터를 설정하기위한 우리의 기능 : 또한

Public Function SetData(ByVal Command As String, ByVal TableName As String, Optional ByRef RecErr As Boolean = False) As Integer 
    Dim DB As New MySqlConnection 
    Dim Cmd As New MySqlCommand 
    Dim Ret As Integer 

    Try 
     DB.ConnectionString = MyConnection 
     DB.Open() 
     Cmd.Connection = DB 
     Cmd.CommandText = Command 
     Ret = Cmd.ExecuteNonQuery() 

     DB.Close() 
     DB.Dispose() 
     Cmd.Dispose() 

    Catch ex As MySqlException 
     RecErr = True 
     MessageBox.Show("Unable to access database: " & ex.Message) 
    End Try 

    Return Ret 
End Function 

내가 한 번에 전체 데이터베이스를 가져올 수있는 경우를 간소화하기 위해 테이블 ​​대신 데이터 세트를 사용하십시오. 어쨌든, 당신이 그들을 사용하는 방법은 다음과 같습니다.

Dim Cmd as String = "" 
Dim Data as DataSet 

Cmd = "SELECT * FROM candidate WHERE cfname<>'Select a Candidate' AND candidacy='Filed'" 
Data = GetData(Cmd, "candidate") 

그리고 연기하는거야 :

는이 작업을 수행, 데이터를 얻으려면. 4 줄의 코드에 정보가 있습니다. 이 쿼리는 하나의 테이블과 명령 행에서 많은 행을 가진 데이터 세트를로드합니다. like :

CandidateName = Data.Tables(0).Rows(WhateverRowHasYourData).Item(CandidateNameColumnID).ToString 

나는 그것을 사용하는 사람을 찾기 위해 여기에 남겨 둘 것입니다. 제 생각에 루틴을 단순화하는 것이 더 나은 방법입니다.

관련 문제