Kuvatud on postitused sildiga XML. Kuva kõik postitused
Kuvatud on postitused sildiga XML. Kuva kõik postitused

esmaspäev, 10. veebruar 2014

Nimeruumiga XML faili foreach tsükli läbiketramine ja XPath nimeruumi kasutamine

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

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>

reede, 21. oktoober 2011

Tühik ja reavahe XSL stylesheedil põhjustavad veateate xsl:attribute korral

XSL stylesheedi rakendamisel annab VisualStudio2010 vea

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

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

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

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

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

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

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

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

Blogged with the Flock Browser