Vb.net 使用存储过程绑定到DataGridView

Vb.net 使用存储过程绑定到DataGridView,vb.net,winforms,Vb.net,Winforms,我有一个DataGridView,它有5列,所有列都是在表单设计器中设置的。我还有一个存储过程,它将根据参数选择所需的5列和数据。我希望这些数据是可更新的;用户可以添加行、删除行和更新现有行 到目前为止,我已经设法用SQL Server中存储过程中的数据填充DataGridView,但不幸的是,这是只读的,对datatable后期加载所做的任何更改都只在前端应用程序中进行 我在MS Access中多次这样做,我认为数据集需要“绑定”到DataGridView,而不是作为数据源提供,以便DataG

我有一个DataGridView,它有5列,所有列都是在表单设计器中设置的。我还有一个存储过程,它将根据参数选择所需的5列和数据。我希望这些数据是可更新的;用户可以添加行、删除行和更新现有行

到目前为止,我已经设法用SQL Server中存储过程中的数据填充DataGridView,但不幸的是,这是只读的,对datatable后期加载所做的任何更改都只在前端应用程序中进行

我在MS Access中多次这样做,我认为数据集需要“绑定”到DataGridView,而不是作为数据源提供,以便DataGridView可以直接更新到SQL Server中的数据表,但我不确定如何实现这一点。我在网上查阅了很多资料,但似乎无法弄清楚我需要做什么才能让它正常工作

现行守则:

    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

对于将来想知道如何做到这一点的人,我附上了我用来实现这一点的代码。这主要基于发布的jmcilhinney示例


首先,根本不创建数据集。这是毫无意义的。如果您只需要一个数据表,那么只需创建一个数据表。您也可以传递一个数据表来填充。至于问题,没有问题。您可以使用适当配置的数据适配器的更新方法将数据表中的更改保存回数据库,与往常一样。您可以根据需要创建InsertCommand、UpdateCommand和DeleteCommand。虽然我从未尝试过,但我认为如果需要影响多个表,可以在每个命令中包含多个SQL语句,并用分号分隔它们。如果您已经使用Access完成了此操作,那么问题是什么?也许您使用了命令生成器,而不是创建自己的命令。我认为数据集需要“绑定”到DataGridView,而不是作为数据源提供。这正是绑定的含义。@RezaAghaei,出于某种原因,我认为查询是从多个表中提取的,但是,重读这个问题,似乎没有证据表明是这样的。因此,命令生成器可能是一种可能性,但我最初认为并非如此。也就是说,我不确定它是否可以与存储过程一起使用。你确定它可以吗?顺便说一下,您的答案中没有表适配器。表适配器和数据适配器是不同的东西,尽管它们是相关的。
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