asp.net是否缓存了我的sql结果?

时间:2010-03-11 12:30:33

标签: asp.net caching

我在App_Code / Globals.cs文件中有以下方法:

public static XmlDataSource getXmlSourceFromOrgid(int orgid)
{
    XmlDataSource xds = new XmlDataSource();
    var ctx = new SensusDataContext();
    SqlConnection c = new SqlConnection(ctx.Connection.ConnectionString);
    c.Open();
    SqlCommand cmd = new SqlCommand(String.Format("select orgid, tekst, dbo.GetOrgTreeXML({0}) as Subtree from tblOrg where OrgID = {0}", orgid), c);
    var rdr = cmd.ExecuteReader();
    rdr.Read();
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("<node orgid=\"{0}\" tekst=\"{1}\">",rdr.GetInt32(0),rdr.GetString(1));
    sb.Append(rdr.GetString(2));
    sb.Append("</node>");
    xds.Data = sb.ToString();
    xds.ID = "treedata";
    rdr.Close();
    c.Close();
    return xds;
}

这给了我一个与asp.net treeview控件一起使用的XML结构(我也使用CssFriendly扩展器来获得更好的代码)

我的问题是,如果我使用代码在我的电脑上登录,该代码可以让我访问树层次结构中的较低级别(它是一个组织层次结构),它会以某种方式“记住”我登录的级别。因此,当我的同事从她的计算机上用另一个代码进行测试,访问树中的另一个地方时,她就会和我一样的树。 (该树应该显示自己的级别和向下。)

我添加了一个html-comment来显示它传递给函数的orgid,并且传递的orgid是正确的。所以要么treeview缓存了服务器端的东西,要么sqlquery以某种方式缓存它的结果......

有什么想法吗?

Sql函数:

ALTER function [dbo].[GetOrgTreeXML](@orgid int)
returns XML
begin RETURN
    (select org.orgid as '@orgid',
        org.tekst as '@tekst',
        [dbo].GetOrgTreeXML(org.orgid)
    from tblOrg org
    where (@orgid is null and Eier is null) or Eier=@orgid
    for XML PATH('NODE'), TYPE)
end

根据要求提供额外代码:

int orgid = int.Parse(Session["org"].ToString());
string orgname = context.Orgs.Where(q => q.OrgID == orgid).First().Tekst;
debuglit.Text = String.Format("<!-- Id: {0} \n name: {1} -->", orgid, orgname);
var orgxml = Globals.getXmlSourceFromOrgid(orgid);
tvNavtree.DataSource = orgxml;
tvNavtree.DataBind();

其中“debuglit”是aspx文件中的asp:Literal。

编辑: 我把它缩小了。所有函数都返回正确的值。它只是不绑定它。 我怀疑CssFriendly适配器与它有关。 我禁用了CssFriendly适配器,问题仍然存在......

在调试中单步执行它一直是正确的,步进器站在“tvNavtree.DataBind();”我可以将指针悬停在tvNavtree.Datasource上,看看它实际上有正确的数据。所以必须在绑定过程中出现错误......

2 个答案:

答案 0 :(得分:0)

我通常会怀疑问题是将orgid传递给您的方法,但是您说您已经检查过以确保传递了正确的代码。只是为了确认,向我们展示为其赋值的代码。

此外,您的代码存在一些问题,SQL注入风险就是其中之一。 orgid是一个int,提供一些保护,但如果在某些时候orgid被更改为需要组织的字符,开发人员可能只是将数据类型更改为字符串,突然打开应用程序进行SQL注入。您应该删除String.Fotmat,而是使用参数化查询。

答案 1 :(得分:0)

我发现了问题。 XmlDataSource组件具有缓存功能,默认情况下已启用。当我禁用它时,一切都很顺利。