私の問題を簡単に述べて、コードを表示しましょう。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はキー列情報を返しません。
初心者のご質問ありがとうございました。
ありがとう、Rahul。私のことをここでは駄目なことを許してください。私はまだ混乱していると認めます。概念的には、私は既にデータベースから必要なものをControlResultsDSデータセットにロードしました。私はdatagridview1を使用してそのデータセットに単一のテーブルを表示しました。その後、ユーザーはdatagridview1を変更し、それらをデータベースに戻したいと思います。別のクラスを使うべきですか?私は非常に多くの異なるソリューションを試してきましたが、何も動作しません。このような簡単な質問の多くはあなたのために何かのために再び私の謝罪。 – OldEngineer
あなたのコメントに基づいて試したことはここにあります。 – OldEngineer
Argh前の行をごめんね。申し訳ありませんが調整されたコードを表示しようとしましたが、インタフェースに問題があります。それを理解してから、更新されたコードを投稿してみましょう。基本的にはあなたが提案したものを追加しましたが、新しいエラーが出てきました。あなたの忍耐のためにもう一度ありがとう! – OldEngineer