Database 如何从DataGridView编辑行?MS Access数据库

Database 如何从DataGridView编辑行?MS Access数据库,database,vb.net,sql-update,Database,Vb.net,Sql Update,似乎这是我唯一不知道也不明白的问题。我已经为我的编辑按钮设置了一个查询,下面是代码 ExecuteQuery("Update ICT11 set [Author] = '" & AuthorTxt.Text & "', [Publisher] = '" & PublisherTxt.Text & "', [Subject Code] = '" & SubcodeTxt.Text & "', [Price] = '" & PriceTxt.T

似乎这是我唯一不知道也不明白的问题。我已经为我的编辑按钮设置了一个查询,下面是代码

ExecuteQuery("Update ICT11 set [Author] = '" & AuthorTxt.Text & "', [Publisher] = '" & PublisherTxt.Text & "', [Subject Code] = '" & SubcodeTxt.Text & "', [Price] = '" & PriceTxt.Text & "', [DiscountAmount] = '" & DiscountTxt.Text & "' Where [Book Name] = '" & BooknameTxt.Text & "'")
这也是连接到数据库的模块

Module SQLDatabase
Public provider As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Anthony\Desktop\BookSelection\DataBase\BookListUE.accdb"
Public myConnection As OleDbConnection = New OleDbConnection(provider)
Public sql As String
Public cmd As OleDbCommand
Public da As OleDbDataAdapter = New OleDbDataAdapter
Public dt As New DataTable
Function ExecuteQuery(ByVal Query As String) As DataTable

    Dim sqlDT As New DataTable

    Dim sqlCon As New OleDbConnection(provider)
    Dim sqlDA As New OleDbDataAdapter(Query, sqlCon)
    Dim sqlCB As New OleDbCommandBuilder(sqlDA)

    sqlDA.Fill(sqlDT)
    Return sqlDT

End Function
端模块


编辑按钮上的功能似乎工作正常,因为我没有遇到任何异常。但是,它并不能与DataGridView一起真正更新数据库。

您的做法完全错误。您可以使用数据适配器填充
数据表
,并将其绑定到网格。用户在本地所做的任何更改都应该对该
DataTable
进行

如果他们通过网格进行编辑,这将自动发生。如果它们通过
文本框
等进行编辑,那么如果您同时绑定
文本框
,这些更改仍然可以自动推送到
数据表
。否则,您应该使用
文本框中的数据手动更新
数据表
。下面是一个绑定到网格和
文本框的示例:

BindingSource1.DataSource=myDataTable
DataGridView1.DataSource=BindingSource1
TextBox1.DataBindings.Add(“Text”,BindingSource1,“Column1”)
TextBox2.DataBindings.Add(“Text”,BindingSource1,“Column2”)
如果这样做,则在网格中选择一行将自动使用该行的数据填充
文本框。当您导航到另一行时,在
文本框中所做的任何编辑都将反映在网格中。如果未绑定,则将数据从网格复制到
文本框

Dim row=DirectCast(BindingSource1.Current,DataRowView)
TextBox1.Text=CStr(行(“列1”))
TextBox2.Text=CStr(行(“列2”))
然后再回来:

Dim row=DirectCast(BindingSource1.Current,DataRowView)
行(“列1”)=TextBox1.Text
行(“列2”)=TextBox2.Text
请注意
BindingSource
的使用,它旨在成为访问和操作绑定数据的一站式服务。还请注意,当您绑定
数据表时,数据实际上来自其
默认视图
属性,即类型
数据视图
,而不是其
属性,即类型
数据行集合
。因此,每个项目都是
DataRowView
而不是
DataRow
。另外,请注意,在将更改复制回时,您可能无法使用
当前
项,具体取决于您执行此操作的时间/地点。如果选择已更改,则必须通过将其指定给字段来记住正在编辑的行:

Private editingRow作为DataRowView
'...
如果editingRow不是什么,那么
editingRow(“Column1”)=TextBox1.Text
editingRow(“Column2”)=TextBox2.Text
如果结束
editingRow=DirectCast(BindingSource1.Current,DataRowView)
TextBox1.Text=CStr(编辑行(“列1”))
TextBox2.Text=CStr(编辑行(“列2”))
在保存之前,您可以对
DataTable
进行任意多的更改,也就是说,您可以,但不必在每次编辑之后进行保存。一旦准备好保存,就可以使用数据适配器(最好是相同的适配器,但不一定是相同的适配器),通过调用
Update
将更改从
DataTable
保存到数据库。网格上没有“刷新”操作,因为它在保存绑定的
DataTable
更改之前已经反映了这些更改

以下是我不久前写的一些例子,可能对您有所帮助:

在第一个线程中的所有ADO.NET代码中,请注意使用参数而不是字符串连接将值转换为SQL代码。要了解原因和方法,请查看以下内容:


您需要花更多的时间学习数据库、SQL和ADO.NET。如果您有一个
UPDATE
语句,该语句应该将特定值保存到单个现有记录中,那么在数据适配器上调用
Fill
并用结果填充
DataTable
又有什么意义呢?没有。如果要保存特定值,则可以通过命令调用
ExecuteNonQuery