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(dataset) 也被重新创建,因此输出 xml 中没有任何数据。要维护数据集的状态,请查看Asp.net 中的状态管理

于 2012-08-01T05:41:20.890 回答
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 是全局的,但仅在网页的生命周期内是部分正确的。一旦页面被渲染并发送到客户端,您的页面就会被处理,因此它是变量。

如果您希望 ds 在 button_click 事件中可用,请在 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 事件处理程序中生成数据集。

如果您不想每次都生成此数据集,则必须将此变量保留在SessionViewStateCache中

更新 1

第三个也是最后一个选项可能是将此数据集变量设置为类级别变量,即静态,并且它始终可用

于 2012-08-01T05:42:13.477 回答
0

您不会在 button2_click 的数据集中获得数据,因为 button1_click 和 button2_clicks 是对服务器的完全不同的请求。并且 asp.net 不会在请求之间持久化存储在变量中的数据。如果您需要持久化数据,您应该使用 asp.net 提供的任何状态管理技术,例如 Session 或 Viewstate 或 Caching。

于 2012-08-01T05:48:42.023 回答
0

我建议请使用ViewStateasSession会消耗大量服务器内存,尽管您可以使用其中任何一个来解决此目的。

我不认为 button1 的事件处理程序除了创建 ds 之外没有做任何事情。所以只有一个事件处理程序可以解决这个目的。

在两个事件处理程序中访问 ds 而不会丢失数据的另一种方法是将 ds 声明为static。但这种机制不适合这种情况。

于 2012-08-01T05:53:08.080 回答
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 回答