以所有形式使用DataTable中的数据

时间:2014-08-06 17:43:00

标签: c# asp.net global-variables

在类中,我执行一个存储过程并返回一个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();  
            }

如果我只需要使用此页面中的数据,此解决方案就有效。我需要在项目的不同页面中使用相同的数据。当然,我可以每次调用类并创建不同的数据表并将它们存储在不同的变量中,但我知道它不是很有效。我相信有更好的方法可以做到这一点。

有没有办法可以创建全局变量?例如,我将数据表加载到那些变量中,我可以在整个项目中使用它们吗?还是其他任何解决方案?

由于

3 个答案:

答案 0 :(得分:1)

如果该数据在不同用户之间共享,则使用Cache对象。见:ASP.NET Caching: Techniques and Best Practices

但是,如果该数据对每个用户都是唯一的,那么将该信息存储在Session对象中。 但请记住,为服务器上的每个用户维护会话,如果在Session中保留过多数据,则需要Server的更多资源。

请参阅:ASP.NET Session State Overview

Session

中存储信息
//To store
Session["UserIfno"] = tbl;

要检索

DataTable tbl = Session["UserInfo"] as DataTable;
if (tbl != null)
{
    //Datatable found;
}
可以在多个页面上访问

Session对象。

您还可以使用其他选项来维护ASP.Net中的页面状态,例如Cookie。看到 ASP.NET State Management Overview

答案 1 :(得分:0)

我建议您为此实施lazy-loading解决方案。

由于静态member are shared across all requests to the application,您可以缓存您知道不会更改的数据。显然你必须小心缓存太多或太长时间,否则你将要运行RAM问题。您还必须考虑并发性。

这是一个简化的示例:创建一个代表用户的类,然后创建一个静态方法,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
}

答案 2 :(得分:0)

Web 无状态,这意味着每次将页面发布到服务器时都会重新创建网页类的新实例。众所周知,HTTP是一种无状态协议,它不能在页面上保存客户端信息。

如果用户插入一些信息并移至下一页,则该数据将丢失,用户将无法检索该信息。我们需要存储信息。会话提供了存储服务器内存信息的工具。它可以支持任何类型的对象与我们自己的自定义对象一起存储。对于每个客户端,会话数据被单独存储,这意味着会话数据基于每个客户端存储。看看下图:

使用会话的状态管理是最好的ASP.NET功能之一,因为它是安全的,对用户透明,我们可以在其中存储任何类型的对象。

<强>优点:

  1. 它有助于在整个应用程序中维护用户状态和数据。
  2. 它易于实现,我们可以存储任何类型的对象。
  3. 单独存储客户数据。
  4. 会话对用户来说是安全且透明的。
  5. <强>缺点:

    1. 大量数据/用户的性能开销,因为会话数据存储在服务器内存中。
    2. 涉及序列化和反序列化会话数据的开销,因为在StateServer和SQLServer会话模式的情况下,我们需要在存储它们之前序列化对象。
    3. <强>参考:     1。http://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net