データグッドビュー編集後のエラーについて

このQ&Aのポイント
  • VB初心者がデータグッドビューの編集でエラーを解決する方法について
  • データグリッドビューの編集後にデータベースに反映するプログラムの作成方法
  • データグリッドビューの編集後にオブジェクト参照エラーが発生する原因と解決法
回答を見る
  • ベストアンサー

データグッドビュー編集後のエラーについて

VB初心者です。 (1)フォームロード時にアクセスのデータベースにアクセスし、データグリッドビューに表示 (2)フォーム上のデータグリッドビューを編集 (3)データベースに登録ボタン押下すると、フォーム上にあるデータグリッドビューをアクセスのデータベースに反映(update) というプログラムを作成中ですが、データベースに登録ボタンを押下すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーが出ます。 ネットで色々調べたのですが、よくわかりませんでした。 このエラー内容が分かる方、ご教示の程よろしくお願いします。 PC環境はWINXP+VS2008です。 Imports System.IO Imports System.Data.OleDb Public Class Form1 Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("T_資料") Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '▼フォームロード時の処理 Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) cn1.Open() Dim dAdp As OleDb.OleDbDataAdapter dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM T_資料", cn1) dAdp.Fill(dSet, "T_資料") DataGridView1.DataSource = dSet.Tables("T_資料") End Sub Public Sub cmd_Db_reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Db_reg.Click '▼「データベースに登録」ボタンを押下したときの処理 Try Dim adapter As New tourokuDataSetTableAdapters.T_資料TableAdapter() dAdp.Update(dSet, "T_資料") MessageBox.Show("更新に成功しました。") Catch ex As Exception MessageBox.Show("更新に失敗しました。" + vbCr + ex.Message) End Try End Sub End Class

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

  • ベストアンサー
  • angel_Z
  • ベストアンサー率66% (12/18)
回答No.2

こんにちは。 これではどうですか? Imports System.IO Imports System.Data Imports System.Windows.Forms Public Class Form1 Private dAdp As OleDb.OleDbDataAdapter Private dSet As DataSet = New DataSet("T_資料") Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '▼フォームロード時の処理 Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) cn1.Open() dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM T_資料", cn1) dAdp.Fill(dSet, "T_資料") Me.DataGridView1.DataSource = dSet.Tables("T_資料") cn1.Close() End Sub Public Sub cmd_Db_reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Db_reg.Click '▼「データベースに登録」ボタンを押下したときの処理 Try Dim Builder As New OleDb.OleDbCommandBuilder(dAdp) Builder.GetUpdateCommand() dAdp.Update(dSet.Tables("T_資料")) MessageBox.Show("更新に成功しました。") Catch ex As Exception MessageBox.Show("更新に失敗しました。" + vbCr + ex.Message) End Try End Sub End Class

higuchi-yu
質問者

お礼

無事にデータベースの更新ができました。 助かりました。ありがとうございました。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") >Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) >cn1.Open() >Dim dAdp As OleDb.OleDbDataAdapter このdAdpって、ローカル変数だったりしないですか?

higuchi-yu
質問者

お礼

アドバイスありがとうございます。 無事データベースの更新が行えました。

higuchi-yu
質問者

補足

早々のご回答ありがとうございます。 グローバル変数に変更したら、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」というエラーは無くなりましたが、「更新には、変更された行を含む DataRow コレクションが渡されたとき、有効な UpdateCommand が必要です。」というエラーが出てしまいました・・・ Public Class Form1 Public dAdp As OleDb.OleDbDataAdapter Public dSet As DataSet = New DataSet("T_資料")

関連するQ&A

  • MDBのフィールド数が多いとエラーになります。

    下記のコードは、 (1)フォームロード時にアクセスのデータベースにアクセスし、データグリッドビューに表示 (2)フォーム上のデータグリッドビューを編集 (3)データベースに登録ボタン押下すると、フォーム上にあるデータグリッドビューをアクセスのデータベースに反映(update) という作業を行うプログラムです。 このコードを実行した場合、アクセスのデータベース(登録.mdb)のフィールド数の100以上になると、「クエリーが複雑すぎます」とのエラーが出て、データベース(登録.mdb)の更新が行えません。 何とかエラーを出なくする方法は無いでしょうか? PC環境はWINXP+VS2008です。 Imports System.IO Imports System.Data Imports System.Windows.Forms Public Class Form1 Public dAdp As OleDb.OleDbDataAdapter Public dSet As DataSet = New DataSet("T_資料") Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ''▼フォームロード時の処理 Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) cn1.Open() dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM T_資料", cn1) dAdp.Fill(dSet, "T_資料") Me.DataGridView1.DataSource = dSet.Tables("T_資料") cn1.Close() End Sub Public Sub cmd_Db_reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Db_reg.Click '▼「データベースに登録」ボタンを押下したときの処理 Try Dim Builder As New OleDb.OleDbCommandBuilder(dAdp) Builder.GetUpdateCommand() dAdp.Update(dSet.Tables("T_資料")) MessageBox.Show("更新に成功しました。") Catch ex As Exception MessageBox.Show("更新に失敗しました。" + vbCr + ex.Message) End Try End Sub End Class

  • GridViewのデータソースの入れ方がわかりません

    OleDb.OleDbDataAdapter' が定義されていません DataSet' が定義されていません。 OleDb.OleDbConnection' が定義されていません。 OleDb.OleDbDataAdapter' が定義されていません 以上の エラーが出ます 定義の、意味がわかりません 教えてください お願いします WinXP Microsoft Visual Web Developer 2008 ASPX Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("顧客台帳") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\*******\*****.mdb;") 'データセットに取得し、DataGridViewに関連付ける dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 顧客台帳", cn) dAdp.Fill(dSet, "顧客台帳") Me.GridView1.DataSource = dSet.Tables("顧客台帳") End Sub

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • VB2008データベース

    非接続型データベースでUpdateをする文を書いていますがUpdateでエラーが出てしまいます。  OleDbCommandBuilder の参照をネットで確認等していますがエラーの内容がわかりません。 データベース参考書等にも下記と同じ文例でかいてあります。 どなたか教えてください。 *VB2008で開発しています。 Dim cn As OleDb.OleDbConnection Dim Buf As String Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet Dim dTbl As DataTable Dim cBuild As OleDb.OleDbCommandBuilder Buf$ = DefCnSt$ & X_SystemFile$ & ";Jet OLEDB:Database Password=" & XdtPs$ cn = New OleDb.OleDbConnection(Buf$) dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 物件", cn) dSet = New DataSet("物件") dAdp.Fill(dSet, "物件") dTbl = dSet.Tables("物件") dTbl.Rows(2)(1) = "ABC" cBuild = New OleDb.OleDbCommandBuilder(dAdp) dAdp.Update(dSet, "物件") <-ここでエラーが出ます。

  • Datagridviewのコンボボックスにつきまして

    vb2005です。 DataGridViewコントロールのデータセットにデータベースのテーブルをセットしています。 そのDataGridViewの1列目にコンボボックスを設定し、 そのコンボボックスのデータセットにも別のテーブルをセットしたいのです。 Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As New DataSet Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\DB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") DataGridView1.DataSource = dSet.Tables("t_商品") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 品種", cn) dAdp.Fill(dSet, "t_品種") Dim col As System.Windows.Forms.DataGridViewComboBoxColumn = DataGridView1.Columns(1) ・・・・★ col.DataSource = dtSet.Tables("t_品種") col.DisplayMember = "品種名" col.ValueMember = "品種コード" 上記のように記述しているのですが、★の部分で、下記のエラーになります。 型 'System.Windows.Forms.DataGridViewTextBoxColumn' のオブジェクトを型 'System.Windows.Forms.DataGridViewComboBoxColumn' にキャストできません データソースを指定したDataGridViewの列にはコンボボックス等の設定は 出来ないのでしょうか?

  • VB 2008 Express Editionでデータの抽出ができない

    VB 2008 Express Editionでデータの抽出ができません。 「Btn検索」ボタン押下時に「TextBox1.text」のデータで抽出を行いたいのですがデバッグして「TextBox1.text」にデータを入力して「Btn検索」ボタンを押下すると 「OledbExceptionはハンドルされませんでした。1つ以上の必要な値のパラメータが設定されていません」と表示されてしまいます。 ちなみにソースは下記になります。 -------------------------------------------------------------- Private Sub Btn検索_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn検索.Click Dim cn As New OleDb.OleDbConnection Dim dView As New DataView Dim strRec As String cn.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source = C;\管理台帳データベース.mdb" dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名=TextBox1.Text", cn) dadp.Fill(dset, "PC管理台帳") 'データベースの表示 DataGridView1.DataSource = dset.Tables("PC管理台帳") End Sub -------------------------------------------------------------- ちなみに下記のようにTextBox1.Textを'1111'とかにするとうまく抽出できます。 dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名='1111'", cn) となたかアドバイスお願いします。

  • 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」になっています?

  • C#でアクセスに更新するときの文字の色&呼び出すときの文字の色

    はじめまして。今回質問させていただく内容は。 C#でSQL文によってACCESSに更新するとき、更新した文字を更新したとわかりやすくACCESSのテーブルに赤色で表示させたいのですが。 SQL文によってどのように文字の色を変化させて追加するのかわからずにいます。 そしてこのことが可能であるならば、ACCESSのテーブルをSQL文で呼び出しデータグリッドビューに表示させるときもACCESSのテーブルのレコードの文字の色もまるっきり同じに呼び出すことは可能でしょうか? 下記にSQLでアクセスに更新するプログラミングと呼び出すとき使ったプログラミングを記述しておきます。 もし可能なら方法などご回答いただけたら嬉しいです。 ACCESSのデータを更新するプログラム System.Data.OleDb.OleDbCommandBuilder cBuild; System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("t_作業実績"); DataTable dTbl; System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source =C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //データセットに取得する dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績",cn); dAdp.Fill(dSet, "t_作業実績"); //コマンドビルダの作成 cBuild = new System.Data.OleDb.OleDbCommandBuilder(dAdp); //データセットからテーブルを取得して更新する dTbl = dSet.Tables["t_作業実績"]; dTbl.Rows[num-1]["移動個数"] = textBox2.Text; dAdp.Update(dSet, "t_作業実績"); MessageBox.Show("ok"); ACCESSからデータグリッドビューへ呼び出すプログラム System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("作業実績"); System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb //datasetに取得し、DATAGRIDVIEWに関連ずけする dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績", cn); dAdp.Fill(dSet, "作業実績"); dataGridView2.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; dataGridView2.DataSource = dSet.Tables["作業実績"];

  • OLE でACCESSデータを取得するとメモ型の内容255文字で切れてしまう

    お世話になります。 ■開発環境  VisualBasic2008 Express Edition  ACCESS2003(データ) ■質問内容  VBでaccessのmdbからデータを取得し、画面に表示しようと  しています。  ところが、メモ型の項目が255文字で切れてしまいます。  webでいろいろと調べましたが、jetエンジンの問題かなという  ところまではたどり着いたのですが、具体的にどうすれば改善  できるのかわかりません。  わかる方教えていただけないでしょうか。  よろしくお願いいたします。 ■ソース Dim SQL As String Dim Cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\message.mdb;") Dim dAdp As OleDb.OleDbDataAdapter Dim dView As DataView Dim dSet As DataSet = New DataSet("Detail") SQL = "SELECT M_ID,M_Title,M_Detail FROM MESSAGE_TBL " dAdp = New OleDb.OleDbDataAdapter(SQL, Cn) dAdp.Fill(dSet, "Detail") dView = New DataView(dSet.Tables("Detail"), "", "", DataViewRowState.CurrentRows) DataGridView1.DataSource = dView M_ID : 数値型、M_Title : テキスト型、M_Detail : メモ型 DataGridView1に表示されるときには、M_Detailが255文字になっています。     また、 'MessageBox.Show(Len(dSet.Tables("Detail").Rows(1)(2)))     で見たときにすでに255文字に切れていました。

  • VB 2008のSQL文でスペースを削除したい

    開発環境 VB2008 PC管理台帳.使用者氏名のスペースを削除して表示させたいのですが、デバッグすると下記のようなエラーがでます。どなたかアドバイスおねがいします。 「String "PC管理台帳.使用者氏名+" から型 'Double' への変換は無効です。」 ちなみにPC管理台帳.使用者氏名には空行があります。 -------------------------------------------------- Private Sub Btn検索_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn検索.Click Dim cn As New OleDb.OleDbConnection Dim dView As New DataView cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source = C;\管理台帳データベース.mdb" dadp = New OleDb.OleDbDataAdapter("SELECT " + Replace(+"PC管理台帳.使用者氏名+", " ", "") + ",PC管理台帳.新PC名,PC管理台帳.部署名,PC管理台帳.マシンベンダ名,PC管理台帳.マシンモデル FROM PC管理台帳 WHERE 新PC名='" + TextBox1.Text + "'", cn) dadp.Fill(dset, "PC管理台帳") 'データベースの表示 DataGridView1.DataSource = dset.Tables("PC管理台帳") End Sub --------------------------------------------------