none
VC#でプログラミングしています。次のエラーについて教えてください。エラー NullReferenceExecptionはハンドルされませんでした。 RRS feed

  • 質問

  • 以上のようなFormを作成し次のようにコードを書きました。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;

    namespace dbtest01
    {
        public partial class Form1 : Form
        {
            private SqlDataAdapter DataAdapter;

            private bool ConnectedValue;
            private bool Connected
            {
                get { return ConnectedValue; }
                set
                {
                    ConnectedValue = value;
                    buttonConnect.Enabled = !value;
                    buttonDisconnect.Enabled = value;
                    buttonSubmit.Enabled = value;
                    buttonReload.Enabled = value;
                }
            }

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                dataGridView1.DataSource = bindingSource1;
                Connected = false;
            }

            private void buttonConnect_Click(object sender, EventArgs e)
            {
                string connectString =
                    "Integrated Security=SSPI;" +
                    "Initial Catalog=Test1;" +
                    @"Data Source=localhost\sqlexpress";
                string selectString = "select * from Table1";

                try
                {
                    SqlDataAdapter dataAdaoter = new SqlDataAdapter(
                        selectString, connectString);
                    SqlCommandBuilder commandBuilder =
                        new SqlCommandBuilder(DataAdapter);
                    DataTable dataTeble = new DataTable();
                    dataAdaoter.Fill(dataTeble);
                    bindingSource1.DataSource = dataTeble;
                    Connected = true;
                }catch(Exception ex)
                {
                    MessageBox.Show(ex.Message, "エラー");
                }
            }

            private void buttonDisconnect_Click(object sender, EventArgs e)
            {
                bindingSource1.DataSource = null;
                DataAdapter.Dispose();
                dataGridView1.Update();
                Connected = false;
            }

            private void buttonSubmit_Click(object sender, EventArgs e)
            {
                DataAdapter.Update((DataTable)
                    bindingSource1.DataSource);
            }

            private void buttonReload_Click(object sender, EventArgs e)
            {
                buttonDisconnect_Click(sender, e);
                buttonConnect_Click(sender, e);
            }
        }
    }

    実行すると、「接続」ボタンでデータベースを読み込むことが成功します

    データグリッドでデータを書き「提出」ボタンを押してデータベースにデータを書くようにすると

            private void buttonSubmit_Click(object sender, EventArgs e)
            {
                DataAdapter.Update((DataTable)
                    bindingSource1.DataSource);
            }

    上記のDataAdapterのところで止まり

    このようなエラーになります。

    このエラーの意味が解らなくて先に進めません

    ご教授お願いします。

    2017年1月28日 4:54

回答

  • DataAdapter が初期化されて無くて null になっているからでしょう。

    【追伸】

    コードをざっと見てみましたが、他にも問題になりそうなところがありそうです。

    Windows Forms で DataGridView を使って SQL Server データベースの表示・編集を行うアプリを作っているようですが、一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

    以下のチュートリアル、
     
    チュートリアル : データベースへのデータの保存 (単一テーブル)
    https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx
     
    10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
    https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688
     
    ・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。
     
    Windows フォーム アプリケーションでのデータへの接続
    https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

    操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。

    勉強のため自力でコードを書きたいということなのかもしれませんが、もしそうであっても、ウィザードが自動生成するコードを見れば参考になると思います。

    お試しください。


    • 編集済み SurferOnWww 2017年1月28日 5:28 追伸追加&誤記訂正
    • 回答としてマーク よちわん 2017年1月31日 5:15
    2017年1月28日 5:08
  • このエラーの意味が解らなくて先に進めません

    C#はオブジェクト指向の言語です。オブジェクト指向において、クラス、インスタンスをきちんと理解することは基本中の基本になります。オブジェクトへの参照というのも基本的な考え方になります。

     NullReferenceExceptionというのは、オブジェクトへの参照(Reference)が存在しない(Null)ので、例外(Exception)が発生したということです。

    以下などが参考になると思いますので、以上のことをきちんと学ぶことを強くお勧めします。この先、プログラミングを進めるにあたり、必須の知識になります。そして、今回のエラーがなぜ発生したのかを十分に会得されて下さい。

    オブジェクト、クラス、インスタンスの言葉の意味
    http://dobon.net/vb/dotnet/beginner/classinstance.html

    第3章 クラスとインスタンス (1/3)
    http://www.atmarkit.co.jp/ait/articles/0209/04/news001.html

    第3回 クラスとオブジェクト
    http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_003/csharp_abc02.html

    クラス
    http://ufcpp.net/study/csharp/oo_class.html

    (追記)
    ご質問者さまへ。このスレッドはAzureのカテゴリーが適切でないと思われますので、後に他のカテゴリーに移動される予定です。問題があればご指摘下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/


    2017年1月28日 9:35
    モデレータ
  • よちわん さん、こんにちは。
    フォーラム オペレーターの立花楓です。

    今回、「Azure」フォーラムに投稿いただいた内容を、「Visual C#」フォーラムに移動させていただきました。

    trapemiya さんアドバイスをありがとうございます。

    参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いします。


    MSDN/TechNet Community Support 立花楓


    2017年1月30日 4:29
    モデレータ

すべての返信

  • DataAdapter が初期化されて無くて null になっているからでしょう。

    【追伸】

    コードをざっと見てみましたが、他にも問題になりそうなところがありそうです。

    Windows Forms で DataGridView を使って SQL Server データベースの表示・編集を行うアプリを作っているようですが、一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

    以下のチュートリアル、
     
    チュートリアル : データベースへのデータの保存 (単一テーブル)
    https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx
     
    10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
    https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688
     
    ・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。
     
    Windows フォーム アプリケーションでのデータへの接続
    https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

    操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。

    勉強のため自力でコードを書きたいということなのかもしれませんが、もしそうであっても、ウィザードが自動生成するコードを見れば参考になると思います。

    お試しください。


    • 編集済み SurferOnWww 2017年1月28日 5:28 追伸追加&誤記訂正
    • 回答としてマーク よちわん 2017年1月31日 5:15
    2017年1月28日 5:08
  • ありがとうございます。早速やってみることにします。また解らない所が出ましたらここで質問させていただきます。
    2017年1月28日 6:43
  • このエラーの意味が解らなくて先に進めません

    C#はオブジェクト指向の言語です。オブジェクト指向において、クラス、インスタンスをきちんと理解することは基本中の基本になります。オブジェクトへの参照というのも基本的な考え方になります。

     NullReferenceExceptionというのは、オブジェクトへの参照(Reference)が存在しない(Null)ので、例外(Exception)が発生したということです。

    以下などが参考になると思いますので、以上のことをきちんと学ぶことを強くお勧めします。この先、プログラミングを進めるにあたり、必須の知識になります。そして、今回のエラーがなぜ発生したのかを十分に会得されて下さい。

    オブジェクト、クラス、インスタンスの言葉の意味
    http://dobon.net/vb/dotnet/beginner/classinstance.html

    第3章 クラスとインスタンス (1/3)
    http://www.atmarkit.co.jp/ait/articles/0209/04/news001.html

    第3回 クラスとオブジェクト
    http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_003/csharp_abc02.html

    クラス
    http://ufcpp.net/study/csharp/oo_class.html

    (追記)
    ご質問者さまへ。このスレッドはAzureのカテゴリーが適切でないと思われますので、後に他のカテゴリーに移動される予定です。問題があればご指摘下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/


    2017年1月28日 9:35
    モデレータ
  • よちわん さん、こんにちは。
    フォーラム オペレーターの立花楓です。

    今回、「Azure」フォーラムに投稿いただいた内容を、「Visual C#」フォーラムに移動させていただきました。

    trapemiya さんアドバイスをありがとうございます。

    参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いします。


    MSDN/TechNet Community Support 立花楓


    2017年1月30日 4:29
    モデレータ
  • お願いがあります。
    最初のご質問と関連性の少ないご質問は、新たなスレッドを立ててご質問下さい。
    スレッドのタイトルとご質問内容が一致しなくなりますので、ご協力をお願いいたします。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年1月31日 8:07
    モデレータ