targa72 Ответов: 2

Как обновить базу данных access после внесения изменений в данные в datagridview


Как обновить базу данных Access после внесения изменений в данные в datagridview. Каждый столбец в datagridview загружается с помощью кода.
Вот код для загрузки datagridview.
Private Sub LoadData()
        Dim DGVVerticalScroll = dgv1.Controls.OfType(Of VScrollBar).SingleOrDefault

        With dgv1
            .Columns.Clear()
            .AutoGenerateColumns = False
            .DataSource = dt
            .ClearSelection()
            .AutoGenerateColumns = False
            .AllowUserToAddRows = False
            .RowsDefaultCellStyle.BackColor = Color.PapayaWhip
            .AlternatingRowsDefaultCellStyle.BackColor = Color.White
            .RowTemplate.Height = 18
            .Visible = True
            .Columns.Add("Column0", "TransactionID")
            .Columns(0).Visible = False
            .Columns(0).DataPropertyName = "TransactionsID"

            Dim CreditCardID As New DataGridViewComboBoxColumn()
            strSQL = "SELECT * FROM tblCreditCard ORDER by CardName "
            Me.da = New OleDbDataAdapter(strSQL, cn)
            Me.myTable = New DataTable
            Me.da.Fill(myTable)
            CreditCardID.DataSource = myTable
            With CreditCardID
                .DisplayMember = "CardName"
                .ValueMember = "CreditCardID"
                .HeaderText = "Credit Card"
                .DataPropertyName = "CreditCardID"
                .MaxDropDownItems = 6
                .FlatStyle = FlatStyle.Flat
            End With
            .Columns.Add(CreditCardID)
            .Columns(1).Width = 96

            Dim MerchantTypeID As New DataGridViewComboBoxColumn()
            strSQL = "SELECT * FROM tblMerchantType ORDER by MerchantType"
            Me.da = New OleDbDataAdapter(strSQL, cn)
            Me.myTable = New DataTable
            Me.da.Fill(myTable)
            MerchantTypeID.DataSource = myTable
            With MerchantTypeID
                .DisplayMember = "MerchantType"
                .ValueMember = "MerchantTypeID"
                .HeaderText = "Merchant Type"
                .DataPropertyName = "MerchantTypeID"
                .MaxDropDownItems = 16
                .FlatStyle = FlatStyle.Flat
            End With
            .Columns.Add(MerchantTypeID)
            .Columns(2).Name = "MerchantTypeID"
            .Columns(2).Width = 120

            .Columns.Add("Column3", "Merchant")
            .Columns(3).DataPropertyName = "Merchant"
            .Columns(3).Width = 100

            Dim transdate As New DataGridViewDateControl
            transdate.HeaderText = "Transaction Date"
            transdate.DataPropertyName = "TransDate"
            .Columns.Add(transdate)
            .Columns(4).Width = 90
            .Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

            Dim postdate As New DataGridViewDateControl
            postdate.HeaderText = "Posting Date"
            postdate.DataPropertyName = "Postdate"
            .Columns.Add(postdate)
            .Columns(5).Width = 90
            .Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

            .Columns.Add("Column6", "Amount")
            .Columns(6).Width = 72
            .Columns(6).DataPropertyName = "Amount"
            .Columns(6).DefaultCellStyle.Format = "$#,###.00"
            .Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

            Dim reconciled As New DataGridViewCheckBoxColumn
            With reconciled
                .HeaderText = "Reconciled"
                .DataPropertyName = "Reconciled"
            End With
            .Columns.Add(reconciled)
            .Columns(7).Width = 60
            .Visible = True
        End With

    End Sub


Что я уже пробовал:

Вот одна из моих попыток обновить базу данных.
Private Sub BuildDataAdapter()
        Dim delete As New OleDbCommand("")
        Dim myupdate As New OleDbCommand("UPDATE tblTransactions SET TransactionsID = ?, CreditCardsID = ?, MerchantTypeID = ?, " & _
               " Merchant = ? , TransDate = ? ,Postdate = ? , Amount = ? , Reconciled = ?" & _
               " WHERE TransactionsID = ?", cn)

        myupdate.Parameters.Add("@TransactionsID", OleDbType.Char, 5, "TransactionsID").SourceVersion = DataRowVersion.Original
        myupdate.Parameters.Add("@CreditCardID", OleDbType.Char, 5, "CreditCardID").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@MerchantTypeID", OleDbType.Char, 5, "MerchantTypeID").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@Merchant", OleDbType.Char, 50, "Merchant").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@Transdate", OleDbType.Date, 10, "Transdate").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@Postdate", OleDbType.Date, 10, "Postdate").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@Amount", OleDbType.Currency, 10, "Amount").SourceVersion = DataRowVersion.Current
        myupdate.Parameters.Add("@Reconciled", OleDbType.Boolean, 1, "Reconciled").SourceVersion = DataRowVersion.Current

        da.UpdateCommand = myupdate

        da.MissingSchemaAction = MissingSchemaAction.AddWithKey

    End Sub

А вот и кнопка click event для обновления
da.Update(dt)

Richard MacCutchan

В чем же проблема? Насколько я вижу, вы на самом деле не выполняете никаких команд базы данных.

targa72

Я пропустил три строки в подлодке loaddata, которые идут чуть выше с dgv1, они есть.
da = новый OleDbDataAdapter(strSQL, cn)
dt = новый DataTable
да.Заполнить(ДТ)

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

2 Ответов

Рейтинг:
1

targa72

Я все понял. Проблема заключалась в использовании одного и того же (da) DataAdapter для столбцов поля со списком и загрузки DataGridView. После присвоения каждому столбцу поля со списком уникального адаптера DataGridView загружается в соответствии с планом, и все изменения сохраняются. Также удалил частный суб BuildDataAdapter, который ему не был нужен.