pühapäev, 8. aprill 2018

Andmeseti hoidmine peale päringut


Mõnikord siis baasi päring kestab kaua ja midagi pole teha, päring käib sekundeid ja kui soov pärast kasutada DataGridi tulpade sorteerimist siis pole aega oodata, teist korda baasist päringut teha ei ole mõtekas.

Lahendab olukorra nii, et päringustsaadud andmeseti paneb kas Sessioni või ViewState-e ja järgmistel operatsioonidel, näiteks tulpade sorteerimine kasutab salvestatud andmeseti tulemusi.

private DataTable dt
        {
            set { this.ViewState["dt"] = value; }
            get { return (DataTable)this.ViewState["dt"]; }
        }

Andmete lugemine DataSeti SqlDataReader-ist

SqlDataReader red = komm.ExecuteReader();
this.dt = new DataTable();
this.dt.Load(red);
this.GridViewVolad.DataSource = this.dt;
this.GridViewVolad.DataBind();

SqlDataSource-st, peale parameetritele väärtuste andmist

DataSourceSelectArguments args = new DataSourceSelectArguments();
DataView view = (DataView)SqlDataSourceYyrnikud.Select(args);
this.dt = view.ToTable();
this.GridView1.DataSource = this.dt;
this.GridView1.DataBind();

GridView sorteerimiseks on vajalikud meeles pidada sorteerimisjärjestus ja sortimisavaldus

        private string SortExpression
        {
            set { this.ViewState["SortExpression"] = value; }
            get
            {
                if (this.ViewState["SortExpression"] == null)
                {
                    this.ViewState["SortExpression"] = "ACCOUNT_ID";  //vaikimisi järjestus
                }
                return this.ViewState["SortExpression"].ToString();
            }
        }

        private string SortDirection
        {
            set { this.ViewState["SortDirection"] = value; }
            get
            {
                if (this.ViewState["SortDirection"] == null)
                {
                    this.ViewState["SortDirection"] = "";
                }
                return this.ViewState["SortDirection"].ToString();
            }
        }


        protected string GetSortingDirection()
        {
            if (this.SortDirection == "")
            {
                this.SortDirection = "DESC";
            }
            else if (this.SortDirection == "ASC")
            {
                this.SortDirection = "DESC";
            }
            else
                this.SortDirection = "ASC";

            return this.SortDirection;
        }

GridView-le aga tuleb lisada Sorting meetod

        protected void GridViewVolad_Sorting(object sender, GridViewSortEventArgs e)
        {
            DataView view = this.dt.DefaultView;
            view.Sort = String.Format("{0} {1}", e.SortExpression, GetSortingDirection());
            this.SortExpression = e.SortExpression;
            this.GridViewVolad.DataSource = dt;
            this.GridViewVolad.DataBind();
        }

Kui nüüd GridView tulpasid sorteerida võetakse andmed this.dt DataTable-st ja baasist küsima ei minda.

pühapäev, 17. detsember 2017

SQL SERVER CLR serialization assembly

Kui juhtub, et SQL SERVER-i veebiteenuse poole pöörduv CLR hakkab pilduma viga

Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information.  System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) and LoadModule() have been disabled by the host

Siis soovitatakse luua selle DLL jaoks ka Serialization assembly. Selleks tuleb antud projekt
VisualStudio 2015 kõigepealt signeerida



Serializer dll tegemiseks kasutab sgen.exe käsurida

sgen /force /compiler:/keyfile:c:\Campus\KampusPdfInvoice\KampusPFDInvoice.snk KampusPdfInvoice.dll

tulemusena tekib KampusPdfInvoice.XmlSerializers.dll fail, mis
tuleb andmebaasi sisse lugeda peale originaal DLL sisselugemist, ehk kõigepealt

CREATE ASSEMBLY [KampusPdfInvoice] ..

ja siis

CREATE ASSEMBLY [KampusPdfInvoice.XmlSerializers] ...




neljapäev, 23. veebruar 2017

Ekraanikattega akna sulgemine ESC klahvivajutusega

Üllataval kombel ei leidnud selleks lihtsat lahendust, tuleb Javascriptiga jännata

Visuaalselt näeb välja nii, et klikid kugugi ja avaneb ekraaninkattega aken.



Kasutame ModalPopupExtender-it mille ees näitab UserControli sisu
<asp:Label runat="server" ID="HForModal" style="display: none" />
<asp:Panel runat="server" ID="P1" ScrollBars="Auto" Wrap="true"  Width="80%" CssClass="modalPopup">
    <asp:Button ID="ButtonModalClose" ClientIDMode="Static" runat="server" CausesValidation="False" CssClass="actionButton" Text="<%$ Resources:resource, ButtonClose %>" />&nbsp;
    <uc3:BoxNeibhours ID="BoxNeibhours1" runat="server" kuupaevNahtav="false"/>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender runat="server" ID="ModalPopupExtender1" X="120" BackgroundCssClass="moduleBackground" TargetControlID="HForModal" OkControlID="ButtonModalClose"
        CancelControlID="ButtonModalClose" PopupControlID="P1" BehaviorID="HForModal">
</ajaxToolkit:ModalPopupExtender> 

Kui nüüd see ekraanikattega aken avaneb, tahaks teda ESC klahviga sulgeda, aga ei kao ta ühtegi

CancelControlID ei mõju ESC klahvile, ehk JavaSript appi


 if (!Page.ClientScript.IsClientScriptIncludeRegistered("onKeyEsc"))
            {
                string url = ResolveClientUrl("~/Scripts/SulgeModal.js");
                Page.ClientScript.RegisterClientScriptInclude("onKeyEsc", url);
            }



JavaSript ise SulgeModal.js selline

function pageLoad(sender, args) {
        if (!args.get_isPartialLoad()) {
            //  adding handler to the document's keydown event
            $addHandler(document, "keydown", onKeyDown);
        }
    }
function onKeyDown(e) {
    if (e && e.keyCode == Sys.UI.Key.esc) {
        // if the key pressed is the escape key, then close the dialog
        //alert("close");
        var bname = document.getElementById("ButtonModalClose");  //ClientIDMode="Static"      
        if (bname !== null)
        {
            bname.click();
        }
        //PageMethods.SulgeAken(); //ei tööta
    }
}

Tähele tuleb panna seda kohta JavaScriptis

document.getElementById("ButtonModalClose")

vastav Button tuleb ClientIDMode="Static" defineerida

asp:Button ID="ButtonModalClose" ClientIDMode="Static"

kolmapäev, 21. detsember 2016

Märkeruudu ärakaotamine CheckBoxListi grupeerimisel

ASP.NET CheckBoxList komponendil mõnikord vaja nimekirja grupeerida erinevatel põhjustel


Kogu trikk põhineb CSS3 kasutamisel, kuna see võib tekitada segadusi projekti piirides, siis mõtekas kasutada "inline CSS", näiteks vajaliku userControli sees

<style>
    #CheckBoxListOtsinguMajad input:disabled {
        display: none;
    }
</style>
reegli mõju piirame CheckBoxListOtsinguMajad komponendi nende osadega, mille input:disabled, ehk märkeruuduga, sättida tuleb ka  ClientIDMode="Static" , et ASP.NET komponendi ID-d ei muudaks ja CSS3 reegel komponendi tuvastaks

asp:CheckBoxList ID="CheckBoxListOtsinguMajad" ClientIDMode="Static"
Kui nüüd CheckBoxListi ListItem seada Enabled=False, siis vastavale reale CSS reegel rakendub ja kuna display: none; siis märkeruut kaob ära


protected void CheckBoxListOtsinguMajad_PreRender(object sender, EventArgs e)
    {
        foreach (ListItem it in this.CheckBoxListOtsinguMajad.Items)
        {
            if (it.Value.Equals("0")) //grupeeringu tunnus
            {
                it.Enabled = false;
                it.Selected = false;
                it.Attributes.Add("style", "font-size:14px;height:16px;font-weight:bold;");
            }
        }
    }

 Grupeeringu rida aga võiks teistest tugevamalt eristada, täiendame stiili
 it.Attributes.Add("style", "font-size:14px;height:16px;font-weight:bold;");

kolmapäev, 19. oktoober 2016

Raporti andmeallika akna taastamine


Ctrl+Alt+D klahvikombinatsioon toob raporti Report Data andmeallikate akna tagasi, kui see peaks kadunud olema



teisipäev, 29. märts 2016

Eesti isikukoodi kontrollsumma arvutamise funktsioon Transact-SQL

-- =============================================
-- Author: Kuido Külm
-- Description: Arvutab Eesti isikukoodi kontrollsumma
-- =============================================
CREATE FUNCTION [dbo].[EST_PERSON_IDCODE_CHECKSUM_S](@isikukood NVARCHAR(11))
RETURNS NVARCHAR(1)
AS
BEGIN
DECLARE  @checksum INT = -1, @sum INT=0, @weight INT=1, @i INT=1,@k INT
WHILE @i <= 10
BEGIN
    SET @k=CAST(SUBSTRING(@isikukood,@i,1) AS INT)*@weight
SET @sum=@sum+@k
IF @weight = 9
 SET @weight=1
ELSE
 SET @weight=@weight+1
SET @i=@i+1
END
SET @checksum=@sum%11
IF @checksum != 10
  RETURN CAST(@checksum AS NVARCHAR(1))

SET @sum=0
SET @weight=3
SET @i=1
WHILE @i <= 10
BEGIN
    SET @k=CAST(SUBSTRING(@isikukood,@i,1) AS INT)*@weight
SET @sum=@sum+@k
IF @weight = 9
 SET @weight=1
ELSE
 SET @weight=@weight+1
SET @i=@i+1
END
SET @checksum=@sum%11
IF @checksum != 10
  RETURN CAST(@checksum AS NVARCHAR(1))

RETURN '0'
END

esmaspäev, 20. aprill 2015

ID-kaardi tarkvara alates versionist 3.10.2 ning IIS6 ja IIS7

Sellise asja peale juhtusin, kus peale ID-kaardi baastarakvara uuendamist alates versioonist 3.10.2 ei hakanud enam tööle ID-kaardiga autentimine, ehk

 HttpClientCertificate sert = Request.ClientCertificate;
 if (!sert.IsPresent)
 {

sai lati vastuseks, et sertifikaati pole, ehk PIN1 ei küsitud

Asja saab taas töökorda Windows'i serveri registris asukohas HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL võtme SendTrustedIssuerList väärtusega 0 (tüüp REG_DWORD) lisamisega