在类中,我执行一个存储过程并返回一个DataTable。
public DataTable getUserInfo(int abid)
{
DataTable tbl = new DataTable();
string constring =ConfigurationManager.ConnectionStrings["myconn"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
using (SqlCommand cmd = new SqlCommand("getUserInfo", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ABID", abid);
SqlDataAdapter adap = new SqlDataAdapter(cmd);
adap.Fill(tbl);
}
}
return tbl;
}
然后在default.aspx.cs页面后面的代码中,我调用类并使用foreach循环获得所需的所有数据。
DataTable tbl = new DataTable();
tbl = u.getUserInfo(abid);
foreach (DataRow row in tbl.Rows)
{
string firstName = row["firstName"].ToString();
string lastName = row["lastName"].ToString();
string fullname = row["fullname"].ToString();
string Phone = row["phone"].ToString();
}
如果我只需要使用本页中的数据,则此解决方案有效。我需要在项目的不同页面使用相同的数据。当然,我可以每次都调用这个类,创建不同的数据表,并将它们存储在不同的变量中,但我知道这不是很有效。我相信有更好的办法。
是否有一种方法,我可以创建全局变量?例如,我加载数据表到这些变量,我可以在整个项目中使用它们?或者其他的解决方案?
谢谢
如果该数据在不同用户之间共享,则使用缓存对象。看到:ASP。. NET缓存:技术和最佳实践。
但如果该数据对每个用户都是唯一的,则将该信息存储在Session
对象中。但是请记住,会话是为服务器上的每个用户维护的,如果你在会话中保存了太多的数据,那么它将需要更多的Server
资源。
看到:ASP。. NET会话状态概述
将信息存储在Session
//To store
Session["UserInfo"] = tbl;
检索
DataTable tbl = Session["UserInfo"] as DataTable;
if (tbl != null)
{
//Datatable found;
}
Session
对象可以在多个页面上访问。
您还可以使用其他选项来维护ASP中跨页面的状态。Net,像Cookies。看到ASP。. NET状态管理概述
Web是无状态的,这意味着每次将页面发布到服务器时都会重新创建一个新的Web页面类实例。众所周知,HTTP是一种无状态协议,它不能在页面上保存客户端信息。
如果用户插入一些信息并移动到下一页,则该数据将丢失,并且用户将无法检索该信息。我们需要存储信息。Session提供了在服务器内存中存储信息的工具。它可以支持任何类型的对象与我们自己的自定义对象一起存储。对于每个客户机,会话数据是单独存储的,这意味着会话数据是在每个客户机的基础上存储的。请看下面的图表:
使用会话的状态管理是最好的ASP。NET特性,因为它是安全的,对用户透明的,我们可以在其中存储任何类型的对象。优点:
- 帮助维护整个应用程序的用户状态和数据。 它很容易实现,我们可以存储任何类型的对象。
- 单独存储客户端数据
- 会话对用户来说是安全透明的。
缺点:
- 在大量数据/用户情况下的性能开销,因为会话数据存储在服务器内存中。
- 序列化和反序列化会话数据的开销,因为在StateServer和SQLServer会话模式的情况下,我们需要在存储它们之前序列化对象。
:1. http://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net
我建议您实现延迟加载解决方案。
由于静态成员在对应用程序的所有请求之间共享,因此您可以缓存您知道不会更改的数据。显然,您必须小心缓存太多或太长时间,否则将会出现内存问题。您还必须考虑并发性。
这里有一个简化的例子:创建一个代表用户的类,然后创建一个静态方法LoadByID(int id)和一个静态Dictionary来存储已经加载的用户。然后,当页面请求用户时,如果条目已经存在,则从缓存中向用户提供该条目。
//... user instance fields ...
private static Dictionary<int, User> cache = new Dictionary<int, User>();
private static object lockObj = new object();
public static User LoadByID(int id)
{
lock (lockObj) //Prevent double-adding items
{
if (cache.ContainsKey(id))
{
return cache[id]; //We've already loaded the record.
}
else
{
//Some function that actually calls the database
//and constructs user objects
User loaded = LoadUserInternal(id);
cache.Add(id, loaded)
return loaded;
}
}
}
private static User LoadUserInternal(int id)
{
//Load and construct the user
}