Visual Basic初心者のためのData Grid View更新方法

このQ&Aのポイント
  • Visual Basic初心者のため、Button1を使用してData Grid Viewを表示し、Data Grid Viewから更新したデータをButton2でmdbファイルに保存する方法について教えてください。
  • 参考にしたブログでは、Button1でData Grid Viewの表示はできるが、更新(Button2)の際にDataAdapter.SelectCommandプロパティを初期化する必要があると書かれています。
  • 具体的な実行コードは提供されていますので、このコードによってデータを更新する方法を教えてください。
回答を見る
  • ベストアンサー

Visual Basic初心者です。

Visual Basic初心者です。 Button1でData Grid Viewを表示し、Data Grid Viewから更新したものを Button2でmdbの更新を行う動作をさせたいと思っております。 http://blog.livedoor.jp/akf0/archives/51536291.html を参考にさせていただいましたが、このまま実行すると 参照までは動作しますが、更新(Button2)の時点で DataAdapter.SelectCommandプロパティを初期化する必要があります。 と出てしまいます。 どなたか知恵を貸してください。よろしくお願い致します。 実行コードは下記の通りです。 Private Sub Button2_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click '更新用SQLの取得 Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter) builder.GetUpdateCommand() builder = New SqlClient.SqlCommandBuilder(adapter) Dim result As Integer 'データの更新 result = adapter.Update(ds.Tables(0)) End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

SqlDataAdapter型の変数 AdapterがどこかでDisposeとかされてしまったのではありませんか? または フォームのPrivate変数ではなくて Button1_Clickのローカル変数とかになっていませんか VBの設定で変数の宣言を強制するためのOption Explicitを Offの設定にしたりしていませんか 変数adapterが Notthingのままだと 質問のようなエラーが表示されます もう一度ソースをよく確認しましょう > Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter) にブレークポイントを張って実行して止まったときにIDEの 自動変数ウオッチウィンドウの adapterがどうなっているのか確認しましょう

red0176
質問者

補足

変数adapterはNothingになっていました。 ただ、どこが原因なのかが掴めません。 下記のコードが上記コード以外の部分です。 Imports System.Data.SqlClient Public Class Form1 Private connection As SqlConnection Private adapter As SqlDataAdapter Private ds As DataSet Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Using cn As New System.Data.OleDb.OleDbConnection Using cm As New System.Data.OleDb.OleDbCommand Using da As New System.Data.OleDb.OleDbDataAdapter Dim ds As New DataSet 'EXE と同じフォルダーにデータも入れておく Dim FileName As String = System.IO.Path.Combine(Application.StartupPath(), "Test.mdb") Dim TableName As String = "sample" '指定のテーブル名(上記ファイル内に存在する事) '接続文字列については、WEB上で、[接続文字列]をキーに検索して見て下さい。 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & FileName & ";" 'パスワード等があれば続けて記入 'コネクションの設定 cm.Connection = cn 'データソースで実行するSQL文の設定 cm.CommandText = "SELECT * from " & TableName 'データソース内のレコードを選択するためのSQLコマンドの設定 da.SelectCommand = cm 'データを取得する da.Fill(ds, TableName) 'データグリッドに表示するデータソースを設定 DataGridView1.DataSource = ds 'グリッドを表示するための、DataSource 内のリストを設定 DataGridView1.DataMember = TableName 'データソースへの接続を閉る End Using End Using End Using End Sub

その他の回答 (1)

回答No.2

補足分に掲載されたコードは、サイトのサンプルコードを無断で掲載されたものですよね。 (サポートに申し出て削除してもらって下さい) グローバル変数とローカル変数の使い分けや意味を理解されていないようですが、特に他人の コードを使用する場合は、よく理解してから使用しないと、変数名がダブっていたり、意味を 理解していないとバグの元になります。 今一度、基本的な事なので、変数の扱い方やUsing 等について調べなおして下さい。 その辺を理解されないといつまでたっても解決できませんよ。

関連するQ&A

  • Visual Basic でスクリーンショット

    学生で、visual basic を勉強しているものです Button1をクリックするとスクリーンショットを1秒ごとに撮り、 "c:\iMonitoring"に保存するというプログラムを書いています (Button2をクリックすると止まる) 写真の名前を撮った時刻にしたいのですがエラーが出てうまくいきません どうしていいか分からばいので教えてください (コードです) ********************************************************************************* Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False System.IO.Directory.CreateDirectory("C:\iMonitoring") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim x As String = Now().ToString() Dim a As String = "C:\iMonitoring\" Dim b As String = ".bmp" Dim y As String = (a & x & b) 'Imports System.Drawing 'Imports System.Windows.Forms 'Bitmapの作成 Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, _ Screen.PrimaryScreen.Bounds.Height) 'Graphicsの作成 Dim g As Graphics = Graphics.FromImage(bmp) '画面全体をコピーする g.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size) '解放 g.Dispose() '保存 bmp.Save(y) End Sub End Class

  • DataGridViewで編集した内容をデータベースに反映したい

    言語:Microsoft Visual Studio 2008 データベース:SQL Server 2005 非接続型のデータアクセスです。 現在,上記環境で.netを勉強し始めたところです。 そこで簡単なプログラムからと思いDataGridViewを学習し始めたのですがすぐにつまずいてしまいました。 色々調べたのですが思うようにいかないので,アドバイスをいただければと思います。 やりたいことは (1)フォーム1のDataGridViewコントロールにデータソースをバインドしてデータを表示する。 (2)フォーム1の更新ボタン押下時に、DataGridViewで編集した内容をデータベースに反映する。 つまづいているのは(2)です。 http://japan.internet.com/developer/20070522/26.html を参考にしたのですが、どうコーディングすればよいかわかりません。 自作したコードは下記の通りです。 Private Sub frmDataGridViewTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   Dim strsql As String   Call DBConnect() '---DB接続   strsql = "SELECT ID, 名称, 型式 FROM テーブル ORDER BY ID"   Dim comm As SqlCommand = New SqlCommand(strsql, Con)   Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey   Dim ds As DataSet = New DataSet()   dataadapter.Fill(ds, "テーブル")   dgrview.DataSource = ds   dgrview.DataMember = "テーブル"   Call Disconnect() '---DB切断 End Sub Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click   '---ここに何か必要なのでしょうか?????     このままだとdataadapterとdsに宣言がないとエラーになります。   '---DataGridViewコントロールでの変更をデータベースに戻す   Dim sqlCmdBuilder As New SqlCommandBuilder(dataadapter)   sqlCmdBuilder.GetUpdateCommand()   dataadapter.Update(ds.Tables("テーブル"))   Call Disconnect() '---DB切断 End Sub

  • .net データベースへ反映する方法

    <環境> 言語:Microsoft Visual Studio 2008 データベース:SQL Server 2005 非接続型のデータアクセスです。 以前同じ質問をさせていただいたのですが、解決できなかったため、再度投稿させていただきました。 <質問> DataGridViewにデータを表示し、登録、修正、削除を行った後、 更新ボタンを押下でDataGridViewの内容をデータベース(SQLServer)に反映したいのですが、エラーとなり反映できません。 http://japan.internet.com/developer/20070522/26.html を参考にしているのですが、四苦八苦。全然前に進めない状態です。 自作したコードを下記の通りです。いったいどこを直せばよろしいでしょうか?どなたかアドバイスよろしくお願いします。 <エラー>---------------------------------------------------------- "System.ArgumentNullException: 値を Null にすることはできません。  パラメータ名: dataTable  場所 System.Data.Common.DbDataAdapter.Update(DataTable dataTable) -------------------------------------------------------------------- Private Sub frmDataGridViewTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   Dim strsql As String   Call DBConnect() 'DB接続   strsql = "SELECT ID, 名称, 型式 FROM ATBL ORDER BY ID"   Dim comm As SqlCommand = New SqlCommand(strsql, Con)   Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey   Dim ds As DataSet = New DataSet()   dataadapter.Fill(ds, "テーブル")   dgrview.DataSource = ds   dgrview.DataMember = "テーブル"   Call Disconnect() 'DB切断 End Sub Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click   Dim strsql As String   Call DBConnect() 'DB接続   strsql = "SELECT ID, 名称, 型式 FROM ATBL ORDER BY ID"   Dim comm As SqlCommand = New SqlCommand(strsql, Con)   Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey   dataadapter.Fill(ds, "テーブル")   Dim dt As DataTable = ds.Tables("テーブル")   '<<<DataGridViewコントロールでの変更をデータベースに戻す>>>   Dim sqlCmdBuilder As New SqlCommandBuilder(dataadapter)   sqlCmdBuilder.GetUpdateCommand()   dataadapter.Update(ds.Tables("テーブル"))   Call Disconnect() 'DB切断 End Sub

  • visual basic 2010 の デザイン

    visual basic 2010で、ボタンをクリックしただけ数が増えるように作ったんですけど、 9から10に切り替わるときに、位がずれてしまいます。 分かりやすくするため、*をつけると、**9*→**10 これを、***9→**10 こうなるようにしたいんです。 どうやったらできますか??? ============================================================ Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim kazu As Long kazu = Label1.Text Label1.Text = kazu + 1 End Sub End Class

  • DataGridViewの再表示方法

    VB2005、SQLServer2005環境です。 FormA、FormBの2つのフォームがあり、FormAはDataGridViewでデータを表示し、 FormBはFormAで選択されたデータを呼び出し修正処理を行っています。 質問は、FormBでデータを登録し、FormBを閉じたタイミングで、 FormAのDataGridViewを再描画して最新のデータを表示したいのですが、うまくいきません。 <FormAで記述しているCD> Private Sub BTN_Data表示ボタン_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BTN_Data表示ボタン.Click Dim strsql As String ' レコードを取得し、データグリッドに表示する '---DB接続 '---SQL文を作成して実行する strsql = "SELECT コード, 氏名 FROM TBLA ORDER BY コード Dim comm As SqlCommand = New SqlCommand(strsql, Con) '---データアダプタを生成 Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey '---データセット Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "TBLA") '---DataSet を DataGridView control と連結 dgrSyain.DataSource = ds dgrSyain.DataMember = "TBLA" '---DB切断 Call Disconnect() End Sub <FormBで記述しているCD> Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click '---FormBの内容を更新する処理----- Me.Close() End Sub 上記の、FormBが閉じる時のイベントで、ResetBindingsを使えばいいのかと思いましたが どこにどう記述すればよいかわかりませんでした。 どうすれば再描画できるでしょうか? ご教授ください。

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • Visual Basicがわかりません。

    Public Class Form1 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim GraphicsFun As System.Drawing.Graphics GraphicsFun = Me.CreateGraphics Dim PenColor As New System.Drawing.Pen _ (System.Drawing.Color.Black) GraphicsFun.DrawRectangle(PenColor, 30, 30, 450, 300) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If PictureBox1.Left < 480 - PictureBox1.Width And PictureBox1.Top + 31 Then PictureBox1.Left = PictureBox1.Left + 1 Else If PictureBox1.Top < 330 - PictureBox1.Height Then PictureBox1.Top = PictureBox1.Top + 1 Else If PictureBox1.Left > 30 Then PictureBox1.Left = PictureBox1.Left - 1 Else If PictureBox1.Top > 30 And PictureBox1.Left + 31 Then PictureBox1.Top = PictureBox1.Top - 1 End If End If End If End If End Sub End Class ピクチャーボックスを四角形の中で右周りに枠の中をボタンを押すと回るようにしたいんですけど、2回目の動作と3回目の動作がかぶってしまい、うまくいきません。4回目の解決策を教えてください。また、ボタン2を押すと反対周りにピクチャーボックスが回る、コマンドを 教えてください。

  • VB2010 DataGridからmdb更新

    以下のプログラムであるフォーム上のDataGridViewにmdbファイルから 読み込んだ値をDataGrid上で編集して更新ボタン(Button_UpD)クリックで mdbの中身を更新させたいです。 メモリ上(?)では書き換わるのですがmdbの更新にはなっていません。 検索したところBuilderを使うようなやり方も書いていてためしましたが うまくいきません。 ご教授下さい。   '更新ボタンをクリック Private Sub Button_UpD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_UpD.Click Dim Answer As Long Answer = MsgBox("更新を保存しますか?", vbYesNoCancel, "保存確認") Select Answer Case vbYes Dim ConectString As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath Dim Cn As New OleDbConnection(ConectString) Dim SQLCm As OleDbCommand = Cn.CreateCommand Adapter = New OleDbDataAdapter(SQLCm) Dim dRow As DataRow Dim dTable As DataTable Dim i As Integer dTable = CType(DataGridView2.DataSource, DataTable) For Each dRow In dTable.Rows '変更された場合(Modified) If dRow.RowState = DataRowState.Modified Then '一度に編集状態をコミット dRow.AcceptChanges() End If Next For i = 0 To dTable.Rows.Count - 1 Debug.WriteLine(i.ToString() & ControlChars.Tab _ & dTable.Rows(i).RowState.ToString()) Next Setting.Close() Setting.Show() Me.Close() End Select End Sub

  • レコードの削除について

    VB2005、SQLServer2005環境です。 度々質問させていただきます。コード1、コード2、コード3を主キーに持つAテーブルがあります。 そのテーブルからある特定レコードを削除したいのですが、 targetRow = dt.Rows.Find(findTheseVals(2)) のところでエラーになります。 エラー内容は、インデックスを付加するキーには 3 値が必要ですが、1 値を取得しました。 いったいどういう意味なのでしょうか?FINDする時の書き方が悪いのでしょうか? ご教授お願いします。 Private Sub BTN_削除_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTN_削除.Click Dim strsql As String Dim findTheseVals(2) As Object '///DB接続 省略/// strsql = "SELECT * FROM Aテーブル" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Try Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") Dim targetRow As DataRow targetRow = dt.NewRow() findTheseVals(0) = TXT_コード1.Text findTheseVals(1) = TXT_コード2.Text findTheseVals(2) = TXT_コード3.Text targetRow = dt.Rows.Find(findTheseVals(2)) ←ここでエラー targetRow.Delete() Dim cb As SqlCommandBuilder = New SqlCommandBuilder(dataadapter) dataadapter.Update(ds, "Aテーブル") Catch oExcept As Exception '例外が発生した時の処理 Finally '///DB切断省略/// End Try End Sub

  • DataGridViewからDBの更新

    DataGridViewの内容を変更してボタンを押したらDBを更新する ということをしたいのですが とあるサンプルコードには Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_商品") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=C:\VB2008\SampleDB.accdb;") 'データセットに取得してデータを表示する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") Me.DataGridView1.DataSource = dSet.Tables("t_商品") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dTbl As DataTable Dim dRow As DataRow Dim i As Integer 'DataGridからデータソースを取得する dTbl = Me.DataGridView1.DataSource '編集された行をコミットする For Each dRow In dTbl.Rows If dRow.RowState <> DataRowState.Unchanged Then dRow.AcceptChanges() End If Next End Sub End Class となっているのですがこのまま使用しても更新されません 全くの他力本願な質問ですがよろしくおねがいします イミデイトにはグリッド内容をnchange」になっています?

専門家に質問してみよう