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

neljapäev, 30. oktoober 2008

SqlDataSource DateTime parameetri lisamine ja eemaldamine

Lisamine käib nii:

this.SqlDataSourceTenants.SelectParameters.Add("submission_date", System.TypeCode.DateTime, this.tbSubmissionDate.Text.Trim());

ja eemaldamine nii:

this.SqlDataSourceReport.SelectParameters.Remove(SqlDataSourceReport.SelectParameters["start_date"]);

Lahendab ära need juhtumid, kus mõnikord võib 17.06.2008 puhul päev ja kuu vahetusse minna ja viga pilduma hakata

Blogged with the Flock Browser

teisipäev, 14. oktoober 2008

.NET ASSEMBLY eemaldamine Global Assembly Cache -st

Kui .NET2 Framefork Configuration-iga kuidagi maha ei saa tuleb käsitsi GACUTIL-iga teha

gacutil /uf "ReportFunctions"

ja kui see ka ei aita siis käsitsi GAC kataloogi kallale
ehk Command Prompt käima

ja sealt läheme GAC kataloogi

cd c:\windows\assembly

VisualStudio2008 asjad on GAC_MSIL alamkataloogis
cd gac_msil

ja sealt võtame vastava alamkataloogi maha, kui Assembly nimi on ReportFunctions siis

rmdir ReportFunctions /s/q

Seda käsitsi eemaldamist ei soovitata aga kui pole midagi muud teha, siis võib seda proovida

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

teisipäev, 2. september 2008

SSIS ei tööta OLE DB source kui tahad kasutada salvestatud protseduuris ajutisi tabeleid

Tuleb kasutada tabelmuutujaid, #temp ajutised tabeleid ei saa kasutada

Siin ka selgitus
http://blogs.conchango.com/jamiethomson/archive/2006/12/20/SSIS_3A00_-Using-stored-procedures-inside-an-OLE-DB-Source-component.aspx

Ja ka ülevaatlikum selgitus + mõned ümbernurga tegemised
http://www.sqlservercentral.com/articles/SSIS/65112/

Blogged with the Flock Browser

reede, 22. august 2008

ASP.NET automaatne veebilehelt tagasi suunamine

Kui on vaja teha selline asi, et oled ühe veebilehe peal ja pead vahepeal teise veebilehe peal käima, et sealt lehelt mingeid andmeid teada saada ja siis automaatselt samale lehele tagasi tulla koos loetud andmetega saab kasutada järgmist lahendust:

Ehk meil on vaja teha järgmine lähenemine
loginTenant.aspx => EstIdCard.aspx(sellelt lehelt saadud andmed saadame tagasi) => loginTenant.aspx


loginTenant.aspx veebilehel

<%--teeme strongly referenced type EstIdCard.aspx veebilehle, et sealt public properteid lugeda--%>
<%@ PreviousPageType VirtualPath="~/EstIdCard.aspx" %>

<asp:Label ID="Label2" runat="server"></asp:Label>

<%--selle nupu ButtonIDTest vajutus käivitab operatsiooni--%>
<asp:Button ID="ButtonIDTest" runat="server" CausesValidation="False"
Text="ButtonTest" PostBackUrl="~/EstIdCard.aspx" />


loginTenant.cs code-behind
protected void Page_Load(object sender, EventArgs e)
{
if ((Page.PreviousPage != null) && PreviousPage.IsCrossPagePostBack)
{
//saame eelmiselt lehelt andmed kätte
this.Label2.Text += PreviousPage.idcode;
}
else
{
this.Label2.Text = "ei õnnestunud";
}
}

EstIdCard.aspx veebileht, siia kirjutame nüüd jupi javascripti, et teha automaatne tagasisuunamine, kasutame asp:Button PostbackUrl-i et loginTenant.aspx lehel saaksime kindlad olla, et toimub tagasisuunamine.
Siin peab just olemas, see PostBackUrl, et
see osa töötaks: if ((Page.PreviousPage != null) && PreviousPage.IsCrossPagePostBack)
Lihtsalt Response.Redirect kasutada ei saa.

See javascriptis tehtud funktsioon ExecuteClick irriteerib nupu vajutust

<script language="javascript" type="text/javascript">
<!--
function ExecuteClick() {
document.getElementById("<%=ButtonTagasi.ClientID %>").click();
}
-->
</script>
<asp:Button ID="ButtonTagasi" runat="server" CausesValidation="False"
PostBackUrl="~/loginTenant.aspx" Text="Click to continue..." />

EstIdCard.cs

public property, selleks, et saaks andmeid edastada

public string idcode
{
set { this.ViewState["isikukood"] = value; }
get
{
if (this.ViewState["isikukood"] == null)
return "";
else
return this.ViewState["isikukood"].ToString();
}
}


protected void Page_Load(object sender, EventArgs e)
{
idcode = "IDnumbriväärtus"; // väärtustame public propery
//lisame nupule automaatseks tagasisuunamiseks javascripti jupi
this.ButtonTagasi.Attributes.Add("onFocus", "ExecuteClick()");

}

protected void Page_PreRender(object sender, EventArgs e)
{
//siin nüüd sätime nupule fookuse, ehk käivitame varem tehtud funktsiooni Javascriptis ExecuteClick, mis teeb cross-page postbacki tagasi algsele loginTenant.aspx lehele
this.ButtonTagasi.Focus();
}


Blogged with the Flock Browser

esmaspäev, 7. juuli 2008

XSD failid ei avane Design vaates

Tahad strongly typed dataset-i mudida Design vaates aga ei tule seda endist tuttvat pilti ette vaid teeb faili ainult XML vaates lahti ja kui üritad vaadata Design View-s siis ikka ei midagi, jääb endine pilt

VisualStudio 2008 maha ja peale installimine aita, võid saada veateate

Make sure the application for the file type (.xsd) is installed

Õigeks ajamine käib nii:

a. Paremklõpsa Visual Studio2008-s hiirega xsd faili peal ja võta menüüst Open With ja kui tuleb rakenduste nimekiri ette siis vali seal DatSet Editor

b. Kui DatSet Editor on nimekirjast puudu, siis käivita VisualStudio 2008 Command Prompt ja
sealt käivita devenv /resetskippkgs , see paneb need editorid nimekirja tagasi
Blogged with the Flock Browser