我写下面的代码:
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
}
}
}
在这里我的数据集的变量是全球性的,但是当我点击按钮2,它没有数据发送到输出继电器XML文件。 你能告诉我为什么吗? 或者有什么改变,我将让执行这个?
谢谢
你需要看看Asp.net页面的生命周期 ,在你的代码,当您在按钮点击页面被破坏并重新创建再次和整个生命周期之后,并在这个过程中你的DS(数据集)被重建过,因此输出XML不具有任何数据。 为了维护您的数据集的状态来看看在Asp.net状态管理
这是因为你回发期间创建一个新的数据集。
移动数据集的初始化private DataSet dataset1= new DataSet();
到负荷
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack) { dataset1= new DataSet(); }
}
显然,不`吨忘记单击Button1单击Button2的前:)
是的,你是部分正确的,你的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事件处理的数据集。
如果你不希望每次都产生这个数据集,你必须要么保持会话或ViewState中或缓存这个变量
更新1
第三个也是最后一个选项可以使这个数据集变量作为类级别的变量,即静态的,这将是所有可用的时间
你不会在button2_click数据集中获取数据,因为的button1_Click和button2_clicks是完全不同的请求到服务器。 和asp.net不会持续存储在请求之间的变量数据。 如果您需要保留的数据,你应该使用asp.net提供,如会话或视图状态或高速缓存任何状态管理技术。
我建议请使用ViewState
的Session
会消耗大量的服务器内存,虽然你可以使用其中任何一个解决的目的。
我不认为BUTTON1的事件处理程序从创建DS除了做任何事情。 所以,只有一个事件处理程序将解决这个目的。
访问这两个事件处理程序DS,而不会丢失数据的另一种方式是宣布DS为static
。 但这种机制不适合此方案。
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");
}