как я могу обновить объединенный запрос из datagridview - PullRequest
0 голосов
/ 01 августа 2020

У меня есть несколько примеров кодов

в этих кодах я добавляю столбец в свой запрос (A.TUTAR + 2)

, но я не могу обновить доступ к mdb, когда я изменил datagridview

примечание: я могу объединить несколько таблиц и добавить больше столбцов

Imports System.Data.OleDb

Public Class Form1

 Dim myDA As OleDbDataAdapter

 Dim myDataSet As DataSet

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles  
     Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=|DataDirectory|\MYDB.mdb")  ' Use relative path to database file

     Dim cmd As OleDbCommand = New OleDbCommand("SELECT  A.*,A.TUTAR+2  FROM CARTH001 A WHERE KAYITNO = 1", con)

     con.Open()
     Dim dt = New DataTable()
     myDA = New OleDbDataAdapter(cmd)


     Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)

     myDataSet = New DataSet()

     myDA.Fill(myDataSet, "CARTM001")

     DataGridView1.DataSource = myDataSet.Tables("CARTM001").DefaultView

     con.Close()

     con = Nothing

 End Sub



 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Me.myDA.Update(Me.myDataSet.Tables("CARTM001"))
     Me.myDataSet.Tables("CARTM001").AcceptChanges()
     Me.myDA.Fill(Me.myDataSet.Tables("CARTM001"))

 End Sub

End Class```

1 Ответ

0 голосов
/ 01 августа 2020

Вы не можете использовать построитель команд. Вам нужно самостоятельно создавать команды действий. Если вы хотите обновить только одну таблицу, вам понадобится только один адаптер данных, но если вы хотите обновить обе таблицы, тогда, поскольку Access поддерживает только один оператор SQL для каждой команды, вам понадобятся два адаптера данных.

Один адаптер данных может выглядеть так:

Dim updateCommand As New OleDbCommand("UPDATE MyTable SET MyColumn = @MyColumn WHERE Id = @Id", myConnection)

updateCommand.Parameters.Add("@MyColumn", OleDbType.VarChar, 50, "MyColumn")
updateCommand.Parameters.Add("@Id", OleDbType.Integer, 0, "Id")

myDataAdapter.UpdateCommand = updateCommand
myDataAdapter.Update(myDataTable)

Несколько адаптеров данных могут выглядеть следующим образом:

Dim firstUpdateCommand As New OleDbCommand("UPDATE FirstTable SET FirstColumn = @FirstColumn WHERE FirstId = @FirstId", myConnection)

firstUpdateCommand.Parameters.Add("@FirstColumn", OleDbType.VarChar, 50, "FirstColumn")
firstUpdateCommand.Parameters.Add("@FirstId", OleDbType.Integer, 0, "FirstId")

firstDataAdapter.UpdateCommand = firstUpdateCommand
firstDataAdapter.AcceptChangesOnUpdate = False
firstDataAdapter.Update(myDataTable)

Dim secondUpdateCommand As New OleDbCommand("UPDATE SecondTable SET SecondColumn = @SecondColumn WHERE SecondId = @SecondId", myConnection)

firstUpdateCommand.Parameters.Add("@SecondColumn", OleDbType.VarChar, 50, "SecondColumn")
firstUpdateCommand.Parameters.Add("@SecondId", OleDbType.Integer, 0, "SecondId")

secondDataAdapter.UpdateCommand = secondUpdateCommand
secondDataAdapter.Update(myDataTable)

Обратите внимание, что вы должны установить AcceptChangesOnUpdate на False на первом адаптер данных, иначе первый вызов Update неявно вызовет AcceptChanges на DataTable, и второй адаптер данных не внесет никаких изменений для сохранения.

...