【发布时间】:2020-05-21 22:37:21
【问题描述】:
我在表单设计器中设置了一个包含 5 列的 DataGridView。我还有一个存储过程,它将SELECT 5 列和基于参数所需的数据。我希望这些数据是可更新的;用户可以添加行、删除行和更新现有行。
到目前为止,我已经设法使用 SQL Server 中存储过程中的数据填充 DataGridView,但不幸的是,这是只读的,并且对数据表后加载所做的任何更改仅在前端应用程序中。
我在 MS Access 中已经多次这样做了,我相信 DataSet 需要“绑定”到 DataGridView 而不是作为 DataSource 提供,以便使 DataGridView 可直接更新到 SQL 中的数据表服务器,但我不确定如何实现这一点。我在网上查看了很多来源,但似乎无法弄清楚我需要做什么才能使其正常工作。
现有代码:
Public Sub loadDataGridView(taskID As Integer)
Dim db As New SqlConnection(getCredentials)
Dim sp As SqlCommand = db.CreateCommand
Dim sa As SqlDataAdapter = New SqlDataAdapter(sp)
Dim ds As DataSet = New DataSet()
Dim x As Integer = 0
db.Open()
With sp
.CommandText = "StoredProcedureName"
.CommandType = CommandType.StoredProcedure
.Parameters.Add(New SqlParameter("@taskID", taskID))
End With
sa.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
db.Close()
End Sub
【问题讨论】:
-
首先,不要创建
DataSet。没有用。如果您想要的只是一个DataTable,那么只需创建一个DataTable。您也可以将DataTable传递给Fill。 -
至于问题,没有问题。您使用适当配置的数据适配器的
Update方法将更改从DataTable保存回您的数据库,与往常一样。您可以根据需要创建InsertCommand、UpdateCommand和DeleteCommand。虽然我从未尝试过,但如果您需要影响多个表,我会假设您可以在每个命令中包含多个 SQL 语句,并用分号分隔它们。如果您已经使用 Access 完成了此操作,那么问题是什么?也许您使用了命令生成器而不是创建自己的命令。 -
“我认为 DataSet 需要‘绑定’到 DataGridView 而不是作为 DataSource 提供”。这正是绑定的含义。
-
@RezaAghaei,出于某种原因,我认为查询是从多个表中提取的,但是,重新阅读问题,似乎没有证据表明情况如此。因此,命令生成器可能是一种可能性,我最初认为并非如此。也就是说,我不确定是否可以将其与存储过程一起使用。你确定它可以吗?顺便说一句,您的答案中没有表格适配器。表适配器和数据适配器是不同的东西,虽然相关。