Kuvatud on postitused sildiga C#. Kuva kõik postitused
Kuvatud on postitused sildiga C#. Kuva kõik postitused

reede, 23. august 2013

Reavahetuse näitamine SQL SERVER andmeväljast asp:Label-is

Veebivormi kaudu tekstiboksi sisse reavahetusi sisestades võib tekkida soov pärast need reavahetused säilitada veebis taaskuvamisel

MS SQL SERVER säilitab andmeväljas reavahetusi kui CHAR(10) sümbolit (\n). Andmebaasi väljast saab reavahetust leida PATINDEX('%'+CHAR(10)+'%', ...) funktsiooni abil

SELECT [message_text]
      ,PATINDEX('%'+CHAR(10)+'%',message_text) AS esimene_reavahetus
  FROM [dbo].[MESSAGES]


Kui nüüd vaja reavahetust ka HTML koodina näidata või teha seda nii, et asendad andmebaasi CHAR(10) väärtuse HTML reavahe märgendiga <br />

näiteks kasutab asp:Label mille paneb veel asp:Panel sisse kerimisribade pärast

<asp:Panel runat="server" ID="PanelSisu" Height="250px" ScrollBars="Vertical">
              <asp:Label ID="tbMessageBody" runat="server" ReadOnly="True"></asp:Label>
</asp:Panel> 
Miskipärast aga iga kord SQL SERVER-i CHAR(10) ja C# \n omavahel hästi ei ühildu.

Reeglina peaks töötama järgmine konstruktsioon

string msd = table.Rows[0]["message_text"].ToString();
msd = msd.Replace(Environment.NewLine, "<br />");

aga IIS6 miskipärast ei tööta. Üks mitte eriti ilus lahendus on see, et proovib erinevad variandid läbi. Sobib siis kui regulaaravaldsed pole just tugevaim külg.


string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+"); //IIS6 peale ei tööta, IIS8 töötab
msd = regex.Replace(msd, "<br />");
msd = msd.Replace(Environment.NewLine, "<br />"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "<br />");  //IIS6 peale töötab

Viisakas on muidugi väljund ennem AntiXSS teegi funktsioonist GetSafeHtmlFragment läbi lasta.
GetSafeHtmlFragment aga sööb reavahe <br /> märgendi ära.

Üle nurga lahendus võib olla selline, et pöörab reavahe mingiks vähetõenäolise stringijadaks. Näiteks  "#####" ja peale GetSafeHtmlFragment funktsiooni asendab "#####" "<br />" märgendiga


string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+");
msd = regex.Replace(msd, "#####");
msd = msd.Replace(Environment.NewLine, "#####"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "#####");  //IIS6 peale töötab
this.tbMessageBody.Text = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(msd).Replace("#####", "<br />");






esmaspäev, 4. veebruar 2013

DropDownListi täitmine väärtuse järgi sorteerimisega ListItem massiivist

Kui vaja asp:DropDownList täita sorteerituna ListItem massiivi väärtuste järgi saab seda teha nii:


ListItem[] items // siin on võti-väärtus andmepaaridena andmed
                  
//sorteerime väärtuse järgi
System.Array.Sort(items, new myListItemComparer());

// item on nüüd sorteeritud

ListItemCollection col = new ListItemCollection();
//lisame kollektsiooni
for (int i = 0; i < items.Length; i++)
{
        col.Add(new ListItem(items[i].Value,items[i].Text));
}
                       
//paneme andmed külge
this.DropDownList1.DataSource = col;
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataBind();



//väärtuse järgi sorteerimiseks vajalik klass
public class myListItemComparer : IComparer
{
    int IComparer.Compare(object x, object y)
    {
        ListItem item_1 = x as ListItem;
        ListItem item_2 = y as ListItem;

        return item_1.Value.CompareTo(item_2.Value);
    }
}



Kindlasti saab ka kuidagi lihtsamini

esmaspäev, 7. veebruar 2011

Teksti jagamine stringimassiiviks

muutujas htext on reavahetustega tekst

esimene rida
teine rida
kolmas rida

Masiivi saab temast teha, hea lihtne kirjutada

string[] slehed = htext.Split(new string[] { "\r\n", "|" }, StringSplitOptions.RemoveEmptyEntries);

"\r\n", "|" on realõpu tunnused, ehk massiiviks tehakse ka string

esimene rida|teine rida|kolmas rida

esmaspäev, 11. oktoober 2010

Kuupäeva pp.kk.aaaa formaadipööramine

Ei meeldi .NET-ile pp.kk.aaaa kuupäeva formaat, igalt poolt võib hakata exceptioneid pilduma, usaldusväärsust lisab fikseeritud formaatidega tüübipööramine

string kuupaevatekst="23.10.2010";

DateTime arvekuupaev;
string[] formaat = new string[4];
formaat[0] = "yyyy-MM-dd"; //.NET standardformaat
formaat[1] = "MM.dd.yyyy";
formaat[2] = "dd.MM.yyyy"; //meie kullakallis pp.kk.aaaa
formaat[3] = "yyyyMMdd"; /ISO8601 see töötab alati nii .NET kui SQL SERVER
if (!System.DateTime.TryParseExact(kuupaevatekst, formaat, System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None, out arvekuupaev))
{
throw new InvalidOperationException("Error !! kuupäev " + kuupaevatekst+ " pole sobivas formaadis");
}

ja töötab palju paremini
arvekuupaev siin on nüüd kuupäevaks teisendatud string

neljapäev, 26. november 2009

String tüüpi muutuja polsterdamine SQL süstimise vastu

Kui ei pääse üle ega ümber sellest, et vaja dünaamiline SQL kirjutada ja sp_executesql kasutada ei saa siis string tüüpi muutujad (VARCHAR, NVARCHAR, CHAR jne) polsterda järgmiselt:

REPLACE(@otsiparam,'''','''''') ning enne ja pärast seda veel kolmed ülakomad

näiteks niimoodi:

DECLARE @os NVARCHAR(MAX)
SET @otsiparam=LTRIM(RTRIM(ISNULL(@otsiparam,'')) --juhuks, kui tühikud ees ja taga võivad probleemiks olla ning parameeter võib ka NULL olla.
SET @os='SELECT TOP 1 NIMED.NIMI FROM DBO.NIMED WITH(NOLOCK) WHERE NIMED.ID = '''+REPLACE(@otsiparam,'''','''''')+''''
EXECUTE (@os)

Kui vaja ainult ühte rida andmebaasist kätte saada siis mõtekas TOP 1
SELECT lausesse lisada. Aitab OR 1=1 rünnakute vastu.

See muutuja, mida EXECUTE lausega käima tõmbad võiks olla NVARCHAR(MAX) tüüpi, siis ei jõuta seda ülakomasid ''''''' täis ajada, ennem astuvad võrgu piirangud vahele.

C# käib polsterdamine nii
public string Polsterda(string inputSQL)
{
return inputSQL.Replace("'", "''");
}

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

teisipäev, 30. detsember 2008

SQL2005 XML TIMESTAMP byte[] konvertimine C#

Kui teed andmebaasi tabelist for XML TYPE päringu ja seal sees on ka timestamp väli siis tulemus on näiteks selline

<CvNodeElement CfPers_CVId="3" Title="Haridustee" CfLangCode="et-EE" CfClassId="1" CfClassSchemeId="49">
<Node ExpSkillsId="23" IsPublic="0" Timestamp="AAAAAAATo9I=" Pers_CV_CfPers_ExpSkillsId="16" Text="2005 TTÜ" />
<Node ExpSkillsId="21" IsPublic="0" Timestamp="AAAAAAATo9o=" Pers_CV_CfPers_ExpSkillsId="15" Text="1994 - 2005 Saku Gümnaasium" />
</CvNodeElement>

Timestamp on näiteks AAAAAAATo9I=

Kui tahad C# seda string tagasi TIMESTAMP-iks keerata siis käib see nii

byte[] bt = new byte[8];
bt=Convert.FromBase64String("AAAAAAATo9I=");

Blogged with the Flock Browser