views:

41

answers:

2

I have the following method in an App_Code/Globals.cs file:

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;
}

This gives me an XML-structure to use with the asp.net treeview control (I also use the CssFriendly extender to get nicer code)

My problem is that if I logon on my pc with a code that gives me access on a lower level in the tree hierarchy (it's an orgianization hierarchy), it somehow "remembers" what level i logon at. So when my coworker tests from her computer with another code, giving access to another place in the tree, she get's the same tree as me. (The tree is supposed to show your own level and down.)

I have added a html-comment to show what orgid it passes to the function, and the orgid passed is correct. So either the treeview caches something serverside, or the sqlquery caches it's result somehow...

Any ideas?

Sql function:

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

Extra code as requested:

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();

Where "debuglit" is a asp:Literal in the aspx file.

EDIT: I have narrowed it down. All functions returns correct values. It just doesn't bind to it. I suspect the CssFriendly adapter to have something to do with it. I disabled the CssFriendly adapter and the problem persists...

Stepping through it in debug it's correct all the way, with the stepper standing on "tvNavtree.DataBind();" I can hover the pointer over the tvNavtree.Datasource and see that it actually has the correct data. So something must be faulting in the binding process...

A: 

I would normally suspect the issue is with orgid that is getting passed in to your method, but you say that you have checked to make sure the right code is being passed. Just to confirm, show us the code that assigns the value to that.

Additionally, there are a few problems with your code, SQL injection risk being one of them. orgid is an int, offering some protection, but if at some point orgid is changed to require characters by your organization, a developer may just change the data type to string, suddenly opening up the app to SQL injection. You should remove the String.Fotmat, and use a parameterized query instead.

RedFilter
The ´GetOrgTreeXml´ is in the lower codewindow.
Christian W
A: 

I found the problem. The XmlDataSource component has a cache function, which by default is enabled. When I disabled this, everything works nicely.

Christian W