0

私は次のコードを書いています:

namespace WebApplication5
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private DataSet dataset1 = new DataSet();
        OleDbDataAdapter adapter;

        public DataSet ds
        {
            get { return dataset1; }
            set { dataset1 = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
            con.Open();
            adapter = new OleDbDataAdapter("Select * from User_Details",con);
            adapter.Fill(ds);
            GridView1.DataSource = ds;
            GridView1.DataBind();
           //  ds.WriteXml("C:\\MyUser_Details.xml"); If I do this here it writes data
            con.Close();
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            ds.WriteXml("C:\\MyUser_Details.xml");
            // no data in xml files, just root tags
        }
    }
}

ここで、DataSet 変数はグローバルですが、button2 をクリックすると、出力 XML ファイルにデータが送信されません。理由を教えてください。または、これを実行するにはどのような変更を加える必要がありますか?

ありがとう

4

6 に答える 6

3

Asp.netページのライフサイクルを確認する必要があります。ボタンをクリックすると、コードでページが破棄されて再作成され、ライフサイクル全体が追跡され、そのプロセスでds(データセット)も再作成されます。出力 xml にはデータがありません。データセットの状態を維持するには、Asp.net の状態管理をご覧ください。

于 2012-08-01T05:41:20.890 に答える
0
 protected void Button1_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection();
        con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
        con.Open();
        adapter = new OleDbDataAdapter("Select * from User_Details",con);
        adapter.Fill(ds);
        GridView1.DataSource = ds;
        Session.Add("Dataset", ds); //Adding Session here
        GridView1.DataBind();
        con.Close();
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        DataSet ds = (DataSet)Session["Dataset"]; //Retrieving Value from session
        ds.WriteXml("C:\\MyUser_Details.xml");
    }
于 2012-08-01T06:12:32.853 に答える
0

これは、ポストバック中に新しいデータセットを作成するためです。

データセットの初期化を移動しますprivate DataSet dataset1= new DataSet();

負荷に

protected void Page_Load(object sender, EventArgs e)
    {
         if(!Page.IsPostBack) { dataset1= new DataSet(); }
    }

もちろん、Button2 をクリックする前に Button1 をクリックすることを忘れないでください :)

于 2012-08-01T05:41:50.890 に答える
0

はい、ds がグローバルであることは部分的に正しいですが、Web ページの存続期間のみです。ページがレンダリングされてクライアントに送信されると、ページは破棄されるため、変数も破棄されます。

button_click イベントで ds を使用できるようにする場合は、Page_Load イベント内に入力します。

protected void Page_Load(object sender, EventArgs e)
{ 
           OleDbConnection con = new OleDbConnection();
           con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
            con.Open();
            adapter = new OleDbDataAdapter("Select * from User_Details",con);
            adapter.Fill(ds);
            con.close();
}

または、Button_Click イベント ハンドラーでデータセットを生成します。

このデータセットを毎回生成したくない場合は、この変数をセッションまたはビューステートまたはキャッシュに保持する必要があります

更新 1

3番目で最後のオプションは、このデータセット変数をクラスレベル変数、つまり静的にすることで、いつでも利用できるようになります

于 2012-08-01T05:42:13.477 に答える
0

button1_click と button2_clicks はサーバーへのまったく異なる要求であるため、button2_click のデータセットでデータを取得しません。また、asp.net は、リクエスト間で変数に格納されたデータを保持しません。データを永続化する必要がある場合は、Session、Viewstate、Caching など、asp.net が提供する状態管理手法を使用する必要があります。

于 2012-08-01T05:48:42.023 に答える
0

どちらを使用しても目的を解決できますが、サーバーのメモリを大量に消費するようにViewState使用することをお勧めします。Session

button1 のイベント ハンドラは、ds の作成以外に何もしていないと思います。したがって、1 つのイベント ハンドラーだけが目的を解決します。

データを失うことなく両方のイベント ハンドラーで ds にアクセスする別の方法は、ds を として宣言することstaticです。しかし、このメカニズムはこのシナリオには適していません。

于 2012-08-01T05:53:08.080 に答える