Позвольте мне кратко изложить мою проблему, а затем показать код.Обновление базы данных SQL с содержимым datagridview
Я хочу извлечь данные из базы данных SQL, отобразить их с помощью datagridview в Visual Basic, разрешить пользователю изменять содержимое в datagridview, а затем публиковать любые изменения в базе данных. Я пробовал несколько подходов, используя советы из stackoverflow и других форумов, но ничего не работает. Вот такой подход, который дал мне больше всего смысла, но опять же, если есть лучший или более простой способ сделать это, я все уши.
Я удалил другие части кода, которые не имеют отношения к делу. Код правильно получает данные из базы данных; помещает его в datagridview и отображает его. Когда я вхожу в ячейку для изменения содержимого, а затем пытаюсь сохранить результаты обратно в базу данных, я получаю ошибку во время выполнения.
Imports System.IO
Imports System.Data.OleDb
Imports System.Data.SqlClient
Public Class FrmRunTerm
Private connectionString As String
Private ControlResultsConnection As New SqlConnection
Private ReadDS As New SqlDataAdapter
Private ControlResultsDS As New DataSet
Private Sub FrmRunTerm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CboWeek.Items.Add("Week 1 - Tuesday, November 15, 2016")
CboWeek.Items.Add("Week 2 - Tuesday, November 22, 2016")
CboWeek.Items.Add("Week 3 - Tuesday, November 29, 2016")
CboWeek.Items.Add("Week 4 - Tuesday, December 6, 2016")
CboWeek.Items.Add("Week 5 - Tuesday, December 13, 2016")
CboWeek.Items.Add("Week 6 - Tuesday, December 20, 2016")
CboWeek.Items.Add("Week 7 - Tuesday, December 27, 2016")
CboWeek.Items.Add("Week 8 - Tuesday, January 3, 2017")
CboWeek.Items.Add("Week 9 - Tuesday, January 10, 2017")
CboWeek.Items.Add("Week 10 - Tuesday, January 17, 2017")
CboWeek.Items.Add("Week 11 - Tuesday, January 24, 2017")
CboWeek.Items.Add("Week 12 - Tuesday, January 31, 2017")
If CboWeek.Text = "" Then
MessageBox.Show("Please select a week to process.", "Termination Control Utility Set", MessageBoxButtons.OK)
End If
End Sub
Private Sub Btn_CWA_Click(sender As Object, e As EventArgs) Handles Btn_CWA.Click
If CboWeek.Text <> "" Then
ListBox1.Items.Add("Processing continuation of weekly analysis...")
Application.DoEvents()
connectionString = "<a lot of stuff – but it works>"
Dim strControlResultsSql As String = "SELECT * FROM dbo.RG_Control_Results_Cumulative"
Using ControlResultsConnection As New SqlConnection(connectionString)
ControlResultsConnection.Open()
Using ReadDS As New SqlDataAdapter(strControlResultsSql, ControlResultsConnection)
ReadDS.Fill(ControlResultsDS)
End Using
End Using
Dim SQLCommandBlder As New SqlCommandBuilder(ReadDS)
DataGridView1.DataSource = ControlResultsDS.Tables(0)
Application.DoEvents()
End If
End Sub
Private Sub Btn_InterimSave_Click(sender As Object, e As EventArgs) Handles Btn_InterimSave.Click
ListBox1.Items.Add("Saving data...")
Application.DoEvents()
Dim SQLCB As New SqlCommandBuilder(ReadDS)
ReadDS.Update(ControlResultsDS)
ControlResultsDS.AcceptChanges()
SQLCB.Dispose()
ControlResultsConnection.close()
End Sub
End Class
Ошибка, которую я получаю, находится на линии ReadDS.Update (ControlResultsDS). Ошибка:
Необработанное исключение типа 'System.InvalidOperationException' произошло в System.Data.dll
Дополнительная информация: свойство DataAdapter.SelectCommand необходимо инициализировать.
Любые советы были бы весьма полезными. Спасибо всем заранее!
За предложение Рахул, я изменил код следующим образом:
Dim SQLCB As New SqlCommandBuilder(ReadDS)
ReadDS.SelectCommand = New SqlCommand("Select * From dbo.RG_Control_Results_Cumulative")
ReadDS.SelectCommand.Connection = New SqlConnection(connectionString)
ReadDS.Update(ControlResultsDS)
ControlResultsDS.AcceptChanges()
SQLCB.Dispose()
И получил следующее сообщение об ошибке во время выполнения на ReadDS.Update линии:
Необработанное исключение типа " System.InvalidOperationException 'произошел в System.Data.dll
Дополнительная информация: Динамическая генерация SQL для UpdateCommand не поддерживается в отношении SelectCommand tha t не возвращает никакой информации о столбце.
Благодарим вас и снова извините за новинку.
Спасибо Рахул. Пожалуйста, простите, что я здесь noob; Я признаю, что все еще запутался. Понятно, что я уже загрузил то, что я хочу из базы данных, в набор данных ControlResultsDS. Затем я отобразил одну таблицу в этом наборе данных, используя datagridview1. Затем пользователь вносит изменения в datagridview1, и я хочу отправить их обратно в базу данных. Должен ли я использовать другой класс? Я пробовал так много разных решений, и никто не работает. Опять мои извинения за то, что для многих из вас такой простой вопрос. – OldEngineer
Итак, вот что я пробовал на основе вашего комментария. – OldEngineer
Argh сожалеет о предыдущей строке - пытается показать отредактированный код, но с проблемой интерфейса - моя ошибка, не знакомая с этим интерфейсом; позвольте мне понять это, а затем опубликовать обновленный код. В основном я добавил то, что вы предложили, но получил новую ошибку - опубликует в ближайшее время. Еще раз спасибо за терпение! – OldEngineer