2017-01-08 17 views
0

Позвольте мне кратко изложить мою проблему, а затем показать код.Обновление базы данных 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 не возвращает никакой информации о столбце.

Благодарим вас и снова извините за новинку.

ответ

0

Какое предложение вам нужно? Предложение присутствует в самой ошибке. Вы используете класс SQLCommandBlder, и он генерирует команду UPDATE, автоматически предоставляемую, если вы привязали команду SELECT к ней, и это то, что говорит сообщение об ошибке. Свойство DataAdapter.SelectCommand должно быть инициализировано.

Вы должны инициализировать выберите команду адаптера данных о том,

ReadDS.SelectCommand = new SqlCommand("SELECT * FROM dbo.RG_Control_Results_Cumulative"); 
+0

Спасибо Рахул. Пожалуйста, простите, что я здесь noob; Я признаю, что все еще запутался. Понятно, что я уже загрузил то, что я хочу из базы данных, в набор данных ControlResultsDS. Затем я отобразил одну таблицу в этом наборе данных, используя datagridview1. Затем пользователь вносит изменения в datagridview1, и я хочу отправить их обратно в базу данных. Должен ли я использовать другой класс? Я пробовал так много разных решений, и никто не работает. Опять мои извинения за то, что для многих из вас такой простой вопрос. – OldEngineer

+0

Итак, вот что я пробовал на основе вашего комментария. – OldEngineer

+0

Argh сожалеет о предыдущей строке - пытается показать отредактированный код, но с проблемой интерфейса - моя ошибка, не знакомая с этим интерфейсом; позвольте мне понять это, а затем опубликовать обновленный код. В основном я добавил то, что вы предложили, но получил новую ошибку - опубликует в ближайшее время. Еще раз спасибо за терпение! – OldEngineer

0

Годится заставил его работать - еще раз спасибо Рахулу за руководство! Проблема, с которой я, наконец, выяснилось, заключалась в том, что в моей таблице не было столбца первичного ключа, поэтому обновление адаптера не срабатывало; как только я добавил столбец (который я назвал «Sequence_Number»), обозначил его как столбец идентификатора с простой последовательной нумерацией и далее обозначил его как первичный ключ, все работало отлично. Снова извините за то, что он был таким нобом, но это был, конечно же, опыт обучения. Даже у старых программистов есть такие!