Asp.net кеширует мои результаты sql? - PullRequest
0 голосов
/ 11 марта 2010

У меня есть следующий метод в файле 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;
}

Это дает мне XML-структуру для использования с древовидным элементом управления asp.net (я также использую расширитель CssFriendly для получения более приятного кода)

Моя проблема в том, что, если я вхожу в систему на моем компьютере с кодом, который дает мне доступ на более низком уровне в древовидной иерархии (это иерархия оргианизации), он каким-то образом «запоминает», на каком уровне я выполняю вход. Поэтому, когда моя коллега тестирует со своего компьютера другой код, предоставляя доступ к другому месту в дереве, она получает то же дерево, что и я. (Дерево должно показывать ваш собственный уровень и вниз.)

Я добавил html-комментарий, чтобы показать, какой оргид он передает функции, и переданный оргид корректен. Так что либо древовидная структура кэширует что-то на стороне сервера, либо 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" - это asp: литерал в файле aspx.

EDIT: Я сузил это. Все функции возвращают правильные значения. Это просто не связано с этим. Я подозреваю, что адаптер CssFriendly как-то связан с ним. Я отключил адаптер CssFriendly, и проблема остается ...

Пройдя через него в отладке, он все время корректен, а степпер стоит на "tvNavtree.DataBind ();" Я могу навести указатель на источник tvNavtree.Datasource и увидеть, что он действительно содержит правильные данные. Так что что-то должно быть не так в процессе привязки ...

Ответы [ 2 ]

0 голосов
/ 12 марта 2010

Я нашел проблему. Компонент XmlDataSource имеет функцию кэширования, которая по умолчанию включена. Когда я отключил это, все работает хорошо.

0 голосов
/ 11 марта 2010

Я обычно подозреваю, что проблема связана с orgid, который передается вашему методу, но вы говорите, что проверили, чтобы убедиться, что передается правильный код. Просто чтобы подтвердить, покажите нам код, который присваивает значение этому.

Кроме того, есть несколько проблем с вашим кодом, одним из которых может быть риск внедрения SQL-кода. orgid - это int, предлагающее некоторую защиту, но если в какой-то момент orgid изменится, чтобы потребовать символы от вашей организации, разработчик может просто изменить тип данных на string, внезапно открывая приложение для внедрения SQL. Вы должны удалить String.Fotmat и использовать вместо этого параметризованный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...