我正在编写以下代码:
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时,它不会向Ouput XML文件发送任何数据。你能告诉我为什么吗?或者我应该做些什么修改?
由于
答案 0 :(得分:3)
您需要查看Asp.net page life cycle,在您的代码中单击您的按钮页面时会被销毁并重新创建,并且会遵循整个生命周期,并且在该过程中您的ds(数据集)也会重新创建因此输出xml中没有任何数据。 要维护数据集的状态,请查看State Management in Asp.net
答案 1 :(得分:0)
这是因为您在回发期间创建了一个新的数据集。
移动数据集private DataSet dataset1= new DataSet();
加载
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack) { dataset1= new DataSet(); }
}
显然,在单击Button2之前不要忘记单击Button1:)
答案 2 :(得分: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事件处理程序中生成数据集。
如果您不想每次都生成此数据集,则必须将此变量保留在会话或 ViewState 或缓存中
更新1
第三个也是最后一个选项可以是将这个数据集变量作为类级别变量,即静态,并且它将一直可用
答案 3 :(得分:0)
您没有在button2_click中获取数据集中的数据,因为button1_click和button2_clicks是对服务器的完全不同的请求。并且asp.net不会在请求之间保存存储在变量中的数据。如果您需要保留数据,则应使用asp.net提供的任何状态管理技术,如Session或Viewstate或Caching。
答案 4 :(得分:0)
我建议请使用ViewState
因为Session
会消耗大量服务器内存,但您可以使用其中任何一个来解决目的。
我不认为button1的事件处理程序除了创建ds之外还做了什么。 因此,只有一个事件处理程序可以解决目的。
在两个事件处理程序中访问ds而不丢失数据的另一种方法是将ds声明为static
。但是这种机制不适合这种情况。
答案 5 :(得分: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");
}