2014-10-13 3 views
-1

У меня есть это 3 Forms в моем проекте, на втором Form У меня есть эта кнопка редактирования, где я отредактирую элемент Listview на третьем Form, но когда я выбираю элемент в поле Listview и нажмите править, появится ошибка. Мне потребовалось несколько часов, чтобы выяснить, в чем проблема, и я оказался здесь. Я что-то упускаю?В VB.NET нет строки в позиции 0

Это моя первая форма со списком в ней.

Imports MySql.Data.MySqlClient 
Public Class Form5 

Public cd As Integer 
Dim con As MySqlConnection 
Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim con As New MySqlConnection 
    con.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
    con.Open() 
    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 Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Form17.Show() 
End Sub 
End Class 

мой второй Form

Imports MySql.Data.MySqlClient 
Public Class Form17 

Public cd As Integer 
Public sConnection As New MySqlConnection 
Private Sub Form17_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    If sConnection.State = ConnectionState.Closed Then 
     sConnection.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
     sConnection.Open() 
    End If 
    LoadPeople3() 
End Sub 
Public Sub LoadPeople3() 
    Dim sqlQuery As String = "select * from candidate where cfname<>'Select a Candidate'" 
    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 

    lvPeople3.Items.Clear() 

    For i = 0 To TABLE.Rows.Count - 1 
     With lvPeople3 
      .Items.Add(TABLE.Rows(i)("idn")) 
      With .Items(.Items.Count - 1).SubItems 
       .Add(AddFieldValue(TABLE.Rows(i), ("cfname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("cmname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("clname"))) 
       .Add(AddFieldValue(TABLE.Rows(i), ("cyr"))) 
      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 lvPeople3_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvPeople3.MouseClick 
    cd = lvPeople3.SelectedItems(0).Selected 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    If cd = Nothing Then 
     MsgBox("Please choose a record to edit.", MsgBoxStyle.Exclamation) 
    Else 
     Dim sqlQuery As String = "SELECT * FROM candidate WHERE cid = '" & lvPeople3.SelectedItems(0).Text & "'" 
     Dim sqlAdapter As New MySqlDataAdapter 
     Dim sqlCommand As New MySqlCommand 
     Dim sqlTabble As New DataTable 

     With sqlCommand 
      .CommandText = sqlQuery 
      .Connection = sConnection 
      .ExecuteNonQuery() 
     End With 

     With sqlAdapter 
      .SelectCommand = sqlCommand 
      .Fill(sqlTabble) 
     End With 
     Form23.cd = lvPeople3.SelectedItems(0).Text 
     Form23.cfname = sqlTabble.Rows(0)("cfname") 
     Form23.cfname = sqlTabble.Rows(0)("cmname") 
     Form23.cfname = sqlTabble.Rows(0)("clname") 
     Form23.ShowDialog() 

     cd = Nothing 
    End If 
End Sub 
End Class 

и мой третий Form

Imports MySql.Data.MySqlClient 
Public Class Form23 

Friend cd As Integer 
Friend cfname As String 
Friend clname As String 
Friend cmname As String 

Public sConnection As New MySqlConnection 

Private Sub Form23_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    If sConnection.State = ConnectionState.Closed Then 
     sConnection.ConnectionString = "server=localhost;user id=root;database=db;password=root" 
     sConnection.Open() 
    End If 

    TextBox2.Text = cfname 
    TextBox3.Text = clname 
    TextBox4.Text = cmname 

End Sub 

Private Sub SimpleButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton1.Click 
    Dim conn As New MySqlConnection 
    Dim cmd As New MySqlCommand 

    conn.ConnectionString = "server = localhost; user id = root; database = db; password = root" 
    cmd.Connection = conn 
    conn.Open() 

    If TextBox1.Text = "" Then 
     MessageBox.Show("Please complete the required fields..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
    Else 
     Dim sqlQuery As String = "UPDATE candidate SET cpos='" & ComboBox1.Text & "', cparty='" & TextBox1.Text & "', candidacy='Filed' WHERE cid='" & cd & "'" 
     Dim sqlCommand As New MySqlCommand 

     With sqlCommand 
      .CommandText = sqlQuery 
      .Connection = sConnection 
      .ExecuteNonQuery() 
     End With 
     MsgBox("Record Updated") 
     Dispose() 
     Form5.Show() 
     Form17.Hide() 
    End If 

    Form5.LoadPeople() 
    Form17.LoadPeople3() 

    Me.Close() 
End Sub 
End Class 

ответ

3

В Button1_Click вы обращаетесь первый DataRow из более DataTable без проверки, если есть один:

Form23.cfname = sqlTabble.Rows(0)("cfname") 
Form23.cfname = sqlTabble.Rows(0)("cmname") 
Form23.cfname = sqlTabble.Rows(0)("clname") 

Вы можете проверить, если есть одна строка, используя DataTable.Rows свойство:

If sqlTabble.Rows.Count > 0 Then 
    Form23.cfname = sqlTabble.Rows(0)("cfname") 
    Form23.cfname = sqlTabble.Rows(0)("cmname") 
    Form23.cfname = sqlTabble.Rows(0)("clname") 
End If 

Так как вы пытаетесь получить все записи по выбору пользователя, я предполагаю, что вы используете неправильное поле. Вы используете дисплей-поле, но вы фильтрации по ID-поля:

"SELECT * FROM candidate WHERE cid = '" & lvPeople3.SelectedItems(0).Text & "'" 

Может быть, это то, что вы на самом деле хотите:

"SELECT * FROM candidate WHERE cfname = '" & lvPeople3.SelectedItems(0).Text & "'" 

Обратите внимание, что вы не должны использовать конкатенацию, но sql- параметры для предотвращения внедрения sql.

+0

но это не дало желаемого результата, ошибка отображается, когда я нажимаю кнопку редактирования на второй «форме», но с этим ничего не делает, я знаю, что я что-то пропустил, но не знаю что это такое, потому что это похоже на то, что кнопка редактирования не может читать мою базу данных на третьей «Форме» или наоборот. хммм. –

+0

@SkyScraper: научитесь использовать отладчик. Затем вы можете выполнить соответствующие строки вашего кода в отладчике, чтобы узнать, что произойдет. Вы видели, что я сомневаюсь, что ваш SQL-запрос фильтрует правильный столбец? Было ли мое предположение правильным? –

Смежные вопросы