reede, 10. oktoober 2008

SQL SERVER 2005 XML andmevälja näitamine GridView-ga

Et on siis SQL SERVER 2005 tabel ja seal sees on mõni tulp XML tüüpi

CREATE TABLE [dbo].[APPLICATION_CONTRACTS](
[APPLICATIONS_ID] [int] NOT NULL,
[CONTRACTS_ID] [int] NOT NULL,
[APPLICATION_OPTIONS] [xml] NULL)

ja müüd sinna APPLICATION_OPTIONS kirjutame XML andmetüübi sisse

...
DECLARE @aop XML
DECLARE @temp TABLE (jrk INT PRIMARY KEY)
INSERT INTO @temp ([jrk]) VALUES ( 1)
SET @jrk=( SELECT TOP 1 jrk FROM [dbo].[APPLICATIONS_S](DEFAULT) WHERE application_id = @application_id)
SET @aop = (SELECT TOP 1 ISNULL(@jrk,0) AS ApplicationPlaceInOrder FROM @temp FOR XML PATH('APPLICATION_OPTIONS'), TYPE)

INSERT INTO [dbo].[APPLICATION_CONTRACTS] (APPLICATIONS_ID, CONTRACTS_ID, APPLICATION_OPTIONS])
VALUES (@application_id, @contract_id,@aop)

tulemuseks on APPLICATION_OPTIONS välja sisu järgmine

<APPLICATION_OPTIONS>
<ApplicationPlaceInOrder>8</ApplicationPlaceInOrder>
</APPLICATION_OPTIONS>

siin <application_options> on XML juurelemendi nimi (langeb kogemata kokku ka andmevälja enda nimega

Ja nüüd tahame seda asja näidata ASP:Gridview

Loeme andmet baelist, APPLICATION_OPTIONS on ainult XML tüüpi
SELECT [APPLICATIONS_ID], [CONTRACTS_ID], [APPLICATION_OPTIONS]
FROM [dbo].[APPLICATION_CONTRACTS] WHERE [APPLICATIONS_ID]=4752

Iseenesest töötab ka kui lihtsalt see APPLICATION_OPTIONS sättida Gridview DataBound väljaks (sel juhul näidatakse ainult elementide sisu, kui tahetakse nii elementide nimetust ja sisu näidata siis siin üks näide:



Teeme GridView-sse ühe TemplateField ,kus on PlaceHolder kuhu bindime XML sisu

<asp:TemplateField headertext="<%$ Resources:resource, Notes %>">
<ItemTemplate>
<asp:PlaceHolder runat="server" id="AppOption">
</asp:PlaceHolder>
</ItemTemplate>
</asp:TemplateField>


GridView DataBound eventis paneme XML sisu PlaceHolderi sisse tabeli kujul, ehk loeme XML välja kui stringi ja selle stringist loome XmlDocument ja siiis käime mööda seda XML dokumenti pidi allapoole ja teeme samal ajal ka tabelit

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItem != null)
{

PlaceHolder xl = (PlaceHolder)e.Row.FindControl("AppOption");
if (!((System.Data.Common.DbDataRecord)e.Row.DataItem)["APPLICATION_OPTIONS"].Equals(DBNull.Value))
{
string he = ((System.Data.Common.DbDataRecord)e.Row.DataItem)["APPLICATION_OPTIONS"].ToString();
XmlDocument doc = new XmlDocument();
doc.LoadXml(he);
System.Web.UI.WebControls.Table te = CWTurukampusHelperUtils.xmlMarked(doc);
xl.Controls.Add(te);
}
}

tükk mis nüüd sellest XmlDocument-ist teeb asp:Table valmis

public static System.Web.UI.WebControls.Table xmlMarked(XmlDocument doc)
{
System.Web.UI.WebControls.Table tabel = new Table();
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.ChildNodes;
TableRow rida;
TableCell va;
Literal vas;
foreach (XmlNode nod in nodes)
{
rida = new TableRow();
va = new TableCell();
vas = new Literal();
try //kui ta sellist node nimetust ei leia ressursi tekstidest, võtame NODE enda nime
{

vas.Text = HttpContext.GetGlobalResourceObject("Resource", nod.Name).ToString();
}
catch (SystemException ex)
{
vas.Text = nod.Name;
}
va.Controls.Add(vas);
rida.Cells.Add(va);
va = new TableCell();
vas = new Literal();
vas.Text = nod.InnerText;
va.Controls.Add(vas);
rida.Cells.Add(va);
tabel.Rows.Add(rida);
}

return tabel;
}

Blogged with the Flock Browser