繁体   English   中英

无法更新数据库中的记录

[英]Cant update a record in a database

我正在为我的课程制作一个家庭作业/修订程序。 我正在按照本教程http://www.homeandlearn.co.uk/NET/nets12p9.html的说明制作数据库,但是“我的更新”按钮(btnUpdate)出现问题

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click

    txtFirstName.Text = ds.Tables("Users").Rows(inc).Item(1) = txtFirstName.Text
    txtSurname.Text = ds.Tables("Users").Rows(inc).Item(2) = txtSurname.Text
    txtUsername.Text = ds.Tables("Users").Rows(inc).Item(3) = txtUsername.Text
    txtPassword.Text = ds.Tables("Users").Rows(inc).Item(4) = txtPassword.Text
    txtClass.Text = ds.Tables("Users").Rows(inc).Item(5) = txtClass.Text
    txtAdmin.Text = ds.Tables("Users").Rows(inc).Item(6) = txtAdmin.Text
    txtHWP.Text = ds.Tables("Users").Rows(inc).Item(7) = txtHWP.Text

    MessageBox.Show("Data updated")
End Sub

如果我在此文本框中进行任何更改,然后单击“更新” 发生这种情况,除我已更改的文本框外,所有内容均更改为TRUE

Public Class AdminEditUsers 'this is the whole code

Dim MaxRows As Integer

Dim inc As Integer
Dim con As New OleDb.OleDbConnection 'THE CONNECTION OBJECT 

Dim dbProvider As String 'HOLDS THE PROVIDER 
Dim dbSource As String 'HOLDS THE DATA SOURCE 
Dim MyDocumentsFolder As String 'HOLDS THEDOCUMENTS FOLDER 
Dim TheDatabase As String 'HOLDS THE DATABASE NAME 
Dim FullDatabasePath As String 'HOLDS THE DATABASE PATH 

Dim ds As New DataSet 'HOLDS A DataSet OBJECT 
Dim da As OleDb.OleDbDataAdapter 'HOLDS A DataAdapter OBJECT 
Dim sql As String 'HOLDS A SQL STRING 

Private Sub AdminEditUsers_load(sender As Object, e As EventArgs) Handles Me.Load


    'SET UP THE PROVIDER 
    dbProvider = "PROVIDER=Microsoft.ACE.OLEDB.12.0;"

    'SET THE DATABASE AND WHERE THE DATABASE IS 
    TheDatabase = "\Visual Studio 2015/NEW_database.accdb"
    MyDocumentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    FullDatabasePath = MyDocumentsFolder & TheDatabase

    'SET THE DATA SOURCE 
    dbSource = "Data Source = " & FullDatabasePath

    'SET THE CONNECTION STRING 
    con.ConnectionString = dbProvider & dbSource

    'OPEN THE DATABASE 
    con.Open()

    'STORE THE SQL STRING 
    sql = "Select * FROM tbl_user"

    'PASS THE SQL STRING AND CONNECTION OBJECT TO THE DATA_ADAPTER 
    da = New OleDb.OleDbDataAdapter(sql, con)

    'Fill the dataset with records from the database table
    da.Fill(ds, "Users")

    'CLOSE THE DATABASE 
    con.Close()
    'Counts how many rows are in the table
    MaxRows = ds.Tables("Users").Rows.Count

    inc = -1

End Sub
Private Sub NavigateRecords()
    txtFirstName.Text = ds.Tables("Users").Rows(inc).Item(1)
    txtSurname.Text = ds.Tables("Users").Rows(inc).Item(2)
    txtUsername.Text = ds.Tables("Users").Rows(inc).Item(3)
    txtPassword.Text = ds.Tables("Users").Rows(inc).Item(4)
    txtClass.Text = ds.Tables("Users").Rows(inc).Item(5)
    txtAdmin.Text = ds.Tables("Users").Rows(inc).Item(6)
    txtHWP.Text = ds.Tables("Users").Rows(inc).Item(7)

End Sub

Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
    If inc <> MaxRows - 1 Then
        inc = inc + 1
        NavigateRecords()
    Else
        MessageBox.Show("No More Rows")
    End If
End Sub

Private Sub btnPrevious_Click(sender As Object, e As EventArgs) Handles btnPrevious.Click
    If inc > 0 Then
        inc = inc - 1
        NavigateRecords()

    ElseIf inc = -1 Then
        MessageBox.Show("No Records Yet")

    ElseIf inc = 0 Then
        MessageBox.Show("First Record")
    End If
End Sub

Private Sub btnLast_Click(sender As Object, e As EventArgs) Handles btnLast.Click
    If inc <> MaxRows - 1 Then
        inc = MaxRows - 1
        NavigateRecords()
    End If
End Sub

Private Sub btnFirst_Click(sender As Object, e As EventArgs) Handles btnFirst.Click
    If inc <> 0 Then
        inc = 0
        NavigateRecords()
    End If
End Sub

Private Sub btnAddNew_Click(sender As Object, e As EventArgs) Handles btnAddNew.Click

End Sub

Private Sub btnCommit_Click(sender As Object, e As EventArgs) Handles btnCommit.Click

End Sub

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click

    txtFirstName.Text = ds.Tables("Users").Rows(inc).Item(1) = txtFirstName.Text
    txtSurname.Text = ds.Tables("Users").Rows(inc).Item(2) = txtSurname.Text
    txtUsername.Text = ds.Tables("Users").Rows(inc).Item(3) = txtUsername.Text
    txtPassword.Text = ds.Tables("Users").Rows(inc).Item(4) = txtPassword.Text
    txtClass.Text = ds.Tables("Users").Rows(inc).Item(5) = txtClass.Text
    txtAdmin.Text = ds.Tables("Users").Rows(inc).Item(6) = txtAdmin.Text
    txtHWP.Text = ds.Tables("Users").Rows(inc).Item(7) = txtHWP.Text

    MessageBox.Show("Data updated")
End Sub

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click

End Sub

Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click

End Sub

末级

您实际上在哪里更新数据库?

阅读该教程中的另一段

关闭程序,然后再次运行。 单击“下一条记录”按钮以移至第一条记录。 仍然是“约翰·史密斯”。 您更新的数据已丢失! 因此,这又是为什么:

“更改了数据集,而不是数据库”

本教程向您展示如何将这些更改持久保存到数据库中:

da.Update(ds, "AddressBook")

编辑:似乎还会在以下行中出错:

txtFirstName.Text = ds.Tables("Users").Rows(inc).Item(1) = txtFirstName.Text

这在不同的语言中可能会有所不同。 例如,在C#中,我认为分配的结果就是所分配的值,因此类似的事情可能起作用。 但是在VB中,使用同一运算符时存在语义上下文差异。 取决于上下文,赋值运算符( =也是比较运算符。

所以我怀疑这行代码是比较后两个项目,并分配比较(结果TrueFalse )的第一个项目。

坚持使用本教程显示的内容,只需将值分配给数据即可:

ds.Tables("Users").Rows(inc).Item(1) = txtFirstName.Text

逻辑上该值已经存在,因此也无需尝试将值分配回获得值的文本框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM