【问题标题】:how to read data from a DataTable that stored in application with select query?如何使用选择查询从存储在应用程序中的 DataTable 中读取数据?
【发布时间】:2014-12-27 08:40:14
【问题描述】:

我正在为我的网站开发一个搜索模块。为了让它更快地工作,我想将我的Product 表存储在Application 中。像这样:

        DataLayer dl = new DataLayer();
        string CS = dl.dataLayerConnectionString;
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(CS);

        string FetchSqlSyntax = "SELECT AllImages.ImgSrc, Product.FName, Product.EName, Product.PID FROM AllImages INNER JOIN Product ON AllImages.PID = Product.PID";

        System.Data.SqlClient.SqlCommand FetchCmd = new System.Data.SqlClient.SqlCommand(FetchSqlSyntax , con);

        System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(FetchCmd);

        System.Data.DataTable dt = new System.Data.DataTable();

        da.Fill(dt);
        if (dt.Rows.Count > 0)
        {
            Application["Product"] = dt;            
        }

现在我想从存储在Application 的产品表中选择一些与搜索关键字相关的数据,并将其显示在我的ProductGridView 中。

毕竟这是提高性能的正确方法吗?

谢谢你,对不起我的英语不好;)

【问题讨论】:

  • 你可以查看我的完整答案。

标签: c# asp.net datatable


【解决方案1】:
DataTable table = (DataTable)Application["Product"];

之后你可以对你的桌子做任何你想做的事情。我建议你使用Session,而不是Application

Session["ProductTable"] = dt;

应用程序状态是一个可供所有人使用的数据存储库 ASP.NET 应用程序中的类。应用程序状态存储在 服务器上的内存,比存储和检索更快 数据库中的信息。与会话状态不同,会话状态特定于 单个用户会话,应用程序状态适用于所有用户和 会议。因此,应用程序状态是一个有用的存储位置 少量经常使用的数据,不会从一个用户更改为 另一个。

您可以阅读此article。阅读最后一句话并选择使用什么。在我的实践中,我总是使用会话。

编辑:

关于您在 cmets 中的问题:

首先,您不应该将Top 10 用于搜索功能。在打开页面或其他地方时,您应该缓存所有元素。您将在DataTable 中缓存此查询。如果你只搜索Top 10,结果几乎每次都是错误的。

SELECT 
   AllImages.ImgSrc, Product.FName, Product.EName, Product.PID 
FROM 
   AllImages 
INNER JOIN 
   Product ON AllImages.PID = Product.PID

在有人使用搜索功能后,您将进行如下检查:

if(Application["Product"] != null)
{
    DataTable table = (DataTable)Application["Product"];
}
else
{
    //fetch from DataBase
}

之后您可以使用LINQ通过搜索词或DataTable.Select方法仅选择特定数据

dt.Select("ename Like '%" + SearchTextBox.Text + "%'");

之后,您将 DataTable 作为DataSource 或其他使用它的控件提供给您的网格。

注意:

在内存中缓存查询是正确数据的交易性能。 如果您只有性能方面的难题并且这是您最后的希望,请使用此选项

我给你举个例子:

如果用户进入产品页面,我们在内存中缓存了 100 个产品,我们只会从 Session/Application 中获取 100 个项目,但如果另一个用户来创建 5 个新产品,它们将不会保存在内存中。您需要为它们在内存中执行新的获取和保存。解决方案是在特定时间段清除内存缓存,例如 10 分钟。 缓存数据也必须在某个时候清除,因为您可能会填满服务器的内存!

这将保证新数据将被放入内存中,但在这 10 分钟内您将遇到同样的问题。 因为我告诉过你,这种类型的缓存是正确数据-> 性能之间的交易。

【讨论】:

  • 谢谢。没错,但问题是我如何从 datatTable 中获取特定数据?
  • 'SELECT TOP (10) AllImages.ImgSrc, Product.FName, Product.EName, Product.PID FROM AllImages INNER JOIN Product ON AllImages.PID = Product.PID where (fname LIKE N'%" + SearchTextBox.Text + "%' or ename LIKE N'%" + SearchTextBox.Text + "%') and (allimages.imgorder=1)' 我如何从数据表中选择这个查询?
  • @MahdiHesari 检查我的编辑。我将添加您应该注意的其他事项。
  • @MahdiHesari 你可以随心所欲。这是您的选择,这是特定于解决方案的。我不能给你正确的答案:)
  • @MahdiHesari 使用 Select 时应将其存储在新的 DataTable 对象中: DataTable table = dst.Tables[0].Select("IsActive=1").CopyToDataTable();这是我的代码示例,因为 cmets 中的代码不可读。
【解决方案2】:

我认为从数据库中取出所有数据然后在内存中搜索对性能没有好处,如果您在数据库中进行搜索并将数据带回我认为您的性能会好很多。数据库已针对此类事情进行了优化,在内存中执行此操作需要不必要地从数据库中读取数据。

【讨论】:

  • 我很确定这不是真的。您可以阅读我在回答中指出的文章。这是其中的一部分应用程序状态存储在服务器的内存中,比在数据库中存储和检索信息要快。
  • 谢谢您。但正如“mybirhname”所注意到的,应用程序状态存储在服务器的内存中,比在数据库中存储和检索信息要快。您是否考虑使用其他方法来获得更好的性能?
  • 如果您将所有数据都保存在内存中,并且根本不需要查询数据库,那会更快。但这并不总是可能的
  • @NedStoyanov 这就像我在回答中写的那样。您应该在特定时间段内保存/清除内存中的数据!
猜你喜欢
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多