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

SearchForKnowledge

我有一个函数,每次按下按钮或每次更改7个DropDownList选择中的任何一个时,都会运行查询。如何更改现有方法以使用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服务器并运行查询,一旦我开始拥有越来越多的数据,该查询最终将减慢速度。

如何将现有方法转换为只查询一次并保存到Session / ViewState,这样就不必每次都针对SQL Server进行查询了?

黑蛙

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

您可以使用Cache.Insert方法(字符串,对象,CacheDependency,DateTime,TimeSpan)您可以找到一些很棒的缓存技巧:ASP.NET缓存:技术和最佳实践

这是我将如何构造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();
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在bash中保存功能以供以后使用?

如何在局部变量中保存地理位置详细信息以供以后使用

我如何在android中保存函数调用并在以后再次使用它

将数据库行ID保存在会话中以供以后使用

如何在Golang中保存会话

如何在Yakuake中保存会话

如何在tmux中保存多个会话?

如何在Android中保存TextView / Array并在以后检索?

如何在SQL Server中保存我的查询(公式)

如何在不调用ggplot()的情况下将ggproto对象一起添加并保存以供以后使用?

如何保存 docker 镜像以供以后安装?

保存键入的命令以供以后使用

如何腌制或存储Jupyter(IPython)笔记本会话以供以后使用

如何保存熊猫显示选项以供后续会话使用?

如何在画布上保存绘图以供以后在android中重用?

如何报告异常以供以后使用

如何使用javascript保存输入值以供以后在html中使用

如何将数据从Firestore查询加载到全局范围的变量中以供以后使用

空手道 - 如何将 XML 响应保存为 XML 以供以后使用?

如何保存回调以供以后使用node-addon-api?

如何保存变量/文本以供以后在赛普拉斯测试中使用?

如何在Vim中保存和恢复多个不同的会话?

如何在Codeigniter中保存和提取会话数据

如何在Selenium中保存浏览器会话?

如何在 Postgres 数据库中保存会话?

如何在 Xamarin Forms 中保存会话存储?

如何在Flutter应用中保存Facebook用户登录会话?

如何在ASP.NET MVC中保存登录会话

如何在SQL查询中使用会话变量?