2017-01-08 11 views
0

私の問題を簡単に述べて、コードを表示しましょう。DataGridviewの内容でSQLデータベースを更新する

SQLデータベースからデータを抽出し、Visual Basicでdatagridviewを使用して表示し、ユーザーが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で発生しました

追加情報:UpdateCommandの動的SQL生成はSelectCommand thaに対してサポートされていませんtはキー列情報を返しません。

初心者のご質問ありがとうございました。

答えて

0

何が必要ですか?提案はエラーステートメント自体に存在します。 SQLCommandBlderクラスを使用していて、SELECTコマンドをバインドした場合、自動的にUPDATEコマンドが生成されます。エラーメッセージに実際に表示される内容はです。を初期化する必要があります。

あなたは

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

ありがとう、Rahul。私のことをここでは駄目なことを許してください。私はまだ混乱していると認めます。概念的には、私は既にデータベースから必要なものをControlResultsDSデータセットにロードしました。私はdatagridview1を使用してそのデータセットに単一のテーブルを表示しました。その後、ユーザーはdatagridview1を変更し、それらをデータベースに戻したいと思います。別のクラスを使うべきですか?私は非常に多くの異なるソリューションを試してきましたが、何も動作しません。このような簡単な質問の多くはあなたのために何かのために再び私の謝罪。 – OldEngineer

+0

あなたのコメントに基づいて試したことはここにあります。 – OldEngineer

+0

Argh前の行をごめんね。申し訳ありませんが調整されたコードを表示しようとしましたが、インタフェースに問題があります。それを理解してから、更新されたコードを投稿してみましょう。基本的にはあなたが提案したものを追加しましたが、新しいエラーが出てきました。あなたの忍耐のためにもう一度ありがとう! – OldEngineer

0

O.k.を言って、あなたのデータアダプタのselectコマンドを初期化する必要がありますそれが働くようになった - あなたの指導のために再びRahulに感謝!私が最後に理解した問題は、私のテーブルに主キー列がなく、アダプタのアップデートが失敗していたことです。一度列(私は "Sequence_Number"と呼んでいました)を追加し、それを単純な連番でID列として指定し、それを主キーとしてさらに指定すると、すべてが完全に機能しました。もう一度申し訳ありませんが、それは確かに学習経験でした。古いプログラマでさえそれらを持っています!

関連する問題