Database 通过文本框更新datagridview

Database 通过文本框更新datagridview,database,vb.net,datagridview,updating,Database,Vb.net,Datagridview,Updating,我已经编写了代码,允许我通过文本框更新datagridview中的值,但是,它不起作用。在运行期间,当我按下更新按钮时,不会发生任何事情,甚至不会弹出错误消息 代码如下: Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Connection.ConnectionString = "provider= Microso

我已经编写了代码,允许我通过文本框更新datagridview中的值,但是,它不起作用。在运行期间,当我按下更新按钮时,不会发生任何事情,甚至不会弹出错误消息

代码如下:

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
    Connection.ConnectionString = "provider= Microsoft.ACE.OLEDB.12.0;Data Source= SRTDB.accdb"
    Dim connectionString As String = "provider= Microsoft.ACE.OLEDB.12.0;Data Source= SRTDB.accdb"
    Dim SQLQuery As String = "UPDATE Students SET StudentFirstName = @StudentFirstName, " & _
                     "StudentSurname = @StudentSurname, StudentPassword= @StudentPassword, StudentGroup = @Studentgroup " & _
                     "WHERE StudentID = @StudentID"

    Using Connection = New System.Data.OleDb.OleDbConnection(connectionString)
        Using cmd = New System.Data.OleDb.OleDbCommand(SQLQuery, Connection)
            Connection.Open()
            cmd.Parameters.AddWithValue("@StudentID", txtStudentID.Text)
            cmd.Parameters.AddWithValue("@StudentFirstName", txtStudentFirstname.Text)
            cmd.Parameters.AddWithValue("@StudentSurname", txtStudentSurname.Text)
            cmd.Parameters.AddWithValue("@StudentPassword", txtStudentPassword.Text)
            cmd.Parameters.AddWithValue("@StudentGroup", cbxStudentGroup.Text)
            Dim rowsInserted = cmd.ExecuteNonQuery
            If rowsInserted > 0 Then
                MessageBox.Show("Record successfully updated!", "Updated!")
                ShowItems()
            Else
                MessageBox.Show("Failure to update new record!", "Failure!")
            End If
        End Using
    End Using
End Sub

OleDB
不使用命名参数作为命名参数-您需要按照值在SQL中出现的确切顺序分配值。SQL最后指定StudentID,但将其指定为第一个参数。MSDN建议您使用
占位符而不是命名占位符

这意味着当它执行时,它将尝试更新记录,其中StudentID=cbxStudentGroup.Text。因为不太可能有这样的记录,所以它不会更新任何内容,
rowsInserted
将为0

您的代码中还有一件事,还有一些提示:

Private Sub btnUpdate_Click...
    Connection.ConnectionString = "provider= Microsoft.ACE.OLEDB.12.0;..."
    Dim connectionString As String = "provider= Microsoft.ACE...."
    Dim SQLQuery As String = "UPDATE Students SET StudentFirstName = @StudentFirstName, " & _ ...
第一个
连接
对象有时可能是
。因为它将被USING块中的一个覆盖,所以只需去掉它。您可以使用XML文本使SQL更易于阅读:

Dim SQLQuery As String = <sql>
                UPDATE Students 
                     SET StudentFirstName = @StudentFirstName, 
                         StudentSurname = @StudentSurname, 
                         StudentPassword= @StudentPassword, 
                         StudentGroup = @Studentgroup 
                     WHERE StudentID = @StudentID
                    </sql>.Value
可能的问题是参数的顺序:

        cmd.Parameters.AddWithValue("@StudentFirstName", txtStudentFirstname.Text)
        cmd.Parameters.AddWithValue("@StudentSurname", txtStudentSurname.Text)
        cmd.Parameters.AddWithValue("@StudentPassword", txtStudentPassword.Text)
        cmd.Parameters.AddWithValue("@StudentGroup", cbxStudentGroup.Text)
        cmd.Parameters.AddWithValue("@StudentID", txtStudentID.Text)
强制性警告:密码不应以明文形式存储,而应散列

另请参见:


为了避免将连接字符串粘贴到任何地方

出现了什么问题?这段代码如何与一个
DataGridView
相关?根据其他代码的不同,第一行可能是个问题——连接对象可能什么都不是,正确处理它——你不需要它。否则,您是否在调试中通过它来查看发生了什么?另一件事是参数。OleDB本身不使用命名参数-您必须按照它们在SQL中出现的确切顺序分配它们(AddWithValue)。您首先指定StudentID,但它是SQL@RezaAghaei你的答案不是我想要的,我也不知道如何实现它,所以我寻找了另一种解决方案。该代码与数据网格相关,因为它调用了更新datagridview的子“ShowItems()”。@我删除了那个额外的连接对象并重新排序了分配,它解决了这个问题。谢谢
        cmd.Parameters.AddWithValue("@StudentFirstName", txtStudentFirstname.Text)
        cmd.Parameters.AddWithValue("@StudentSurname", txtStudentSurname.Text)
        cmd.Parameters.AddWithValue("@StudentPassword", txtStudentPassword.Text)
        cmd.Parameters.AddWithValue("@StudentGroup", cbxStudentGroup.Text)
        cmd.Parameters.AddWithValue("@StudentID", txtStudentID.Text)