Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在会话中保存SQL查询以供以后使用_C#_Asp.net_Session_Viewstate - Fatal编程技术网

C# 如何在会话中保存SQL查询以供以后使用

C# 如何在会话中保存SQL查询以供以后使用,c#,asp.net,session,viewstate,C#,Asp.net,Session,Viewstate,我有一个功能,每次按下按钮或更改7个下拉列表中的任何一个选项时,都会运行查询。如何将现有方法更改为使用Session或ViewState,使我的页面只运行一次查询,然后针对Session或ViewState进行查询,而不是针对每个请求转到SQL server 代码隐藏: protected void Page_Load(object sender, EventArgs e) { strMainQuery = @"SELECT 'http://dddfgdgdfg?objectid='

我有一个功能,每次按下按钮或更改7个下拉列表中的任何一个选项时,都会运行查询。如何将现有方法更改为使用Session或ViewState,使我的页面只运行一次查询,然后针对Session或ViewState进行查询,而不是针对每个请求转到SQL server

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    strMainQuery = @"SELECT  'http://dddfgdgdfg?objectid=' + CT.OBJECTID + '&classid=1224' 'Task Detail'
            ,LTRIM(RTRIM(CT.ATTR2846)) 'Service'
            ,LTRIM(RTRIM(CT.ATTR2812)) 'Status'
            ,CONVERT(VARCHAR(14), CT.ATTR2752, 110) 'Due Date'
            ,LTRIM(RTRIM(CT.ATTR2739)) 'Task Name'
            ,LTRIM(RTRIM(UA.REALNAME)) 'Owner'
            ,LTRIM(RTRIM(CT.ATTR2799)) 'Client'

        FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1)";


    if (!Page.IsPostBack)
    {
        ViewState["sortOrder"] = "Asc";
        ViewState["sortExp"] = "Due Date";
        PullData("Due Date", "Asc"); //ASC: A (top) to Z (bottom) || # (low to high) || Date (oldest to newest)
    }
    else
    {
        PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
    }
}

public void PullData(string sortExp, string sortDir)
{
    string query = "";
    DataTable taskData = new DataTable();
    connString = ""; //connection string
    if (ddlTaskName.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2739 = '" + ddlTaskName.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2739 LIKE '%'";
    }
    if (ddlService.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2846 = '" + ddlService.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2846 LIKE '%'";
    }
    if (ddlStatus.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2812 = '" + ddlStatus.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2812 LIKE '%'";
    }
    if (ddlDueDate.SelectedIndex > 0)
    {
        strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) = '" + ddlDueDate.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) LIKE '%'";
    }
    if (ddlOwner.SelectedIndex > 0)
    {
        strClause += " AND UA.REALNAME = '" + ddlOwner.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND UA.REALNAME LIKE '%'";
    }
    if (ddlClient.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2799 = '" + ddlClient.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2799 LIKE '%'";
    }

    if (ddlTaskName.SelectedIndex == 0 && ddlService.SelectedIndex == 0 && ddlStatus.SelectedIndex == 0 && ddlDueDate.SelectedIndex == 0 && ddlOwner.SelectedIndex == 0 && ddlClient.SelectedIndex == 0)
    {
        query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0";
    }
    else
    {
        query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0" + strClause;
    }

    using (SqlConnection conn = new SqlConnection(connString))
    {
        try
        {
            SqlCommand cmd = new SqlCommand(query, conn);

            // create data adapter
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            // this will query your database and return the result to your datatable

            DataSet myDataSet = new DataSet();
            da.Fill(myDataSet);

            DataView myDataView = new DataView();
            myDataView = myDataSet.Tables[0].DefaultView;

            if (sortExp != string.Empty)
            {
                //MessageBox.Show(sortExp);
                //MessageBox.Show(sortDir);
                myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
            }

            yourTasksGV.DataSource = myDataView;
            yourTasksGV.DataBind();

            TasksUpdatePanel.Update();

            conn.Close();
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }
}
如您所见,每次调用
PullData
时,它都会转到SQL server并运行查询,当我开始拥有越来越多的数据时,查询最终会变慢


如何将现有方法转换为查询一次并保存到会话/视图状态,以便不必每次都对SQL server进行查询?

在运行查询之前,请检查缓存。如果有,就用它。如果不是,则运行查询并将结果数据添加到缓存中

你可以用。您可以找到一些很棒的缓存技巧:

下面是我将如何构造PullData方法:

public void PullData(string sortExp, string sortDir)
{
    // build your query string
    // ...

    // Now create a hash of that query string
    string cacheKey = HashHelper(query);

    DataSet ds = null;

    // check cache if key exists
    if(Cache[cacheKey] != null)
    {
         // read dataset from cache
         ds = (DataSet)Cache[cacheKey];
    }
    else
    {
        // perform sql command and fill your dataset
        // ....
        // save dataset to cache for 30 minutes or whatever you like
        Cache.Insert(cacheKey, ds, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero);
    }

    // Get DataView based on sort options
    DataView myDataView = new DataView();
    myDataView = ds.Tables[0].DefaultView;

    if (sortExp != string.Empty)
    {
        myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
    }

    yourTasksGV.DataSource = myDataView;
    yourTasksGV.DataBind();

    TasksUpdatePanel.Update();

    // keep calm and carry on
}
这是我的哈希助手

private string HashHelper(string query)
{
    using (SHA256Managed hashEngine = new SHA256Managed())
    {
        byte[] data = hashEngine.ComputeHash(Encoding.UTF8.GetBytes(query));
        StringBuilder hash = new StringBuilder(64);
        for (int i = 0; i < data.Length; i++)
        {
            hash.Append(data[i].ToString("x2"));
        }
        return hash.ToString();
    }

}
私有字符串HashHelper(字符串查询)
{
使用(SHA256Managed hashEngine=new SHA256Managed())
{
byte[]data=hashEngine.ComputeHash(Encoding.UTF8.GetBytes(query));
StringBuilder哈希=新的StringBuilder(64);
for(int i=0;i
在运行查询之前,请检查缓存。如果有,就用它。如果不是,则运行查询并将结果数据添加到缓存中

你可以用。您可以找到一些很棒的缓存技巧:

下面是我将如何构造PullData方法:

public void PullData(string sortExp, string sortDir)
{
    // build your query string
    // ...

    // Now create a hash of that query string
    string cacheKey = HashHelper(query);

    DataSet ds = null;

    // check cache if key exists
    if(Cache[cacheKey] != null)
    {
         // read dataset from cache
         ds = (DataSet)Cache[cacheKey];
    }
    else
    {
        // perform sql command and fill your dataset
        // ....
        // save dataset to cache for 30 minutes or whatever you like
        Cache.Insert(cacheKey, ds, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero);
    }

    // Get DataView based on sort options
    DataView myDataView = new DataView();
    myDataView = ds.Tables[0].DefaultView;

    if (sortExp != string.Empty)
    {
        myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
    }

    yourTasksGV.DataSource = myDataView;
    yourTasksGV.DataBind();

    TasksUpdatePanel.Update();

    // keep calm and carry on
}
这是我的哈希助手

private string HashHelper(string query)
{
    using (SHA256Managed hashEngine = new SHA256Managed())
    {
        byte[] data = hashEngine.ComputeHash(Encoding.UTF8.GetBytes(query));
        StringBuilder hash = new StringBuilder(64);
        for (int i = 0; i < data.Length; i++)
        {
            hash.Append(data[i].ToString("x2"));
        }
        return hash.ToString();
    }

}
私有字符串HashHelper(字符串查询)
{
使用(SHA256Managed hashEngine=new SHA256Managed())
{
byte[]data=hashEngine.ComputeHash(Encoding.UTF8.GetBytes(query));
StringBuilder哈希=新的StringBuilder(64);
for(int i=0;i
以您当前的代码结构,您无法做到这一点。因为您的
strMainQuery
具有不带
WHERE
子句的sql语句,并且随着下拉值的更改,您正在动态地为
WHERE
子句构建条件。因此,您不能在会话中存储该结果集,因为每个下拉选择的值都会更改

这是你能做的

  • 检索
    strMainQuery
    的所有记录,不带任何WHERE条件,并将结果存储在会话或其他一些状态管理中。因此,您的
    PullData
    方法将包含

    SqlCommand cmd = new SqlCommand(strMainQuery, conn);
    
  • 当下拉列表值更改时,访问会话对象并使用LINQ根据不同下拉列表的值过滤数据。这至少可以帮助您避免每次下拉值更改都访问数据库服务器

    获取一次=>存储=>并使用LINQ进行额外的数据筛选

    在绑定以下行中的网格之前,请执行数据筛选。


  • 我确实看到您在两个
    中调用
    PullData
    !Page.IsPostBack
    以及
    else
    部分的
    PageLoad
    ,这意味着每当页面上的任何其他控件触发回发时,都将调用此函数
    PullData
    。而是为下拉列表添加一个
    OnSelectedIndexChanged
    事件,并调用
    PullData
    方法。

    使用当前的代码结构,您无法执行此操作。因为您的
    strMainQuery
    具有不带
    WHERE
    子句的sql语句,并且随着下拉值的更改,您正在动态地为
    WHERE
    子句构建条件。因此,您不能在会话中存储该结果集,因为每个下拉选择的值都会更改

    这是你能做的

  • 检索
    strMainQuery
    的所有记录,不带任何WHERE条件,并将结果存储在会话或其他一些状态管理中。因此,您的
    PullData
    方法将包含

    SqlCommand cmd = new SqlCommand(strMainQuery, conn);
    
  • 当下拉列表值更改时,访问会话对象并使用LINQ根据不同下拉列表的值过滤数据。这至少可以帮助您避免每次下拉值更改都访问数据库服务器

    获取一次=>存储=>并使用LINQ进行额外的数据筛选

    在绑定以下行中的网格之前,请执行数据筛选。


  • 我确实看到您在两个
    中调用
    PullData
    !Page.IsPostBack
    以及
    else
    部分的
    PageLoad
    ,这意味着每当页面上的任何其他控件触发回发时,都将调用此函数
    PullData
    。而是为下拉列表添加一个
    OnSelectedIndexChanged
    事件,并调用
    PullData
    方法。

    。谢谢有什么例子吗?我能用的东西,和我已经在做的东西相似吗?哇。。。我没有看到编辑。非常感谢。我将在我的代码中尝试它。我添加了它,从我目前的理解来看它是有效的。谢谢:)如果我更改了查询,如何清除缓存?如果查询将其更改为一个完全不同的哈希。旧的查询/缓存数据将悄悄地消失。我将查看它。谢谢有什么例子吗?我能用的东西,和我已经在做的东西相似吗?哇。。。我没有看到编辑。非常感谢。我将在我的代码中尝试它。我添加了它,从我目前的理解来看它是有效的。谢谢:)如果我更改了查询,如何清除缓存?如果查询将其更改为一个完全不同的哈希。旧的查询/缓存数据将悄悄地消失。