【问题标题】:Bind to DataGridView using a Stored Procedure使用存储过程绑定到 DataGridView
【发布时间】: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 保存回您的数据库,与往常一样。您可以根据需要创建InsertCommandUpdateCommandDeleteCommand。虽然我从未尝试过,但如果您需要影响多个表,我会假设您可以在每个命令中包含多个 SQL 语句,并用分号分隔它们。如果您已经使用 Access 完成了此操作,那么问题是什么?也许您使用了命令生成器而不是创建自己的命令。
  • “我认为 DataSet 需要‘绑定’到 DataGridView 而不是作为 DataSource 提供”。这正是绑定的含义。
  • @RezaAghaei,出于某种原因,我认为查询是从多个表中提取的,但是,重新阅读问题,似乎没有证据表明情况如此。因此,命令生成器可能是一种可能性,我最初认为并非如此。也就是说,我不确定是否可以将其与存储过程一起使用。你确定它可以吗?顺便说一句,您的答案中没有表格适配器。表适配器和数据适配器是不同的东西,虽然相关。

标签: vb.net winforms


【解决方案1】:

对于将来寻找如何完成此任务的任何人,我附上了我用来实现此目标的代码。这主要基于 here 发布的 jmcilhinney 示例。

Module DataGridViewRetrieve
    Public db As New SqlConnection(lgnGetCredentials)
    Public sp As SqlCommand = db.CreateCommand
    Public sa As SqlDataAdapter = New SqlDataAdapter(sp)
    Public dt As DataTable = New DataTable()

    Public Sub initialiseDataAdapter()
        Dim dRecords As SqlCommand = db.CreateCommand
        Dim uRecords As SqlCommand = db.CreateCommand
        Dim iRecords As SqlCommand = db.CreateCommand

        ' # Initialise delete records Stored Procedure
        With dRecords
            .CommandText = "<NAME OF STORED PROCEDURE TO DELETE>"
            .CommandType = CommandType.StoredProcedure
            .Parameters.Clear()
            .Parameters.Add("@ID", SqlDbType.BigInt, 10, "<NAME OF ID COLUMN IN DataGridView>")
        End With

        ' # Initialise update records Stored Procedure
        ' Note - you'll need to add your parameters for each column in the below example
        With uRecords
            .CommandText = "<NAME OF STORED PROCEDURE TO UPDATE"
            .CommandType = CommandType.StoredProcedure
            .Parameters.Clear()
            .Parameters.Add("@dgID", SqlDbType.BigInt, 10, "<NAME OF ID COLUMN IN DataGridView>")
            .Parameters.Add("@Title", SqlDbType.Bit, 1, "<NAME OF COLUMN IN DataGridView>")
        End With

        ' # Initialise insert records Stored Procedure
        With iRecords
            .CommandText = "pl.x53_loadLifeListGoals_iRecords"
            .CommandType = CommandType.StoredProcedure
            .Parameters.Clear()
            .Parameters.Add("@dgID", SqlDbType.BigInt, 10, "<NAME OF ID COLUMN IN DataGridView>")
            .Parameters.Add("@Title", SqlDbType.Bit, 1, "<NAME OF COLUMN IN DataGridView>")
        End With

        ' # Set data adapter commands
        sa.DeleteCommand = dRecords
        sa.UpdateCommand = uRecords
        sa.InsertCommand = iRecords

        ' # Set missing schema action key
        sa.MissingSchemaAction = MissingSchemaAction.AddWithKey
    End Sub

    Public Sub loadData(TitleName As String)
        ' # Clears data
        FormName.DataGridViewName.DataSource = Null

        ' # Calls the initialise routine
        Call initialiseDataAdapter()

        ' # Initialise the SELECT Stored Procedure
        With sp
            .CommandText = "<NAME OF STORED PROCEDURE TO SELECT>"
            .CommandType = CommandType.StoredProcedure
            .Parameters.Clear()
            .Parameters.Add(New SqlParameter("@TitleName", TitleName))
        End With

        ' # Load data
        sa.Fill(dt)
        FormName.BindingSourceName.DataSource = dt
        FormName.DataGridViewName.DataSource = FormName.BindingSourceName
    End Sub

    Public Sub saveData()
        sa.Update(FormName.BindingSourceName.DataSource)
    End Sub
End Module

'// ATTACH YOUR LOAD CALL TO YOUR EVENT HANDLER - IN THIS INSTANCE, FORM LOAD
Private Sub Form1_Load(sender as object, e as EventArgs) Handles Me.Load
    Call loadData(Me.txtTitle.Text)
End Sub

Private Sub ButtonSave_Click(sender as object, e as EventArgs) Handles Me.ButtonSave
    Call saveData()
End Sub

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2019-12-06
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多