-1

Microsoft sql データベースとの接続を作成し、演習の一部として基本情報を追加しようとしましたが、次のエラーが発生しました。

Object reference not set to an instance of an object

これは私がデータベースに接続する方法です

SqlConnection sqlConn; 
protected void butConnect_Click(object sender, EventArgs e)
{
    try
    {
        string connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=lrmg;Integrated Security=True;";
        sqlConn = new SqlConnection(connectionString);
        sqlConn.Open();
        labMessage.Text = "a connection to your database was established";
    }
    catch (SqlException sqlE)
    {
        labMessage.Text = sqlE.Message;
    }
    catch (Exception exe)
    {
        labMessage.Text = exe.Message;
    }

ここでエラーが発生します

 protected void butSubmit_Click(object sender, EventArgs e)
 {
   try
    {
        string name = txtName.Text;
        string date = txtDate.Text;

        **SqlCommand cmd = sqlConn.CreateCommand();**

        cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES('" + name + "'," + date + ")";
        cmd.ExecuteNonQuery();
        labMessage.Text = "The value was inserted into your database";
    }
    catch (SqlException sqlE)
    {
        labMessage.Text = sqlE.Message;
    }
    catch (Exception exe)
    {
        labMessage.Text = exe.Message;
    }
}

SQL接続が開かれたという印象を受けているのに、なぜ例外が発生するのですか?

4

3 に答える 3

3

参照変数sqlConnが null であるため、エラーが発生しています。これは、おそらく次の理由で発生しています。

  • コード スニペットから、接続が作成され、接続ボタンのクリックで開かれます。したがって、送信する前に接続を押す必要があります
  • このASP.NETコードを想定すると、最も可能性の高い原因はおそらく異なります-そのような場合、すべてのリクエストはページクラスの異なるインスタンスによって提供されます-したがって、1つのリクエストで接続を開くと(接続クリック)、それ(その変数)はしません次のリクエストで利用できるようにします (送信をクリックします)。解決策は簡単です。必要なときに接続を作成して開きます。つまり、送信をクリックします。一方で、このような間違いを避けるためには、おそらく Web プログラミング モデルに関するモードを理解する必要があります。
于 2013-01-07T09:05:04.437 に答える
2

データベースで作業を行うには、2 つの異なるイベントを使用します。なんで?接続プーリングについて聞いたことがありますか?
おそらく、最初のイベント (open connection) と 2 番目のイベント (db insert) の間に何かが発生し、グローバル変数 SqlConn が null に変更され、エラーが発生します。(もちろん、何かを挿入しようとする前に、そのボタンを押して接続を開くことを想定しています)

接続プーリングを使用すると、この種のプログラミング パターンは不要になります。代わりに、何かを更新/挿入/削除/選択する必要がある場合は、接続を開いて作業を行い、接続を開いたままにしてサーバー上のリソースを消費することなく、すぐに接続を閉じます。そしてクライアント側。

try
{
    string connectionString = "Data Source=.\\SQLEXPRESS;" + 
                              "Initial Catalog=lrmg;Integrated Security=True;";
    using(SqlConnection sqlConn = new SqlConnection(connstring))
    {
        SqlCommand cmd = sqlConn.CreateCommand();**
        cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES(@name, @dt)";
        cmd.Parameters.AddWithValue("@name", txtName.Text);
        cmd.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text));
        cmd.ExecuteNonQuery();
        labMessage.Text = "The value was inserted into your database";
    }
}
catch (SqlException sqlE)
{
    labMessage.Text = sqlE.Message;

}
catch (Exception exe)
{
    labMessage.Text = exe.Message;
}

また、文字列連結を使用して SQL テキストを作成しているため、コードがSQL インジェクション攻撃の対象になることにも注意してください。これは絶対に避けるべき悪い習慣です

于 2013-01-07T09:06:50.833 に答える
1

接続を開くには、接続を使用するたびに呼び出す専用のメソッドが必要です。現在の設定では、同じリクエストで butConnect_click を butSumbit_Click の前に呼び出す必要があります。そのため、butSubmit に butConnect への呼び出しを追加します。

于 2013-01-07T09:04:08.027 に答える