2

以下のコードでは、button2 を押すと次のように表示されます。

オブジェクト参照がオブジェクト インスタンスに設定されていません

どうしたの?

public partial class rec : System.Web.UI.Page
{
   protected void Button1_Click(object sender, EventArgs e)
   {
      try
      {
          SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|DB.mdf;Integrated Security=True;User Instance=True");

          SqlCommand cmd;
          con.Open();

          cmd = new SqlCommand("SELECT  SrviceType, Msg FROM OrderNum ", con);

          SqlDataReader dr;
          dr = cmd.ExecuteReader();

          dr.Read();

          Label1.Text = dr[0].ToString();
          TextBox1.Text = dr[1].ToString();
      }
      catch (Exception ex)
      {
          System.Windows.Forms.MessageBox.Show(ex.Message);
      }
  }

  protected  void Button2_Click(object sender, EventArgs e)
  {
      SqlDataReader dr = null;

      try
      {
          dr.Read();
          Label1.Text = dr[0].ToString();
          TextBox1.Text = dr[1].ToString();
      }
      catch (Exception ex)
      {
          System.Windows.Forms.MessageBox.Show(ex.Message);
      }
  }
}
4

3 に答える 3

3
SqlDataReader dr = null;

次に、 null オブジェクトから読み取ろうとします

dr.Read();

Button_click1データを取得したい場合は、状態を保持できない Web ページであることを確認してください。

于 2013-10-20T01:59:31.570 に答える
1

SqlDataReader オブジェクトは、データベースから実行/フェッチされたデータの 1 回限りの結果を保持するために使用されます。これは、必要な列を取得するために各行を反復処理するために使用できます。したがって、SqlDataReader オブジェクトから読み取ろうとする前に、いくつかのデータが必要です。

これは、次のステートメントで実現できます。

SqlDataReader sqldatareaderobject=sqlcommandobject.ExecuteReader();

Button1_click 関数では上記の原則に従っていますが、Button2_click 関数では同じ原則がありません。

あなたの場合、「dr」のSqlDataReaderオブジェクトには、ExecuteReader()関数の呼び出しに失敗したためnullが含まれており、nullオブジェクト(dr)の上でRead()関数を呼び出しているため、例外がスローされています。

ありがとうございました

于 2013-10-20T12:40:23.927 に答える
1

dr リーダーをコマンドに割り当てる必要があります。

ここで例を見てみましょう: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

于 2013-10-20T01:59:48.940 に答える