* ПРИМЕЧАНИЕ. Вместо этого я удалил свой предыдущий вопрос «Обновить базу данных из DataTable и DataAdapter».Я обновил формулировку и код в соответствии с тем, что я сейчас тестирую.
Я пытаюсь обновить базу данных информацией из WinForm.У меня не было проблем при использовании «обычной» команды SQL-обновления, написанной от руки (параметры, установленные в значениях текстового поля), но я пытаюсь очистить и уменьшить свой код, и я решил связать элементы управления с DataTable и использоватькоманда обновления DataAdapter для достижения того же самого.
Я пытался заставить работать различные комбинации параметров и команд обновления, но База данных не обновляется из новых значений DataTable.Я прошел через код с каждым изменением и вижу, что DataTable получает новые значения текстового поля, но эти обновления не идут в базу данных.(Это видно, когда блок Fill_Date запускается и выбирает все новые данные из базы данных.)
То, что я пробовал: позволить привязке получить новые значения вместо установки параметров вручную.Использование компоновщика команд для построения команды обновления с помощью команды .UpdateCommand.ExecuteNonQuery(), command and of course a straight
.Update (DataTable).
Ниже приведен код, который я использую.Я надеюсь, что кто-то может сказать мне, что я делаю неправильно или отсутствует, или какой правильный путь выбрать.Есть ли «лучшая практика» или лучший способ сделать это?
Public Class frmDATA
Dim dt_Test As New DataTable
Dim da_Test As New SqlDataAdapter
Dim SQLcmd As SqlCommand
Private Sub frmDemog_Load(sender As Object, e As EventArgs) Handles MyBase.Load
BuildSQL()
Fill_Data()
BindControls()
End Sub
Private Sub frmDemog_Closed(sender As Object, e As EventArgs) Handles Me.Closed
If Not IsNothing(dt_Test) Then dt_Test.Dispose()
If Not IsNothing(da_Test) Then da_Test.Dispose()
If Not IsNothing(SQLcmd) Then SQLcmd.Dispose()
Me.Dispose()
End Sub
Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Update_Me()
End Sub
Private Sub BindControls()
txtLName.DataBindings.Add("Text", dt_Test, "Last_Name")
txtFName.DataBindings.Add("Text", dt_Test, "First_Name")
txtAKA.DataBindings.Add("Text", dt_Test, "AKA")
End Sub
Public Sub Update_Me(RefreshSearch As Boolean, RefreshView As Boolean)
Try
Dim testID As Integer = frmTest.dgvSearch.CurrentRow.Cells(0).Value
da_Test.UpdateCommand.Parameters("@ID").Value = testID
da_Test.Update(dt_Test)
Fill_Data()
Catch SqlExceptionErr As SqlException
MsgBox(SqlExceptionErr.Message, vbCritical, "Error")
Catch ex As Exception
MsgBox(ex.Message, vbCritical, "Error")
End Try
End Sub
Public Sub Fill_Data()
Try
dt_Test.Clear()
da_Test.SelectCommand.Parameters("@ID").Value = testID
da_Test.Fill(dt_Test)
Catch SqlExceptionErr As SqlException
MsgBox(SqlExceptionErr.Message, vbCritical, "Error")
Catch ex As Exception
MsgBox(ex.Message, vbCritical, "Error")
End Try
End Sub
Private Sub BuildSQL()
'** Build Selection Query
SQLcmd = New SqlCommand(String.Join(Environment.NewLine,
"SELECT ",
"data_Test.[Last_Name], ",
"data_Test.[First_Name], ",
"data_Test1.[Last_Name] + ', ' + data_Test1.[First_Name] as [AKA] ",
"FROM [DB].data_Test ",
"LEFT JOIN [DB].data_Test as data_Test1 ",
"ON data_Test.[ID] = data_Test1.[AKA_Demog_ID] ",
"WHERE data_Test.[ID]=@ID"
), Vars.sqlConnDB)
SQLcmd.Parameters.Add("@ID", SqlDbType.Int)
da_Test.SelectCommand = SQLcmd
'** Build Update Query
SQLcmd = New SqlCommand(String.Join(Environment.NewLine,
"UPDATE [DB].data_Test SET ",
"[Last_Name] = @LName,",
"[First_Name] = @FName",
"WHERE [ID] = @ID"
), Vars.sqlConnDB)
With SQLcmd.Parameters
.Add("@LName", SqlDbType.NVarChar, 255, "Last_Name") 'Required
.Add("@FName", SqlDbType.NVarChar, 255, "First_Name") 'Required
.Add("@ID", SqlDbType.Int, 0, "ID")
End With
da_Test.UpdateCommand = SQLcmd
End Sub
End Class