Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Počet dní v mesiaci v T-SQL

Po dlhšom čase, mam aspoň chvíľku času takže asponň kratučký príspevok. V SQL Serveri som potrádal funkciu na zistenie počtu dní v mesiaci takže som si musel pomôcť napísaním vlastnej UDF.

CREATE FUNCTION dbo.fn_DaysInMonth

      (    

      @month tinyint,

      @year smallint

      )

RETURNS int

AS

BEGIN

  DECLARE @days int, @date datetime

  SET @date = CONVERT(DATETIME, STR(@month) + '/01/'+str(@year))

  SELECT @days = DAY(DATEADD (m, 1, DATEADD (d, 1 - DAY(@date), @date)) - 1)

RETURN @days

END

 

Posted: 19. listopadu 2004 19:09 by rasto | 2 Comments
Vedeno pod:
Zmena prac. pozície

Asi ste si všimli, že už dlhšiu dobu som ničím neprispel do BLOGu. Dôvodov je samozrejme viac, ale predovšetkým zato mohlo príliš málo času, ktorý som venoval rodine, práci a v poslednej dobe i príprave na nové povolanie.

Takže ďalší mesiac už pracujem na novej pozícií a dúfam, že konečne dopíšem  články pre svoj BLOG, ktoré sa niekde v rozpracovanej podobe povaľujú po disku v textových a CS súboroch resp. v mozgových závitoch a ešte sa ani nedostali to elektronickej podoby :)

Posted: 29. října 2004 16:14 by rasto | 5 Comments
Vedeno pod:
Pocket C# v. 1.10 released.

Pri potulkách webom som čírou nahodou narazil na článok o portovaní c# compileru pre Pocket PC PocketGCC 1.50 . Kde sa nenápadne skrýval odkaz Pocket C# v. 1.10 released.

Čo to teda je ?

Je to IDE pre Pocket PC s highligting editorom a compilerom .. čo viac si môže vyvojár, ktorý už ma nejaké to “malé šikovné zariadenie“. Musím priznať, že doteraz som bol k tým to zariadeniam dosť skeptický, resp. povedal som si že si nič také nekúpim, pretože sa na tom nedá programovať... Pocket C# týmto moju skepsu zlomil, avšak samozrejme až potom ako to otestujem :) Ak to niekto stihne ešte pre mnou, čo je dosť pravdepodobné pretože som v pomerne veľkom časovom sklze, budem rád ak sa niekto so svojimi skúsenoťami podelí ....

 

Nastanie národneho prostredia pre celú aplikáciu na 1 riadok kódu

Máloktorý vyvojár webových aplikácii vie na 100% na akom serveri pobežia jeho aplikácie a väčšinou ani nemôže meniť nastavenie servera. Najčastejší problém je s nastavením národného prostredia, ktoré je u zahraničných hostingov prednastavené na lokálne národné prostredie.

Dlho som sa aj sám potýkal s týmto problémom, pretože pri väčšom projekte predsa len človek občas zabudne použiť CultureInfo pri formátovaní datumu, meny ....

Takže nebudem to ďalej obkecávať ( je to predsa jasne každému :) ), ale prejdem rovno k veci:

Do global.asax.cs stačí pridať do metody Application_BeginRequest jeden riadok kódu, ktorý pri každom požiadavku nastaví dané národné prostredie v aktuálnom vlákne (threadu) v ktorom beží daná aplikácia:

protected void Application_BeginRequest(Object sender, EventArgs e)

{          
      //pre Slovensko je CultureName “sk-SK

      Thread.CurrentThread.CurrentCulture = new CultureInfo("cs-CZ");

}

Posted: 7. září 2004 10:04 by rasto | 2 Comments
Vedeno pod:
Univerzálna stránkovacia uložená procedura - Oprava

Keďže predchádzajúca verzia stránkovacej procedúra obsahovala jeden neduh (chybičku), keď na poslednej stranke zobrazila rovnaký počet riadkov, musel som to opraviť. Mal som taký malý problém ako vytiahnuť hodnoru počtu záznamov zo skriptu postenného cez EXECUTE, čo som nakoniec vyriešil cez TEMP TABLE....ak niekoho napadne lepší spôsob, budem len rád ak ma o tom bude informovať...

Opravený kód procedúry:

CREATE PROCEDURE dbo.Strankovanie

(

      @menoTabulky varchar(50),

      @parametre varchar(500),

      @pocetZaznamov int,

      @cisloStranky int,

      @trieditPodla varchar(50),--toto je nutny parameter pre fungovanie strankovnia

      @podmienky varchar(500)

)

AS

      BEGIN

            DECLARE @SQL VARCHAR(2000), @podvyberStranky bigint

            DECLARE     @cmd VARCHAR(1000), @ExecError INT

            --vytvorenie temp tabulky pre ulozenie poctu zaznamov na stranku

            CREATE TABLE #TempPocet (pocet INT)

            SELECT @podvyberStranky = (@cisloStranky * @pocetZaznamov)

            -- Spocitanie riadkov vo vysledku

            SET @SQL = 'Declare @pocet int,@lPg int,@maxRows int Select @pocet=COUNT(*) FROM '+@menoTabulky+''

                        IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            SET @SQL = @SQL + ' Select @pocet as pocet '

            SET @SQL = @SQL + ' IF ( @pocet%'+CAST(@pocetZaznamov as VARCHAR(20))+' = 0 )

 SELECT @lPg = (@pocet/'+CAST(@pocetZaznamov as VARCHAR(20))+') ELSE

 SELECT @lPg = (@pocet/'+CAST(@pocetZaznamov as VARCHAR(20))+') +1

IF (@lPg ='+CAST(@cisloStranky as VARCHAR(20))+') Select @maxRows = (@pocet%'+CAST(@pocetZaznamov as VARCHAR(20))+')

ELSE Select @maxRows ='+CAST(@pocetZaznamov as VARCHAR(20))+' INSERT INTO #TempPocet (pocet) VALUES (@maxRows)'

            --print @sql

            execute( @sql)

            IF (@parametre IS NULL OR @parametre ='')

                  SET @parametre = '*'

                  SELECT @pocetZaznamov = pocet FROM #TempPocet

            --Query pre strankovanie

            SET @SQL = ' Select '+@parametre+' FROM

                  ( SELECT TOP '+CAST(@pocetZaznamov AS VARCHAR(20))+' '+@parametre+' FROM

                        ( SELECT TOP '+CAST(@podvyberStranky AS VARCHAR(50))+' '+@parametre+' FROM '+@menoTabulky+' '

            IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            SET @SQL = @SQL +'Order BY '+@trieditPodla+' ASC)

                  t2 ORDER BY '+@trieditPodla+' DESC )

            t ORDER BY '+@trieditPodla+' '

PRINT (@SQL)

execute( @sql)

      END

      RETURN

Posted: 30. července 2004 14:46 by rasto | 5 Comments
Vedeno pod:
Zistenie dátumu a času, kompilácie assembly

Občas je dobré vedieť, akú verziu aplikácie máte nasadenú u zákazníka. Samozrejme, že programátorovi stačí číslo verzie, ale to zase nič nepovie zákazníkovi. Takže tu je malá finta jako zistiť datum a čas z AssemblyName.Version. Princíp je v tom že Version.Build udáva počet dní od datumu 1.1.2000 a Revision zase obsahuje počet sekúnd /2 , takže takto vyzerá výsledný kód:

 

System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();

this.lblVersion.Text = " Datum: ";                        

// Zistenie datumu a casu kompilacie

AssemblyName an = ass.GetName();                    

DateTime d = new DateTime(2000, 1, 1, 3, 0, 0);

d += TimeSpan.FromDays(an.Version.Build) + TimeSpan.FromSeconds(an.Version.Revision * 2);

this.lblVersion.Text += d.ToString("U");

 

ešte musím dodať, že na niektorých servroch som musel nastaviť ako počiatočný čas 3 hodiny, čo asi súvisí s nastavením národného prostredia. Ak sa mýlim, budem rád keď ma niekto opraví.

Posted: 28. června 2004 11:10 by rasto | 2 Comments
Vedeno pod:
Ako dropnúť súbory z prieskumníka Windows do ListView

V celku jednoduchá záležitosť pokiaľ viete ako na to resp. ak nájdete príslušný popis, o čo som sa bezúspešne snažil pomerne dlhý čas v MSDN. Nakoniec som to tam predsa našiel, ale to už som vedel čo hladať. Hovorím o formáte DataFormats.FileDrop, ktorý je nutné použiť ako vstupný parameter pre metódu e.Data.GetDataPresent("FileDrop").

 

Takže celý postup vyzerá takto:

 

Do obslužného handleru dragEnter Winform controlu listView musíme dopísať spracovať túto udalosť ( dragEnter = do aktívnej časti controlu sa dostane cursor myši, ktorý za sebou ťahá /drag/ prenášané objekty )
 

private void listView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)

{

//ak je prenasany objekt typu FileDrop

            if(e.Data.GetDataPresent("FileDrop") )

                  e.Effect = DragDropEffects.Copy; //nastav copy efekt

}

 

ďalším krokom je, obslúžiť event pri pustení /drop/ prenášaného objektu/ov:

 

private void listView2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)

{

 

if (  e.Data.GetDataPresent("FileDrop")  )

      {

            //vyextrahovanie dat z ojektu Data

            object dropedFiles = e.Data.GetData("FileDrop", true);

            string[] files = (string[])dropedFiles;

            foreach(string s in files)

            {

                  //spracovanie súborov

                  //. . . .. .

 

                  //pridanie do listView

                  ListViewItem lvi = new ListViewItem(Path.GetFileName(s));

                  lvi.Tag = s; //uloženie orig. cesty pre dalsie pouzitie

                  this.listView2.Items.Add(lvi)           

 

            }

      }

}

Stránkovanie v ASP.NET efektívne a výkonne

Takmer v každej web aplikácii sa v dnešnej době používaju databázy a je potrebné zobrazovať nejaké zoznamy nejakých dát. Či už je to zoznam nejakých produktov, kontantov, či čohokoľvek iného tak v ASP.NET veľmi čsto siahnete po servrovom ovládacom prvku DataGrid, pretože v relatívne krátkom čase dosiahnete požadovaný výsledok s pomerne širokou funkcionalitou. Samozrejme, že takmer každé rýchle riešenie niečo stojí a v tomto prípade je to predovšetkým výkon a pamäť, pretože málo kedy máte nad sebou niekoho kto pozerá jako ste to naprogramovali takže vo väčšine prípadov sa pripojí DataAdapter ten sa nastaví ako datový zdroj ( DataSource ) ten sa naplní datami ( Fill() ) a aby sme to už nemuseli znovu robiť po PostBacku tak šup s tým do Session … doplníme Sortovanie nad DataView, stránkovanie a je to hotove za chviľku. Povieme si je to paráda a funguje to … ale zrazu našu aplikáciu naplníme datami a čo to ?? je to pomalé zaberá to enormné množstvo pamäte a zrazu je problém … ako si s týmto problémom poradiť ?? To je práve predmetom tohoto článku.

 

Takže v prvom rade je třeba povedať, že DataAdapter je príliš komplexný objekt, ktorý vo webových aplikáciach skoro nevyužijete. Mne osobne sa nepodarilo napísať aplikáciu kde by som využil a to z jednoduchých dôvodov:

-         web aplikácia by mala byť navrhnutá tak aby jednotlivé stránky boli čo najjednochšie, aby sa rýchlo natiahli ..takže čo stránka to operácia a DataAdapter zbytočne obsahuje všetky operácie nad DB, čiže Select, Update, Delete, Insert

-          z viacerých porovnaní som zistil že je práve pre načítanie udajov pomalší ako DataReader, čo sa učite dočítate aj v odbornej literatúre

 

Ďalší problém je s pamäťou .. ukladat celú sadu dat do objektu session ktorú má každý užívateľ je nehoráze plytvanie pamäťou, si zoberte že ak bude prihlásených 100 užívateľov a budú listovať v zozname 20 000 kontaktov tak mate v pamäti 100 x po 20 000 záznamov…takže čo s tým ??

 

Proste nedržať tieto údaje v session ale proste vytiahnuť z databázy iba údaje, ktoré chce užívateľ vidieť a to buďto ho prinútitť aby písal podmienky výberu, alebo využiť ďalšiu vlastnosť DataGridu a to stránkovanie a při každom Requste ( požiadavku na web server ) získať iba tie data z SQL Serveru ktoré užívateľ uvidí.

 

Takže snažil som sa napísať obecnú uloženú procedúru vid (Univerzálna stránkovacia uložená procedura) z ktorej jako prvý výsledok je celkový počet riadkov ktorým nastavíme Property ( vlastnosť ) VirtualItemCount ktorá zabezpečí že sa nám v datagride zobrazí správny počet stránok v závislosti na tom po koľkých riadkoch chceme stránkovať, čo nastavíme v property PageSize . Ďalší výsledok na ktorý sa dostaneme pomoucou metody DataReaderu NextResult() sú už požadované  data, ktoré potrebujeme zobraziť v DataGride. Keďže DataReader obsahuje interface (rozhranie) Ienumerable, ktorý požaduje Datagrid.DataSource možeme mu ho priamo priradiť bez toho aby sme data presýpavali do DataSetu resp. Do DataTable, čím dosiahneme ďalsši zrýchlenie.

 

Takže si myslím že dosť bolo objasňovania (alebo jako sa hovorí dosť bolo kecov), na ktoré ja aj tak moc nie som takže tu máme najprv zdrojový kód uloženej procedury a potom malá ukážka jako ju použiť spolu s DataGridom.

 

Celý zdrojový kód so vzorovým projektom najdete tu: WebPaging1

 

Základná helper metóda pre naplnenie DataGridu, pričom príklad je ako inak nad databázou Northwind:

 

private void BindGrid(ref DataGrid dg, int stranka,string sortovanie,object podmienky)

{

      //otvorime spojenie s DB

      this.sqlConnection1.Open();

 

      #region Nastavenie parametrov

      //nastavime tabulku/view z ktorej zobrazujeme data

      this.sqlCommand1.Parameters["@menoTabulky"].Value = "Orders";

      //nastavime ktore stplce z tabulku/view chceme zobrazit

      this.sqlCommand1.Parameters["@parametre"].Value =    " CustomerID,ShipName ";

      //zistime pocet riadkov gride ktore je nastavene v design mode

      this.sqlCommand1.Parameters["@pocetZaznamov"].Value = this.DataGrid1.PageSize;

      //nastavime stranku

      this.sqlCommand1.Parameters["@cisloStranky"].Value = stranka;

      //nastavime sortovanie

      this.sqlCommand1.Parameters["@trieditPodla"].Value = sortovanie;

      //podmienky vyberu za Where v sql dotaze

      this.sqlCommand1.Parameters["@podmienky"].Value = podmienky.ToString() ;               

 

 

      SqlDataReader reader = sqlCommand1.ExecuteReader(CommandBehavior.CloseConnection);

 

      #endregion

      reader.Read();

      //zistime celkovy pocet riadkov

      dg.VirtualItemCount = Convert.ToInt32( reader[0] );

      //precitame data

      reader.NextResult();

      //vratime reader

      dg.DataSource = reader;

     

      // nastavenie aktualnej stranky

      dg.CurrentPageIndex = stranka -1;

 

      // zobrazenie dat v datagride

      dg.DataBind();

 

      // uzavrenie readra

      reader.Close();

 

}

 

 

Posted: 25. června 2004 15:51 by rasto | 2 Comments
Vedeno pod:
Univerzálna stránkovacia uložená procedura

Keďže MS SQL server 2000  nemá priamu podporu pre stránkovanie ako napríklad MySQL ( Oracle je na tom lepšie pretože ma aspoň rownum a niečo podobné by mal mať pripravovaný Yukon ). Táto uložená procedúra vracia dva výsledky:

a)      počet záznamov

b)      recorset s daným počtom riadkov

 

použitie pre výpis v ASP.NET datagride bude v ďaľšom článku ( Stránkovanie v ASP.NET efektívne a výkonne ).

 

Použitie v QA na databázi NorthWind:

 

exec strankovanie 'Orders','OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry' , 10, 1, 'ShipName', ''

 

definícia SP:

 

 

CREATE PROCEDURE dbo.Strankovanie

(

      @menoTabulky varchar(50),

      @parametre varchar(500),

      @pocetZaznamov int,

      @cisloStranky int,

      @trieditPodla varchar(50),--toto je nutny parameter pre fungovanie strankovnia

      @podmienky varchar(500)

)

AS

      BEGIN

            DECLARE @SQL VARCHAR(2000), @podvyberStranky int

            SET @podvyberStranky    = @cisloStranky * @pocetZaznamov

            -- Spocitanie riadkov vo vysledku

            SET @SQL = 'Select COUNT(*) FROM '+@menoTabulky+''

                        IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            execute( @sql)

 

      --Ak nie su zadane ziadne parametre, pouzi vsetky

            --je to vsak urcitu spomalenie pretoze zistenie nazvom stplcom

            --ma tiez urcitu reziu a zbytocne sa tiez prenasaju data, ktore

            --ani nepouzijeme

            IF (@parametre IS NULL OR @parametre ='')

                  SET @parametre = '*'

                 

            --Query pre strankovanie

            SET @SQL = 'Select '+@parametre+' FROM

                  ( SELECT TOP '+CAST(@pocetZaznamov AS VARCHAR(4))+' '+@parametre+' FROM

                        ( SELECT TOP '+CAST(@podvyberStranky AS VARCHAR(4))+' '+@parametre+' FROM '+@menoTabulky+' '

            IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            SET @SQL = @SQL +'Order BY '+@trieditPodla+' ASC)

                  t2 ORDER BY '+@trieditPodla+' DESC )

            t ORDER BY '+@trieditPodla+' '

PRINT (@SQL)

execute( @sql)

           

      END

      RETURN

 

Posted: 25. června 2004 15:50 by rasto | 6 Comments
Vedeno pod:
Raz treba začať

Na úvod sa sluší napísať pár slov, ale skutočne iba pár slov. Nechcem nikoho zaťažovať čítaním siahodlhých výlevov a vysvetľovaní, prečo som sa rozhodol založiť vlatný weblog. Proste som presvedčený, že to má zmysel i keď násjsť si pár chviľ a niečím užitnýčným prispieť asi bude čoraz obtiažnejšie, nakoľko rodina je na prvom mieste a práca, zábava, koníčky nasledujú podľa aktuálnej potreby a okolností. Dal som si predovšetkým za úlohu písať predovšetkým časti kódu pričom iba pár slovami by som chcel zdôrazniť na prípady ktoré i mne samotnému robili nejaké problemý.Takže stručne, jasne a čo možno často použivané zdrojáky a hádam prispejem aj nejakými ASP.NET Controlmi z mojej malej dielne.

Na záver si len dovolím poznamenať, pre tých ktorý z rôznych dôvodov ešte nezačali niečo tvoriť a majú na to .... povedzte si ako ja: „Raz treba začať !!“ a pusťte sa do toho, pretože to určite má zmysel a myslím, že každe úsilie raz bude ocenené a to je to čo napĺňa každého človeka i keď si to málokedy prizná.

Posted: 25. června 2004 15:44 by rasto | 1 Comments
Vedeno pod:
Vyvojar.cz na prodej!