Mõnikord pannakse XML standardi kohaselt nimeruum dokumendile juurde.
Näiteks ISO20022 kasutamine võib tekitada sellise dokumendi
kus dokumendis on defineeritud ka nimeruum
xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02"
<?xml version='1.0' encoding='UTF-8'?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02">
<BkToCstmrAcctRpt>
<GrpHdr>
<MsgId>2014013002396394670001</MsgId>
</GrpHdr>
<Rpt>
<Id>552859428-EUR-1</Id>
</Rpt>
<CreDtTm>2014-01-30T16:00:09</CreDtTm>
<FrToDt>
<FrDtTm>2014-01-30T00:00:00</FrDtTm>
<ToDtTm>2014-01-30T16:00:15</ToDtTm>
</FrToDt>
<Acct>
<Id>
<IBAN>EE112670221023582381</IBAN>
</Id>
<Acct>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2014012300101119-1</AcctSvcrRef>
<EndToEndId>NOT PROVIDED</EndToEndId>
</Refs>
<AmtDtls>
<InstdAmt>
<Amt Ccy="EUR">132.29</Amt>
</InstdAmt>
<TxAmt>
<Amt Ccy="EUR">132.29</Amt>
</TxAmt>
</AmtDtls>
<RltdPties>
<Dbtr>
<Nm>PAOLO OSCAR GARCIA</Nm>
<PstlAdr>
<Ctry>ES</Ctry>
<AdrLine>CL.SAN ROQUE, 61 12-4 12004 CASTELLON DE LA PLANA, CASTELLON/C</AdrLine>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>ES9862342069989523042901</IBAN>
</Id>
</DbtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<BIC>EVOBESMMXXX</BIC>
</FinInstnId>
</DbtrAgt>
</RltdAgts>
<RmtInf>
<Ustrd>1098052330002 PAOLO OSCAR GARCIA</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<NtryRef>2014012300203432-1</NtryRef>
<Amt Ccy="EUR">68.97</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2014-01-23</Dt>
</BookgDt>
<ValDt>
<Dt>2014-01-23</Dt>
</ValDt>
<AcctSvcrRef>2014012300203432-1</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>DMCT</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>MK</Cd>
<Issr>Swedbank AS</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2014012300203432-1</AcctSvcrRef>
<InstrId>11</InstrId>
</Refs>
<AmtDtls>
<TxAmt>
<Amt Ccy="EUR">68.97</Amt>
</TxAmt>
</AmtDtls>
<RltdPties>
<Dbtr>
<Nm>Paul Hark</Nm>
<Id>
<PrvtId>
<Othr>
<Id>3933034216</Id>
</Othr>
</PrvtId>
</Id>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>EE634129278536542306</IBAN>
</Id>
</DbtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<BIC>EKRDEE22</BIC>
</FinInstnId>
</DbtrAgt>
</RltdAgts>
<RmtInf>
<Ustrd>Nooruse 17-2 Arve nr. 109316 Paul Hark</Ustrd>
<Strd>
<CdtrRefInf>
<Tp>
<CdOrPrtry>
<Cd>SCOR</Cd>
</CdOrPrtry>
</Tp>
<Ref>1093160210005</Ref>
</CdtrRefInf>
</Strd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
</BkToCstmrAcctRpt>
</Document>
Sellise faili lugemina käib nagu ikka
XmlDocument xdoc = new XmlDocument();
xdoc.Load(file);
kuna dokumendil on nimeruum siis tuleb see XmlNamespaceManageri kasutades ära näidata
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("bk", "urn:iso:std:iso:20022:tech:xsd:camt.052.001.02");
bk on nüüd nimeruumi alias mida XPathis kasutada tuleb.
Paar asja mis tuleb tähele panna
Esiteks nimeruumi kasutamine XPath otsingus, alias tuleb iga pathi ette kirjutada
bk defineerisime AddNamespace meetodiga
XmlNode nod = xdoc.SelectSingleNode("//bk:Rpt//bk:Acct//bk:Id//bk:IBAN", nsmgr);
string pkood = nod.InnerText.Trim();
ehk näite põhjal tuleb vastuseks EE112670221023582381
Teiseks foreach tsüklis tipule viitamine, siin tuleb XPath avaldist alustada punktiga
XmlNodeList rows = xdoc.SelectNodes("//bk:Ntry", nsmgr);
foreach (XmlNode nrow in rows)
{
nod = nrow.SelectSingleNode(".//bk:NtryDtls//bk:TxDtls//bk:RltdPties//bk:Dbtr//bk:Nm", nsmgr);
}
kui punkti algusse ei pane siis tsükkel võtab alati esimese leitud XPathi avaldise tulemuse
Kuvatud on postitused sildiga XML. Kuva kõik postitused
Kuvatud on postitused sildiga XML. Kuva kõik postitused
esmaspäev, 10. veebruar 2014
reede, 4. november 2011
Named Template tegemine XSL abil
Kui on XML dokumendis samas struktuuriga tippe mida vaja teise dokumenti teisendada sobis selleks named
template kasutamine. Lähtedokumendis selline osa sees mida vaja teisendada:
<DocumentParties>
<BuyerParty context="partner">
<PartyCode>RISMA</PartyCode>
<Name>RISMA Peremarket AS</Name>
</BuyerParty>
<OrderParty context="partner">
<PartyCode>RISMA_200</PartyCode>
<Name>RISMA Peremarket AS Sukupilli KK</Name>
</OrderParty>
<SellerParty context="self">
<PartyCode>-</PartyCode>
<Name>Vensky Kaubanduse AS</Name>
</SellerParty>
<DeliveryParty context="partner">
<PartyCode>RISMA_200</PartyCode>
<Name>RISMA Peremarket AS Sukupilli KK</Name>
</DeliveryParty>
</DocumentParties>
Alamtippude sisu sama aga tipu nimi erinev. Et ei peaks iga tipu jaoks oma malli tegema võib kasutada named template.
Named XSL template väljakutsumine iseenesest selline, parameetrina annab sisse tipu sisu ja tipu nime
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/OrderParty" />
<xsl:with-param name="partynode" select="'RecipientParty'" />
</xsl:call-template>
Kogu kupatus koos tipu olemasolu kontrollidega, InvoiceParties all on need tipud mida peale teisendamist vaja saada
<InvoiceParties>
<xsl:if test="/E-Document/Document/DocumentParties/SellerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/SellerParty" />
<xsl:with-param name="partynode" select="'SellerParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/BuyerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/BuyerParty" />
<xsl:with-param name="partynode" select="'BuyerParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/OrderParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/OrderParty" />
<xsl:with-param name="partynode" select="'RecipientParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/DeliveryParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/DeliveryParty" />
<xsl:with-param name="partynode" select="'DeliveryParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/PayerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/PayerParty" />
<xsl:with-param name="partynode" select="'PayerParty'" />
</xsl:call-template>
</xsl:if>
</InvoiceParties>
Named template ise
<xsl:template name="Party">
<!--node mis antakse sisse töötlemiseks-->
<xsl:param name="party" />
<!--node nimi mis parameetrina sisse antakse-->
<xsl:param name="partynode" />
<!--teeme parameetri nime järgi tipu-->
<xsl:element name="{$partynode}">
<UniqueCode>
<xsl:value-of select="$party/PartyCode"/>
</UniqueCode>
<Name>
<xsl:value-of select="$party/Name"/>
</Name>
<xsl:if test="$party/DepID">
<DepId>
<xsl:value-of select="$party/DepID"/>
</DepId>
</xsl:if>
<xsl:if test="$party/RegNum">
<RegNumber>
<xsl:value-of select="$party/RegNum"/>
</RegNumber>
</xsl:if>
<xsl:if test="$party/VATRegNum">
<VATRegNumber>
<xsl:value-of select="$party/VATRegNum"/>
</VATRegNumber>
</xsl:if>
<!--kontaktandmed-->
<xsl:apply-templates select="$party/ContactData"></xsl:apply-templates>
<!--konto info-->
<xsl:apply-templates select="$party/AccountInfo"></xsl:apply-templates>
<xsl:apply-templates select="$party/Extension"></xsl:apply-templates>
</xsl:element>
</xsl:template>
template kasutamine. Lähtedokumendis selline osa sees mida vaja teisendada:
<DocumentParties>
<BuyerParty context="partner">
<PartyCode>RISMA</PartyCode>
<Name>RISMA Peremarket AS</Name>
</BuyerParty>
<OrderParty context="partner">
<PartyCode>RISMA_200</PartyCode>
<Name>RISMA Peremarket AS Sukupilli KK</Name>
</OrderParty>
<SellerParty context="self">
<PartyCode>-</PartyCode>
<Name>Vensky Kaubanduse AS</Name>
</SellerParty>
<DeliveryParty context="partner">
<PartyCode>RISMA_200</PartyCode>
<Name>RISMA Peremarket AS Sukupilli KK</Name>
</DeliveryParty>
</DocumentParties>
Alamtippude sisu sama aga tipu nimi erinev. Et ei peaks iga tipu jaoks oma malli tegema võib kasutada named template.
Named XSL template väljakutsumine iseenesest selline, parameetrina annab sisse tipu sisu ja tipu nime
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/OrderParty" />
<xsl:with-param name="partynode" select="'RecipientParty'" />
</xsl:call-template>
Kogu kupatus koos tipu olemasolu kontrollidega, InvoiceParties all on need tipud mida peale teisendamist vaja saada
<InvoiceParties>
<xsl:if test="/E-Document/Document/DocumentParties/SellerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/SellerParty" />
<xsl:with-param name="partynode" select="'SellerParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/BuyerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/BuyerParty" />
<xsl:with-param name="partynode" select="'BuyerParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/OrderParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/OrderParty" />
<xsl:with-param name="partynode" select="'RecipientParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/DeliveryParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/DeliveryParty" />
<xsl:with-param name="partynode" select="'DeliveryParty'" />
</xsl:call-template>
</xsl:if>
<xsl:if test="/E-Document/Document/DocumentParties/PayerParty">
<xsl:call-template name="Party">
<xsl:with-param name="party" select="/E-Document/Document/DocumentParties/PayerParty" />
<xsl:with-param name="partynode" select="'PayerParty'" />
</xsl:call-template>
</xsl:if>
</InvoiceParties>
Named template ise
<xsl:template name="Party">
<!--node mis antakse sisse töötlemiseks-->
<xsl:param name="party" />
<!--node nimi mis parameetrina sisse antakse-->
<xsl:param name="partynode" />
<!--teeme parameetri nime järgi tipu-->
<xsl:element name="{$partynode}">
<UniqueCode>
<xsl:value-of select="$party/PartyCode"/>
</UniqueCode>
<Name>
<xsl:value-of select="$party/Name"/>
</Name>
<xsl:if test="$party/DepID">
<DepId>
<xsl:value-of select="$party/DepID"/>
</DepId>
</xsl:if>
<xsl:if test="$party/RegNum">
<RegNumber>
<xsl:value-of select="$party/RegNum"/>
</RegNumber>
</xsl:if>
<xsl:if test="$party/VATRegNum">
<VATRegNumber>
<xsl:value-of select="$party/VATRegNum"/>
</VATRegNumber>
</xsl:if>
<!--kontaktandmed-->
<xsl:apply-templates select="$party/ContactData"></xsl:apply-templates>
<!--konto info-->
<xsl:apply-templates select="$party/AccountInfo"></xsl:apply-templates>
<xsl:apply-templates select="$party/Extension"></xsl:apply-templates>
</xsl:element>
</xsl:template>
reede, 21. oktoober 2011
Tühik ja reavahe XSL stylesheedil põhjustavad veateate xsl:attribute korral
XSL stylesheedi rakendamisel annab VisualStudio2010 vea
Vea põhjuseks võivad olla ka reavahetus/tühikud elementide vahel
<Invoice languageId="" templateId="" channelId="" factoring="" regNumber="" serviceId="" channelAddress="">
<xsl:attribute name="invoiceId">
<xsl:value-of select="/E-Document/Document/DocumentInfo/DocumentNum"/>
</xsl:attribute>
veast saab lahti kui kahe elemendi vahelt tühikud ja reavahed ära korjad, ei näe küll ilus välja aga töötab
<Invoice languageId="" templateId="" channelId="" factoring="" regNumber="" serviceId="" channelAddress=""><xsl:attribute name="invoiceId">
<xsl:value-of select="/E-Document/Document/DocumentInfo/DocumentNum"/>
</xsl:attribute>
Attribute and namespace nodes cannot be added to the parent element after a text, comment, pi, or sub-element node has already been added
Vea põhjuseks võivad olla ka reavahetus/tühikud elementide vahel
<Invoice languageId="" templateId="" channelId="" factoring="" regNumber="" serviceId="" channelAddress="">
<xsl:attribute name="invoiceId">
<xsl:value-of select="/E-Document/Document/DocumentInfo/DocumentNum"/>
</xsl:attribute>
veast saab lahti kui kahe elemendi vahelt tühikud ja reavahed ära korjad, ei näe küll ilus välja aga töötab
<Invoice languageId="" templateId="" channelId="" factoring="" regNumber="" serviceId="" channelAddress=""><xsl:attribute name="invoiceId">
<xsl:value-of select="/E-Document/Document/DocumentInfo/DocumentNum"/>
</xsl:attribute>
kolmapäev, 18. november 2009
Võõra XmlNode panemine teise XmlDocument -i sisse
Kõik XmlNode tüüpi asjad on konkreetselt seotud selle XmlDocument-iga, mille külge nad tehti.
Kui nüüd tahta "võõrast" XmlNode panna teise XmlDocument-i sisse tuleb see importida
//algne XmlDocument
XmlDocument res = new XmlDocument();
XmlElement elem = res.CreateElement("SkoorResult");
res.AppendChild(elem);
// see "nd" on nüüd see "võõras" node, mille kuskilt mujalt saame
TimeZoneInfo localZone = TimeZoneInfo.Local;
TimeSpan vahe = localZone.GetUtcOffset(System.DateTime.Now);
XmlNode nd = MakeRequest(nod,vahe);
//impordime sisse
XmlNode nodeToMove = res.ImportNode(nd, true);
res.DocumentElement.AppendChild(nodeToMove);
Kui nüüd tahta "võõrast" XmlNode panna teise XmlDocument-i sisse tuleb see importida
//algne XmlDocument
XmlDocument res = new XmlDocument();
XmlElement elem = res.CreateElement("SkoorResult");
res.AppendChild(elem);
// see "nd" on nüüd see "võõras" node, mille kuskilt mujalt saame
TimeZoneInfo localZone = TimeZoneInfo.Local;
TimeSpan vahe = localZone.GetUtcOffset(System.DateTime.Now);
XmlNode nd = MakeRequest(nod,vahe);
//impordime sisse
XmlNode nodeToMove = res.ImportNode(nd, true);
res.DocumentElement.AppendChild(nodeToMove);
reede, 23. oktoober 2009
XML andmete näitamine TreeView ja XmlDataSourcega
Andmebaasis on XML väli kuhu paneb sisse igasugu andmeid, peamiselt logimisinfot mille jaoks iga kord tabelisse eraldi tulpa teha ei viitsi. XML andmete stuktuur kuidas kunagi
mõnel rohkem
mõnel vähem
ja tulevikus võib vajadusel juurde lisada.

Ekraanil hierarhiliste andmete näitamiseks sobib hästi TreeView nimeline control, XML andmed salvestab XmlDataSource
Tähele peab panema, et XmlDataSource on EnableCaching vaikimisi True, kuna vaja andmebaasist dünaamiliselt iga kord uusi andmeid näidata tuleb
EnableCaching="false" seada
Vaikmisi TreeView seab andmed XML elementde külhge, et ekraanil näitab ainult
Options, AcceptedUser ja RELATED_CONTRACT teksti nii nagu XML andmete tippude nimed on, kuna see mis andmebaasi XML väljast tuleb võib igakord erinev olla siis
ontreenodedatabound="TreeViewExtraInfo_TreeNodeDataBound" eventis tuleb natuke käsitsitööd teha, näiteks nii:
protected void TreeViewExtraInfo_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
try
{
System.Xml.XmlElement cdf = (System.Xml.XmlElement)e.Node.DataItem;
if (cdf.Name == "Options") //juurelement
{
e.Node.Text = Resources.Resource.ExtraInfo;
}
else
{
if (cdf.InnerXml != "")
{
try //kui ta sellist node nimetust ei leia resursi tekstidest, võtame NODE enda nime
{
e.Node.Text = HttpContext.GetGlobalResourceObject("Resource", cdf.Name).ToString()+ " " + cdf.InnerText;
}
catch (SystemException ex)
{
e.Node.Text = cdf.Name + " " + cdf.InnerText;
}
}
}
if (cdf.HasAttributes) //kui on atribuute siis lisame elemendile ühe alamtipu
{
for (int i = 0; i < cdf.Attributes.Count; i++)
{
TreeNode db;
try
{
//kas ressursi tekstides on tipu elemendi kirjeldus olemas
db = new TreeNode(HttpContext.GetGlobalResourceObject("Resource", cdf.Attributes[i].Name).ToString() + " " + cdf.Attributes[i].Value);
}
catch (SystemException ex)
{
db = new TreeNode(cdf.Attributes[i].Name + " " + cdf.Attributes[i].Value);
}
e.Node.ChildNodes.Add(db);
}
}
}
catch (SystemException ex)
{
this.CustomValidator1.ErrorMessage = ex.Message;
this.CustomValidator1.IsValid = false;
}
}
Ekraanile aga paistab:

AcceptedUseri all on atribuutidest tehtud lisatipud
Andmete külgepanemine käib XmlDataSourceExtraInfo.Data property kaudu
this.XmlDataSourceExtraInfo.Data = this.ApplicationOptions(this.application_id);
this.TreeViewExtraInfo.DataBind();
siin this.ApplicationOptions(this.application_id) tagastab XML stringi mille andmebaasi XML väljast loen
public string ApplicationOptions(int applicationId)
{
string retu = "";
using (SqlConnection konn = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand komm = new SqlCommand("SELECT [dbo].[APPLICATION_OPTIONS_KUIDO_S](" + applicationId.ToString() + ")", konn);
komm.CommandType = CommandType.Text;
konn.Open();
Object ret = komm.ExecuteScalar();
if (!ret.Equals(DBNull.Value))
{
retu = ret.ToString();
}
konn.Close();
}
return retu;
}
mõnel rohkem
mõnel vähemja tulevikus võib vajadusel juurde lisada.

Ekraanil hierarhiliste andmete näitamiseks sobib hästi TreeView nimeline control, XML andmed salvestab XmlDataSource
Tähele peab panema, et XmlDataSource on EnableCaching vaikimisi True, kuna vaja andmebaasist dünaamiliselt iga kord uusi andmeid näidata tulebEnableCaching="false" seada
Vaikmisi TreeView seab andmed XML elementde külhge, et ekraanil näitab ainult
Options, AcceptedUser ja RELATED_CONTRACT teksti nii nagu XML andmete tippude nimed on, kuna see mis andmebaasi XML väljast tuleb võib igakord erinev olla siis
ontreenodedatabound="TreeViewExtraInfo_TreeNodeDataBound" eventis tuleb natuke käsitsitööd teha, näiteks nii:
protected void TreeViewExtraInfo_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
try
{
System.Xml.XmlElement cdf = (System.Xml.XmlElement)e.Node.DataItem;
if (cdf.Name == "Options") //juurelement
{
e.Node.Text = Resources.Resource.ExtraInfo;
}
else
{
if (cdf.InnerXml != "")
{
try //kui ta sellist node nimetust ei leia resursi tekstidest, võtame NODE enda nime
{
e.Node.Text = HttpContext.GetGlobalResourceObject("Resource", cdf.Name).ToString()+ " " + cdf.InnerText;
}
catch (SystemException ex)
{
e.Node.Text = cdf.Name + " " + cdf.InnerText;
}
}
}
if (cdf.HasAttributes) //kui on atribuute siis lisame elemendile ühe alamtipu
{
for (int i = 0; i < cdf.Attributes.Count; i++)
{
TreeNode db;
try
{
//kas ressursi tekstides on tipu elemendi kirjeldus olemas
db = new TreeNode(HttpContext.GetGlobalResourceObject("Resource", cdf.Attributes[i].Name).ToString() + " " + cdf.Attributes[i].Value);
}
catch (SystemException ex)
{
db = new TreeNode(cdf.Attributes[i].Name + " " + cdf.Attributes[i].Value);
}
e.Node.ChildNodes.Add(db);
}
}
}
catch (SystemException ex)
{
this.CustomValidator1.ErrorMessage = ex.Message;
this.CustomValidator1.IsValid = false;
}
}
Ekraanile aga paistab:

AcceptedUseri all on atribuutidest tehtud lisatipud
Andmete külgepanemine käib XmlDataSourceExtraInfo.Data property kaudu
this.XmlDataSourceExtraInfo.Data = this.ApplicationOptions(this.application_id);
this.TreeViewExtraInfo.DataBind();
siin this.ApplicationOptions(this.application_id) tagastab XML stringi mille andmebaasi XML väljast loen
public string ApplicationOptions(int applicationId)
{
string retu = "";
using (SqlConnection konn = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand komm = new SqlCommand("SELECT [dbo].[APPLICATION_OPTIONS_KUIDO_S](" + applicationId.ToString() + ")", konn);
komm.CommandType = CommandType.Text;
konn.Open();
Object ret = komm.ExecuteScalar();
if (!ret.Equals(DBNull.Value))
{
retu = ret.ToString();
}
konn.Close();
}
return retu;
}
neljapäev, 1. oktoober 2009
XML välja sisu ilusaks ajamine peale sql:variable-ga mudimist
Selline juhtum, kui on vaja SQL SERVER-i XML muutujat vahepeal muuta no näiteks
DECLARE @aop XML, @lep INT, @relcon NVARCHAR(2000)
SET @relcon=''+CAST(@contractId AS NVARCHAR(20))+' '
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT')
IF @lep IS NULL --KUI RELATED_CONTRACT on puudu, lisame vastava NODE
SET @aop.modify('insert text{sql:variable("@relcon")} as last into (/Options)[1]')
kui nüüd SQL SERVER manageriga seda @aop sisu vaadata on seal '<' asemel
mis ei ole üldsegi ilus, et see asi korda saada tuleb stringitöötlust teha, XML muutuja pöörata NVARCHAR(MAX), muuta ära ja pöörata XML-iks tagasi

Kui tahad XML välja RAISERRORIGA ekraanile lasta, siis tuleb samuti stringitöötlust teha
SET @relcon = REPLACE(CAST(@aop AS NVARCHAR(4000)),'<','_')
RAISERROR('XML info %s',16,1,@relcon)
ASP.NET tõlgendab ju '<' algavaid asju kui HTML-i elemente mis tegelikult ongi õige
DECLARE @aop XML, @lep INT, @relcon NVARCHAR(2000)
SET @relcon='
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT')
IF @lep IS NULL --KUI RELATED_CONTRACT on puudu, lisame vastava NODE
SET @aop.modify('insert text{sql:variable("@relcon")} as last into (/Options)[1]')
kui nüüd SQL SERVER manageriga seda @aop sisu vaadata on seal '<' asemel

mis ei ole üldsegi ilus, et see asi korda saada tuleb stringitöötlust teha, XML muutuja pöörata NVARCHAR(MAX), muuta ära ja pöörata XML-iks tagasi

Kui tahad XML välja RAISERRORIGA ekraanile lasta, siis tuleb samuti stringitöötlust teha
SET @relcon = REPLACE(CAST(@aop AS NVARCHAR(4000)),'<','_')
RAISERROR('XML info %s',16,1,@relcon)
ASP.NET tõlgendab ju '<' algavaid asju kui HTML-i elemente mis tegelikult ongi õige
kolmapäev, 20. mai 2009
SQL SERVER-ile ligipääsu piiramine IP aadressi põhiselt EVENTDATA() XML andmeid kasutades
Kui on ASP.NET veebirakendus istub serveril koos teiste SQL SERVER baasi kasutavate rakendustega ja SQL SERVER-i port on väljast lahti kuid enda rakendusel pöördumine andmebaasi käib ainult läbi veebirakenduse võib kasutada SQL SERVER-i LOGON trigerit, et piirata mujalt rakenduse andmebaasile ligipääsu. DDL LOGON trigeris uurib, kust ühenduti ja seejärel otsustab. Mõjub ainult nendele SQL LOGIN-ite mille vaikimisi andmebaas langeb kokku trigeris määratuga.
Nõuab SQL SERVER 2005 SP2 vähemalt. RAISERROR veateated lähevad ainult Serveri Application Event logisse. Kui IP aadress ei sobi saab sellise veateate:
Logon failed for login 'USERNAME' due to trigger execution
ALTER TRIGGER [KONTROLL_LOGON_CheckIP]
ON ALL SERVER
WITH EXECUTE AS 'sa' --kasutaja peab olema sysadmin fixed server role või ALTER TRACE õigusega kuna RAISERROR WITH LOG kasutame
FOR LOGON
AS
BEGIN
DECLARE @ev XML, @usr NVARCHAR(50), @ip NVARCHAR(35), @lubat INT, @defdb NVARCHAR(128)
SET @defdb='ABAASINIMI' --andmebaasi nimi, kus meil rakendus serveril sees on
SET @ev=(SELECT EVENTDATA())
SELECT @ip = @ev.value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(35)') --kliendi IP aadress
,@usr=@ev.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(50)') --kasutajanimi
IF @ip IS NULL --kui ühendutakse mingi muu protokolliga
RETURN
-- --uurime et on tegu SQL Loginiga ja on tegu LOGON tüüpi sündmusega
IF (SELECT @ev.value('(/EVENT_INSTANCE/LoginType)[1]', 'NVARCHAR(15)')) = 'SQL Login' --piirame ainult SQL Loginite ligipääsu
AND (SELECT @ev.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(15)')) = 'LOGON'
BEGIN
--kontrollime, kas on üldse ligipääs lubatud määratud andmebaasi, loginil peab olema @defdb baas määratud vaikimisi andmebaasiks
SET @lubat = (SELECT is_disabled FROM sys.sql_logins WITH (NOLOCK) WHERE name=@usr AND default_database_name=@defdb)
IF @lubat = 0 --kui antud SQL SERVER loginil on vaikimisi andmebaasile ligipääs lubatud
BEGIN
IF @ip NOT IN ('10.0.40.8') --Siia sulgudesse need IP aadressid, kust on lubatud ligipääs andmebaasile
BEGIN
RAISERROR('Ligipääs andmebaasile %s IP aadressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
--kui vaja kuskilegi kirja panna, et ligi ei saadud
--INSERT INTO [test].[dbo].[LOGI] (IPA, [EVENT]) VALUES (@ip,@ev)
RETURN
END
END
ELSE --kasutajal puudub vaikimisi juurdepääs määratud andmebaasile, mingi muu kasutaja
BEGIN
RAISERROR('Ligipääs vaikimisi andemebaasile %s IP addressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
RETURN
END
END
Nõuab SQL SERVER 2005 SP2 vähemalt. RAISERROR veateated lähevad ainult Serveri Application Event logisse. Kui IP aadress ei sobi saab sellise veateate:
Logon failed for login 'USERNAME' due to trigger execution
ALTER TRIGGER [KONTROLL_LOGON_CheckIP]
ON ALL SERVER
WITH EXECUTE AS 'sa' --kasutaja peab olema sysadmin fixed server role või ALTER TRACE õigusega kuna RAISERROR WITH LOG kasutame
FOR LOGON
AS
BEGIN
DECLARE @ev XML, @usr NVARCHAR(50), @ip NVARCHAR(35), @lubat INT, @defdb NVARCHAR(128)
SET @defdb='ABAASINIMI' --andmebaasi nimi, kus meil rakendus serveril sees on
SET @ev=(SELECT EVENTDATA())
SELECT @ip = @ev.value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(35)') --kliendi IP aadress
,@usr=@ev.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(50)') --kasutajanimi
IF @ip IS NULL --kui ühendutakse mingi muu protokolliga
RETURN
-- --uurime et on tegu SQL Loginiga ja on tegu LOGON tüüpi sündmusega
IF (SELECT @ev.value('(/EVENT_INSTANCE/LoginType)[1]', 'NVARCHAR(15)')) = 'SQL Login' --piirame ainult SQL Loginite ligipääsu
AND (SELECT @ev.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(15)')) = 'LOGON'
BEGIN
--kontrollime, kas on üldse ligipääs lubatud määratud andmebaasi, loginil peab olema @defdb baas määratud vaikimisi andmebaasiks
SET @lubat = (SELECT is_disabled FROM sys.sql_logins WITH (NOLOCK) WHERE name=@usr AND default_database_name=@defdb)
IF @lubat = 0 --kui antud SQL SERVER loginil on vaikimisi andmebaasile ligipääs lubatud
BEGIN
IF @ip NOT IN ('10.0.40.8') --Siia sulgudesse need IP aadressid, kust on lubatud ligipääs andmebaasile
BEGIN
RAISERROR('Ligipääs andmebaasile %s IP aadressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
--kui vaja kuskilegi kirja panna, et ligi ei saadud
--INSERT INTO [test].[dbo].[LOGI] (IPA, [EVENT]) VALUES (@ip,@ev)
RETURN
END
END
ELSE --kasutajal puudub vaikimisi juurdepääs määratud andmebaasile, mingi muu kasutaja
BEGIN
RAISERROR('Ligipääs vaikimisi andemebaasile %s IP addressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
RETURN
END
END
END
Triger ei rakendu, kui ühendutakse Dedicated Administrator Connection-i kaudu
Päring teada saamaks, kes ja kuidas sul SQL SERVER-i küljes on
SELECT s.session_id
, c.connect_time
, s.login_time
, s.login_name, s.original_login_name
, c.protocol_type
, c.client_net_address
, c.client_tcp_port
, c.auth_scheme
, s.HOST_NAME
, s.program_name, s.client_interface_name
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_connections c
ON s.session_id = c.session_id
Blogged with the Flock Browser
reede, 8. mai 2009
XML muutuja tagastamine MS SQL SERVER-i salvestatud protseduurist
Isegi siin on omapärad, on salvestatud protseduur, kust tagastatakse ka XML tüüpi muutuja
Salvestatud protseduur ise
ALTER PROCEDURE [dbo].[HOUSE_DEP_KUIDO_U]
@teenuse_id NCHAR(5),
@genarved XML=NULL OUTPUT --seda tahame kätte saada
--siin annab @genarved muutujale väärtuse
DECLARE @arved TABLE (account_id BIGINT PRIMARY KEY)
INSERT INTO @arved (account_id) VALUES(13)
INSERT INTO @arved (account_id) VALUES(12)
SET @genarved = ( SELECT account_id AS 'Invoice/@InvoiceId' FROM @arved FOR XML PATH(''), TYPE, ROOT('Invoices') )
tulemus on SQL-is XML-ina on
<Invoices>
<Invoice InvoiceId="12" />
<Invoice InvoiceId="13" />
</Invoices>
Antud asja ADO.NET-is kasutamine
using System.Data.SqlClient;
using System.Xml;
using System.Data;
using (SqlConnection konn = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand komm = new SqlCommand("[dbo].[HOUSE_DEP_KUIDO_U]", konn);
komm.CommandType = CommandType.StoredProcedure;
// siin tuleb SqlDbType.Xml tüübi suuruseks panna positiivne arv ja määrab ka et on tagastatav parameeter
komm.Parameters.Add("@genarved", SqlDbType.Xml,8).Direction = ParameterDirection.InputOutput;
konn.Open();
komm.ExecuteNonQuery();
}
//XML muutuja lugemine ADO.NET XmlDocument objekti
XmlDocument kort = new XmlDocument();
kort.LoadXml(komm.Parameters["@genarved"].Value.ToString().Trim());
Salvestatud protseduur ise
ALTER PROCEDURE [dbo].[HOUSE_DEP_KUIDO_U]
@teenuse_id NCHAR(5),
@genarved XML=NULL OUTPUT --seda tahame kätte saada
--siin annab @genarved muutujale väärtuse
DECLARE @arved TABLE (account_id BIGINT PRIMARY KEY)
INSERT INTO @arved (account_id) VALUES(13)
INSERT INTO @arved (account_id) VALUES(12)
SET @genarved = ( SELECT account_id AS 'Invoice/@InvoiceId' FROM @arved FOR XML PATH(''), TYPE, ROOT('Invoices') )
tulemus on SQL-is XML-ina on
<Invoices>
<Invoice InvoiceId="12" />
<Invoice InvoiceId="13" />
</Invoices>
Antud asja ADO.NET-is kasutamine
using System.Data.SqlClient;
using System.Xml;
using System.Data;
using (SqlConnection konn = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand komm = new SqlCommand("[dbo].[HOUSE_DEP_KUIDO_U]", konn);
komm.CommandType = CommandType.StoredProcedure;
// siin tuleb SqlDbType.Xml tüübi suuruseks panna positiivne arv ja määrab ka et on tagastatav parameeter
komm.Parameters.Add("@genarved", SqlDbType.Xml,8).Direction = ParameterDirection.InputOutput;
konn.Open();
komm.ExecuteNonQuery();
}
//XML muutuja lugemine ADO.NET XmlDocument objekti
XmlDocument kort = new XmlDocument();
kort.LoadXml(komm.Parameters["@genarved"].Value.ToString().Trim());
Blogged with the Flock Browser
neljapäev, 23. aprill 2009
XML muutujaga pakettmuudatuse (Batch Update) sooritamine
Ühekaupa SQL SERVER-is ridu muuta on SQL SERVER-ile väga piinarikas
kui vaja portsu ridadega andmebaasis midagi teha siis saab kasutada XML muutujat selle asja tegemiseks
Ekraanil mingi asp:TreeNode element, kus saab linnukesega ära märkida, et muuda nüüd selle rea andmeid
Kõigepealt teeb valmis XML muutuja, mille annab andmebaasi protseduuri sisse
using System.Xml;
XmlDocument xdoc = new XmlDocument();
XmlElement el;
el = xdoc.CreateElement("CvNodeElement"); //juurikas
xdoc.AppendChild(el);
foreach (TreeNode no in nod)
{
va = no.Value;
XmlElement childelmt;
XmlAttribute childattr;
//Create child with ID attribute
childelmt = xdoc.CreateElement("Node");
childattr = xdoc.CreateAttribute("ItemId");
childattr.Value = va.ToString();
childelmt.Attributes.Append(childattr);
childattr = xdoc.CreateAttribute("IsPublic");
childattr.Value = no.Checked ? "1" : "0";
childelmt.Attributes.Append(childattr);
el.AppendChild(childelmt);
}
SqlCommandile nüüd XML parameeter külge
komm.Parameters.Add("@doc", SqlDbType.Xml);
komm.Parameters["@doc"].Value = xdoc.InnerXml;
Andmebaasi protseduur
ALTER PROCEDURE [dbo].[CVPublish_Kuido_U]
@doc XML --xml muutuja mis tehakse asp.net-is valmis
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
DECLARE @idoc INT
DECLARE @muutused TABLE (Itemid INT, IsPublic BIT)
--lammutame XML-i tabelmuutujaks
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
INSERT INTO @muutused ([Itemid],[IsPublic])
SELECT Itemid , IsPublic
FROM OPENXML (@idoc, '/CvNodeElement/Node',1)
WITH (ItemId INT, IsPublic BIT)
EXEC sp_xml_removedocument @idoc
--ja nüüd muudame andmebaasis portsul kirjetel
-- CV_CfPersResPatId on tabeli primaarvõti
UPDATE dbo.[CV_CfPersResPat]
SET [CV_CfPersResPat].[IsPublic] = ec.[IsPublic]
FROM dbo.[CV_CfPersResPat] INNER JOIN @muutused AS ec
ON ( CV_CfPersResPat.CV_CfPersResPatId = ec.Itemid
AND [CV_CfPersResPat].[IsPublic] <> ec.[IsPublic] --muudame ainult neil, milel on IsPublic muutunud, hoiab veelgi kokku
)
END
XML-iga muutujate sisseandmist saab kasutada ka siis, kui on vaja protseduurile korraga palju parameetreid sisse annda
kui vaja portsu ridadega andmebaasis midagi teha siis saab kasutada XML muutujat selle asja tegemiseks
Ekraanil mingi asp:TreeNode element, kus saab linnukesega ära märkida, et muuda nüüd selle rea andmeid
Kõigepealt teeb valmis XML muutuja, mille annab andmebaasi protseduuri sisse
using System.Xml;
XmlDocument xdoc = new XmlDocument();
XmlElement el;
el = xdoc.CreateElement("CvNodeElement"); //juurikas
xdoc.AppendChild(el);
foreach (TreeNode no in nod)
{
va = no.Value;
XmlElement childelmt;
XmlAttribute childattr;
//Create child with ID attribute
childelmt = xdoc.CreateElement("Node");
childattr = xdoc.CreateAttribute("ItemId");
childattr.Value = va.ToString();
childelmt.Attributes.Append(childattr);
childattr = xdoc.CreateAttribute("IsPublic");
childattr.Value = no.Checked ? "1" : "0";
childelmt.Attributes.Append(childattr);
el.AppendChild(childelmt);
}
SqlCommandile nüüd XML parameeter külge
komm.Parameters.Add("@doc", SqlDbType.Xml);
komm.Parameters["@doc"].Value = xdoc.InnerXml;
Andmebaasi protseduur
ALTER PROCEDURE [dbo].[CVPublish_Kuido_U]
@doc XML --xml muutuja mis tehakse asp.net-is valmis
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
DECLARE @idoc INT
DECLARE @muutused TABLE (Itemid INT, IsPublic BIT)
--lammutame XML-i tabelmuutujaks
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
INSERT INTO @muutused ([Itemid],[IsPublic])
SELECT Itemid , IsPublic
FROM OPENXML (@idoc, '/CvNodeElement/Node',1)
WITH (ItemId INT, IsPublic BIT)
EXEC sp_xml_removedocument @idoc
--ja nüüd muudame andmebaasis portsul kirjetel
-- CV_CfPersResPatId on tabeli primaarvõti
UPDATE dbo.[CV_CfPersResPat]
SET [CV_CfPersResPat].[IsPublic] = ec.[IsPublic]
FROM dbo.[CV_CfPersResPat] INNER JOIN @muutused AS ec
ON ( CV_CfPersResPat.CV_CfPersResPatId = ec.Itemid
AND [CV_CfPersResPat].[IsPublic] <> ec.[IsPublic] --muudame ainult neil, milel on IsPublic muutunud, hoiab veelgi kokku
)
END
XML-iga muutujate sisseandmist saab kasutada ka siis, kui on vaja protseduurile korraga palju parameetreid sisse annda
Blogged with the Flock Browser
neljapäev, 4. detsember 2008
XML väljaga info edasiandmine trigerisse
Selline juhtum, et triger on pandud andmebaasi muutusi logima ja nüüd situatsioon, et alustabelis kõiki andmeid ei ole aga hädasti oleks vaja üht-teist trigerile lisaks teada anda. Üks lahendus selline, et teeb baastabelisse juurde XML tüüpi välja näiteks APPLICATIONS tabelile APPOPTIONS
ja kui nüüd SP-ga tabelis midagi muuta
--kirjutame APPOPTIONS xml tüüp välja sisse lepingu numbri väärtuse
DECLARE @aop XML, @lep INT, @relcon NVARCHAR(2000)
--siin on üks string muutuja, mida edaspidi kasutame, et saaks sql:variable kasutada ja siia paneme meid huvitava info kirja
SET @relcon='<RELATED_CONTRACT>'+CAST(@contractId AS NVARCHAR(20))+'</RELATED_CONTRACT>'
--loeme enne kirjutamist APPOPTIONS välja väärtuse (siin oleks muidugi ilus CURSORIT kasutada)
SET @aop=( SELECT APPLICATIONS.[appoptions] FROM [dbo].[APPLICATIONS] WHERE APPLICATIONS.[ID]= @application_id)
IF @aop IS NULL --kui XML-i ei ole midagi kirjutatud
SET @aop=CAST(@relcon AS XML) --pöörame muutuja XML-iks
ELSE
BEGIN
--kontrollime, kas RELATED_CONTRACT on juba olemas
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT') --LEPINGU NUMBER ON int andmetüüp, mis meid huvitav
IF @lep IS NULL --KUI RELATED_CONTRACT on puudu, lisame lõppu vastava NODE
SET @aop.modify('insert text{sql:variable("@relcon")} as last into (/)[1]')
END
ja nüüd UPDATE-me tabeli välja
UPDATE [dbo].[APPLICATIONS]
SET [appoptions]=ISNULL(@aop,[appoptions]) WHERE ID=@application_id
ja trigeris saame asja teada nii
SELECT @aop=INSERTED.appoptions FROM INSERTED
DECLARE @lep INT
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT')
ja käes ta nüüd ongi ning salvestatud @lep muutujasse see mille ennist @contractId sisse andsime
ja kui nüüd SP-ga tabelis midagi muuta
--kirjutame APPOPTIONS xml tüüp välja sisse lepingu numbri väärtuse
DECLARE @aop XML, @lep INT, @relcon NVARCHAR(2000)
--siin on üks string muutuja, mida edaspidi kasutame, et saaks sql:variable kasutada ja siia paneme meid huvitava info kirja
SET @relcon='<RELATED_CONTRACT>'+CAST(@contractId AS NVARCHAR(20))+'</RELATED_CONTRACT>'
--loeme enne kirjutamist APPOPTIONS välja väärtuse (siin oleks muidugi ilus CURSORIT kasutada)
SET @aop=( SELECT APPLICATIONS.[appoptions] FROM [dbo].[APPLICATIONS] WHERE APPLICATIONS.[ID]= @application_id)
IF @aop IS NULL --kui XML-i ei ole midagi kirjutatud
SET @aop=CAST(@relcon AS XML) --pöörame muutuja XML-iks
ELSE
BEGIN
--kontrollime, kas RELATED_CONTRACT on juba olemas
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT') --LEPINGU NUMBER ON int andmetüüp, mis meid huvitav
IF @lep IS NULL --KUI RELATED_CONTRACT on puudu, lisame lõppu vastava NODE
SET @aop.modify('insert text{sql:variable("@relcon")} as last into (/)[1]')
END
ja nüüd UPDATE-me tabeli välja
UPDATE [dbo].[APPLICATIONS]
SET [appoptions]=ISNULL(@aop,[appoptions]) WHERE ID=@application_id
ja trigeris saame asja teada nii
SELECT @aop=INSERTED.appoptions FROM INSERTED
DECLARE @lep INT
SET @lep = @aop.value('/RELATED_CONTRACT[1]', 'INT')
ja käes ta nüüd ongi ning salvestatud @lep muutujasse see mille ennist @contractId sisse andsime
Blogged with the Flock Browser
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;
}
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
Tellimine:
Postitused (Atom)