Привязка к DataGridView с использованием хранимой процедуры - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть DataGridView с 5 столбцами, все настройки в конструкторе форм. У меня также есть хранимая процедура, которая будет SELECT 5 столбцов и данных, необходимых на основе параметров. Я хочу, чтобы эти данные были обновляемыми; пользователь может добавлять строки, удалять строки и обновлять существующие строки.

До сих пор мне удалось заполнить DataGridView данными из хранимой процедуры на SQL сервере, но, к сожалению, это только для чтения и любые изменения сделанные после загрузки данные доступны только во внешнем приложении.

Я делал это много раз в 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

1 Ответ

0 голосов
/ 09 февраля 2020

Для тех, кто хочет в будущем сделать это, я приложил код, который использовал для этого. Это основано прежде всего на примерах 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...