<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>andrzej.net.pl</title>
	
	<link>http://andrzej.net.pl</link>
	<description>Blog o programowaniu C#, ASP.NET</description>
	<lastBuildDate>Mon, 01 Feb 2010 23:21:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Andrzejnetpl" /><feedburner:info uri="andrzejnetpl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>BugNET i TRAC – porównanie. Część I</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/gOFqZImRTDs/</link>
		<comments>http://andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 23:14:36 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[ogólne]]></category>
		<category><![CDATA[programy]]></category>
		<category><![CDATA[przydatne narzędzia]]></category>
		<category><![CDATA[BugNET]]></category>
		<category><![CDATA[bugtracker]]></category>
		<category><![CDATA[system zgłaszania błędów]]></category>
		<category><![CDATA[TRAC]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=737</guid>
		<description><![CDATA[Nie tak dawno wspominałem o startupie devpytania.pl. Niewiele cykli procesora upłynęło od tego czasu a ja muszę przyznać, że devpytania przypadły mi do gustu.
Widać tam grupę ludzi angażujących się w pomoc innym, ciekawe pytania i rozważania. Co ważne &#8211; nie oderwane od naszego lokalnego podwórka. W informatyce wiele problemów jest &#8220;poza podziałami&#8221;, są jednak i [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/ankhsvn-i-automatyczne-needs-lock/' rel='bookmark' title='Permanent Link: Ankhsvn i automatyczne needs-lock'>Ankhsvn i automatyczne needs-lock</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Nie tak dawno <a href="http://andrzej.net.pl/index.php/2010/01/polski-klon-stackoverflow-com-devpytania-pl/">wspominałem</a> o startupie devpytania.pl. Niewiele cykli procesora upłynęło od tego czasu a ja muszę przyznać, że devpytania przypadły mi do gustu.</p>
<p style="text-align: justify;">Widać tam grupę ludzi angażujących się w pomoc innym, ciekawe pytania i rozważania. Co ważne &#8211; nie oderwane od naszego lokalnego podwórka. W informatyce wiele problemów jest &#8220;poza podziałami&#8221;, są jednak i takie dość mocno związane z konkretnym regionem. Devpytania stają się jednym z podstawowych serwisów, które odwiedzam. Pozwala mi to na zapoznanie się z problemami innych, i to problemami niekoniecznie dotyczącymi .NET czy nawet niekoniecznie programowania sensu stricte.</p>
<p style="text-align: justify;">Do rzeczy jednak. Dlaczego wspominam o devpytania? Dlatego, że z <a href="http://devpytania.pl/questions/534/darmowy-system-typu-bugtracker" onclick="pageTracker._trackPageview('/outgoing/devpytania.pl/questions/534/darmowy-system-typu-bugtracker?referer=');">pewnego tematu dotyczącego darmowych systemów typu bugtracker</a> wziął się pośrednio pomysł na opowiastkę w odcinkach, której pierwszą część właśnie czytasz.</p>
<p style="text-align: justify;">W odpowiedziach na wspomniane pytanie pojawiło się wiele odpowiedzi &#8211; wiadomo &#8211; każdy chwalił swoje. Osobiście od dość dawna używam <a href="http://trac.edgewall.org/" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/?referer=');">systemu TRAC</a>. Zaraził mnie nim jeszcze kolega ze studiów i używałem go już parę lat temu chyba na jedynej platformie w Polsce udostępniającej hosting SVN + TRAC &#8211; <a href="http://svn.pl/" onclick="pageTracker._trackPageview('/outgoing/svn.pl/?referer=');">svn.pl</a>. Zainteresował mnie natomiast inny  &#8211; <a href="http://www.bugnetproject.com" onclick="pageTracker._trackPageview('/outgoing/www.bugnetproject.com?referer=');">bugNET</a>. Spróbować nie zaszkodzi. Zainstalowałem więc bugNET obok TRAC&#8230;</p>
<p><span id="more-737"></span></p>
<p style="text-align: justify;">Pierwsze odczucie po instalacji &#8211; jest nieźle. Wszystko kolorowe, ikonkowe, błyszczące, świecące, grupujące się i radosne. W kolorze zielonym &#8211; ponoć kolor nadziei. Pozytywnie nastraja, jak na system który &#8220;śledzi&#8221; błędy. Marketingowo świetne ;)</p>
<p style="text-align: justify;">Konfiguracja dość łatwa, wszystko odbywa się z poziomu przeglądaki. Nadszedł pierwszy zachwyt.<br />
O zachwytach i samym korzystaniu jednak później. <strong>W tym odcinku skupię się na instalacji</strong>. Nie jest to sprawa, którą można zbagatelizować porównując TRAC i bugNET. Jest to diametralnie różne podejście i &#8211; moim zdaniem &#8211; nie bez znaczenia.</p>
<p style="text-align: justify;">
<h2>Ogólne założenia</h2>
<p>Instalacja na systemie Windows, automatyczne uruchamianie z systemem i umożliwienie dostępu z zewnątrz.</p>
<p>Wymagana autoryzacja użytkowników.</p>
<p>Zakładamy, że zainstalowany jest SVN.</p>
<p>Punktacja w skali od 1 do 10, im więcej punktów przyznane tym lepsza ocena.</p>
<p>TRAC <a href="http://trac.edgewall.org/wiki/TracDownload" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/wiki/TracDownload?referer=');">w wersji 0.11.6</a></p>
<p>BugNET <a href="http://bugnetproject.com/Blogs/tabid/53/EntryId/54/BugNET-0-8-167-0-RC2-Released.aspx" onclick="pageTracker._trackPageview('/outgoing/bugnetproject.com/Blogs/tabid/53/EntryId/54/BugNET-0-8-167-0-RC2-Released.aspx?referer=');">w wersji 0.8.167.0 (RC2)</a></p>
<p>Może trochę niesprawiedliwie, że TRAC w wersji produkcyjnej a BugNET w wersji RC2, jednak kto powiedział, że świat  jest sprawiedliwy ;) ? Poważniej &#8211; BugNET &#8220;więcej daje&#8221; w wersji 0.8 a ewentualne bolączki wersji RC pominę w dalszych porównaniach.</p>
<h2>TRAC</h2>
<div id="attachment_750" class="wp-caption alignnone" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2010/02/trac.png" rel="lightbox[737]"><img src="http://andrzej.net.pl/wp-content/uploads/2010/02/trac-300x185.png" alt="trac" title="trac" width="300" height="185" class="size-medium wp-image-750" /></a><p class="wp-caption-text">trac</p></div>
<p>Gdybyśmy instalowali TRAC na  Windows rok temu &#8211; to byłby dramat. Dokumentacja była dość uboga i co chwilę napotykane problemy sprawiały, że wszystkiego się odechciewało.</p>
<p>Obecnie nie jest to instalacja typu dalej-dalej-instalator-gadżeta ale każdy zainteresowany powinien sobie poradzić.</p>
<p><a href="http://how-to-solutions.com/how-to-install-trac-on-windows.html" onclick="pageTracker._trackPageview('/outgoing/how-to-solutions.com/how-to-install-trac-on-windows.html?referer=');">Kroki niezbędne do instalacji:</a></p>
<ol>
<li><a href="http://www.python.org/download/" onclick="pageTracker._trackPageview('/outgoing/www.python.org/download/?referer=');">Instalacja Pythona</a> (najlepiej wersja 2.5) &#8211; bezproblemowa. Plik MSI. 10/10</li>
<li><a href="http://trac.edgewall.org/wiki/TracDownload" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/wiki/TracDownload?referer=');">Instalacja TRAC</a> &#8211; bezproblemowa. Instalator. 10/10</li>
<li><a href="http://genshi.edgewall.org/wiki/Download" onclick="pageTracker._trackPageview('/outgoing/genshi.edgewall.org/wiki/Download?referer=');">Instalacja Genshi</a> &#8211; biblioteki do przetwarzania HTML / XML &#8211; bezproblemowa. Instalator. 10/10</li>
<li><a href="http://peak.telecommunity.com/dist/ez_setup.py" onclick="pageTracker._trackPageview('/outgoing/peak.telecommunity.com/dist/ez_setup.py?referer=');">Ściągnięcie ez-setup</a> i umieszczenie w katalogu skrytpów. 10/10</li>
<li>Utworzenie projektu &#8211; z linii komend, używając skryptów. Uciążliwe ale nie dramatyczne. W sumie ogranicza się do &#8220;dalej-dalej&#8221; tyle że w lini poleceń. 7/10</li>
<li>Instalacja <a href="http://trac-hacks.org/wiki/AccountManagerPlugin" onclick="pageTracker._trackPageview('/outgoing/trac-hacks.org/wiki/AccountManagerPlugin?referer=');">AccountManagerPlugin</a> &#8211; do autoryzacji użytkowników. Z linii poleceń &#8211; ściągnięcie ze zdalnego repozytorium. Wszystko dzieje się samo. Do przeżycia. 7/10</li>
<li>Ustawienie sekcji w pliku konfiguracyjnym projektu i nadanie uprawnień anonimowemu użytkownikowi. Nie ma dramatu ale znowu konsola. 7/10</li>
<li>Uruchomienie TRAC z linii poleceń &#8211; proste, ale to chwilowe rozwiązanie. 7/10</li>
<li>Konfiguracja wtyczki uprawnień &#8211; już z poziomu przeglądarki. Wymaga dość intuicyjnego podejścia. 7/10</li>
<li>Ściągnięcie i zainstalowanie Windows Server 2003 Resource Toolkit &#8211; niezbędne do instalacji TRAC jako usługi systemowej. 9/10</li>
<li><a href="http://trac.edgewall.org/wiki/TracOnWindowsStandalone#RunningTracdasservice" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/wiki/TracOnWindowsStandalone_RunningTracdasservice?referer=');">Ustawienie TRAC jako usługi systemowej</a> &#8211; trochę grzebania w rejestrze. Mimo, że dobrze udokumentowane to jednak uciążliwe. 3/10</li>
<li>Głęboki oddech i może zadziała ;) Za ilość kroków instalacj: 5/10</li>
</ol>
<h2>BugNET</h2>
<div id="attachment_751" class="wp-caption alignnone" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2010/02/bugnet.png" rel="lightbox[737]"><img src="http://andrzej.net.pl/wp-content/uploads/2010/02/bugnet-300x159.png" alt="bugNET" title="bugNET" width="300" height="159" class="size-medium wp-image-751" /></a><p class="wp-caption-text">bugNET</p></div>
<ol>
<li><a href="http://www.windowsnetworking.com/articles_tutorials/Web-Sites-Windows-2003.html" onclick="pageTracker._trackPageview('/outgoing/www.windowsnetworking.com/articles_tutorials/Web-Sites-Windows-2003.html?referer=');">Założenie site&#8217;u na IIS</a>. Dla niezaznajomionych może być kłopotliwe ale mocno udokumentowane &#8211; 9/10</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms186312.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms186312.aspx?referer=');">Założenie bazy danych MS SQL</a>. Raczej banalne. 9/10</li>
<li>Przerzucenie plików instalacyjnych do katalogu stworzonego website&#8217;u 10/10</li>
<li><a href="http://www.bugnetproject.com/Documentation/tabid/57/topic/Installation/Default.aspx" onclick="pageTracker._trackPageview('/outgoing/www.bugnetproject.com/Documentation/tabid/57/topic/Installation/Default.aspx?referer=');">Ustawienie ConnectionStringa do połączenia z bazą</a> &#8211; 9/10</li>
<li>Uruchomienie skryptu instalacyjnego z przeglądarki. Informacja o statusie i ewentualnych błędach na ekranie. 10/10</li>
<li>Gotowe. Za ilość kroków instalacji: 10/10</li>
</ol>
<h2>Podsumowanie</h2>
<p>Może najpierw numerkologia. Zaszalejemy ze średnią harmoniczną ;) ? Może nie &#8211; niech zostanie nic nie mówiąca średnia arytmetyczna. Jednak jak na poważne porównanie publikowane na poczytnym blogu przystało &#8211; cyferki muszą być ;) Poważniej:</p>
<p><strong>TRAC</strong>. Ilość kroków instalacji &#8211; minimum 11. Średnia punktów 7,25.</p>
<p><strong>BugNET</strong>. Ilość kroków instalacji &#8211; 5. Średnia punktów 9,50.</p>
<p>Dodatkowo TRAC wymaga &#8220;standalone servera&#8221; pracującego tylko na jego potrzeby. Dla bugNET można wykorzystać wbudowany IIS, jednak nie ma go np. WinXP Home.<br />
TRAC zainstalujemy na każdym komputerze. BugNET tylko na Windows i tylko na takim, na którym można zainstalować IIS.</p>
<p><strong>Wniosek:</strong></p>
<p>Zdecydowanie łatwiej zainstalować jest bugNET niż TRAC, szczególnie dla zaznajomionych z zagadnieniami Windows i ASP.NET.<br />
TRAC wymaga większej uwagi i może spowodować więcej nieprzewidzianych komplikacji, jednak da się go zainstalować wszędzie.</p>
<h3><strong><span style="color: #ff6600;">Odcinek wygrywa: BugNET</span></strong><strong><span style="text-decoration: underline;"></span></strong></h3>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/ankhsvn-i-automatyczne-needs-lock/' rel='bookmark' title='Permanent Link: Ankhsvn i automatyczne needs-lock'>Ankhsvn i automatyczne needs-lock</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/gOFqZImRTDs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/</feedburner:origLink></item>
		<item>
		<title>Ankhsvn i automatyczne needs-lock</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/zSAccJiJ1RU/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/ankhsvn-i-automatyczne-needs-lock/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 00:34:34 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[ogólne]]></category>
		<category><![CDATA[przydatne narzędzia]]></category>
		<category><![CDATA[ankhsvn]]></category>
		<category><![CDATA[kontrola wersji]]></category>
		<category><![CDATA[needs-lock]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[tortoise svn]]></category>
		<category><![CDATA[visual svn server]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=725</guid>
		<description><![CDATA[
Nie wyobrażam sobie pracy bez systemu kontroli wersji. I niewielu znam ludzi zajmujących się programowaniem, którzy by SVN nie doceniali.
Jako serwera SVN używam VisualSVN &#8211; napisany pod Windowsa, banalny w obsłudze, posiada GUI.
Podstawowy kient SVN &#8211; TortoiseSVN &#8211; do wszelkich commitów z dysku, dla świetnego narzędzia DIFF.


Do Visuala natomiast niesamowita wtyczka &#8211; ankSVN &#8211; bohater [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Nie wyobrażam sobie pracy bez systemu kontroli wersji. I niewielu znam ludzi zajmujących się programowaniem, którzy by SVN nie doceniali.<br />
Jako serwera SVN używam <a href="http://www.visualsvn.com/server/" onclick="pageTracker._trackPageview('/outgoing/www.visualsvn.com/server/?referer=');">VisualSVN</a> &#8211; napisany pod Windowsa, banalny w obsłudze, posiada GUI.<br />
Podstawowy kient SVN &#8211; <a href="http://tortoisesvn.tigris.org/" onclick="pageTracker._trackPageview('/outgoing/tortoisesvn.tigris.org/?referer=');">TortoiseSVN</a> &#8211; do wszelkich commitów z dysku, dla świetnego narzędzia DIFF.
</p>
<p style="text-align:justify">
Do Visuala natomiast niesamowita wtyczka &#8211; <a href="http://ankhsvn.open.collab.net/" onclick="pageTracker._trackPageview('/outgoing/ankhsvn.open.collab.net/?referer=');">ankSVN</a> &#8211; bohater dzisiejszego szybkiego wpisu. Jeśli używasz Visuala i SVN a nie używasz Ankha &#8211; robisz sobie niepotrzebną robotę ;) Polecam zapoznać się z tym rozwiązaniem, dzięki któremu oszczędzam rocznie pewnie około miliona kliknięć ;)<br />
Sprawa, o której łatwo zapomnieć a która skutecznie potrafi popsuć nerwy: needs-lock. Dzięki temu małemu atrybutowi mamy pewność, że tylko jedna osoba w danej chwili może edytować plik. Tzn. oczywiście może &#8220;złamać&#8221; czy &#8220;skraść&#8221; locka ale zrobi to świadomie.
</p>
<p><span id="more-725"></span></p>
<p style="text-align:justify">
Wiem, że można ustawić we właściwościach projektu, by na określonych lub wszystkich typach plików sam serwer zakładał atrybut needs-lock. Nigdy jednak nie chciało mi się szukać w dokumentacji jak to zrobić :) Jest łatwiejszy sposób.<br />
W profilu użytkownika systemu Windows znajduje się folder &#8220;Subversion&#8221; a w nim plik &#8220;config&#8221;. W Win7 jest to: &#8220;C:\Users\USERNAME\AppData\Roaming\Subversion&#8221;, w winXP analogicznie w &#8220;Documents and Settings\&#8230;.\Subversion&#8221;.
</p>
<p>W pliku tym wystarczy odkomentować linię zawierając wpis:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">enable<span style="color: #008000;">-</span>auto<span style="color: #008000;">-</span>props <span style="color: #008000;">=</span> yes</div></div>
<p>Linie komentowane są znakiem hasha (#)</p>
<p>Następnie niżej, w sekcji:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&#91;</span>auto<span style="color: #008000;">-</span>props<span style="color: #000000;">&#93;</span></div></div>
<p style="text-align:justify">
możemy już konkretnie wskazać, które pliki mają mieć zakładane automatyczne property needs-lock.<br />
Ja ustawiam zawsze:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">*</span>.<span style="color: #008000;">*</span> <span style="color: #008000;">=</span> svn<span style="color: #008000;">:</span>needs<span style="color: #008000;">-</span><span style="color: #0600FF;">lock</span><span style="color: #008000;">=</span><span style="color: #FF0000;">1</span></div></div>
<p>co nadaje wszystkim plikom ów atrybut.</p>
<p style="text-align:justify">
Dzięki temu we wszystkich projektach, których commit będziemy wykonywać z poziomu VisualStudio pliki automatycznie będą wymagały blokowania przed rozpoczęciem pracy z nimi. Wersja dla zapominalskich &#8211; m.in. dla mnie ;)
</p>
<p style="text-align:justify">
Dodatkowo:<br />
można ustawić we właściwościach całego folderu projektu (zakładka Subversion) property tsvn:autoprops, w wartości wpisać analogicznie:<br />
*.*=svn:needs-lock=1<br />
i koniecznie zaznaczyć opcję &#8220;Apply property recursively&#8221;.
</p>
<p style="text-align:justify">
Jest to właściwość samego tortoise &#8211; i działa tylko gdy wykonujemy commit przy jego użyciu.</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/zSAccJiJ1RU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/ankhsvn-i-automatyczne-needs-lock/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/ankhsvn-i-automatyczne-needs-lock/</feedburner:origLink></item>
		<item>
		<title>Weekendowo – przygotowania do egzaminu, poznawanie MVC</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/UgvjjixNuRY/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/weekendowo-przygotowania-do-egzaminu-poznawanie-mvc/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 21:17:47 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[ogólne]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=719</guid>
		<description><![CDATA[
Po ciężkiim tygodniu nastał weekend :)
Skupiłem się dziś na czytaniu Training Kit&#8217;a do egzaminu 70-536.
Rewolucji żadnej póki co ta książka nie wnosi. Owszem &#8211; dość dobrze porządkuje całą zdobytą wiedzę, jednak zagadnienia są dość akademickie.
Muszę jednak przyznać, że to jedna z lepszych publikacji MS jakie mam okazję czytać. Pisana jest bez zbędnego nadęcia a autor [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Po ciężkiim tygodniu nastał weekend :)<br />
Skupiłem się dziś na czytaniu <a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=9469&#038;locale=en-us" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/learning/en/us/book.aspx?ID=9469_038_locale=en-us&amp;referer=');">Training Kit&#8217;a do egzaminu 70-536</a>.<br />
Rewolucji żadnej póki co ta książka nie wnosi. Owszem &#8211; dość dobrze porządkuje całą zdobytą wiedzę, jednak zagadnienia są dość akademickie.<br />
Muszę jednak przyznać, że to jedna z lepszych publikacji MS jakie mam okazję czytać. Pisana jest bez zbędnego nadęcia a autor pozwala sobie nawet na rozbawiające wstawki w rodzaju: &#8220;doskonała znajomość wyrażeń regularnych zapewne ucieszyłaby Twoich kolegów, mających świra na punkcie Linuxa ale nie oszukujmy się &#8211; na egzaminie wymagamy ich podstawowej znajomości&#8221; ;)</p>
<p><p style="text-align:justify">
Zdziwiony też jestem lekkością, z jaką czyta się tak ogromną cegłę (waży chyba ze 2,5kg). Przebrnąłem przez ponad 200 stron &#8211; value types, reference types, collections, serialization &#8211; i nie czuję się nawet zmęczony.<br />
Zobaczymy co bedzie dalej &#8211; właśnie zaczynam rozdział o Graphics i uświadomiłem sobie, że nigdy chyba w C# niczego nie narysowałem &#8220;ręcznie&#8217;. Także spora luka do nadrobienia ;)</p>
<p><p style="text-align:justify">
Druga sprawa &#8211; <a href="http://www.asp.net/mvc/whatisaspmvc/" onclick="pageTracker._trackPageview('/outgoing/www.asp.net/mvc/whatisaspmvc/?referer=');">framework MVC</a>.<br />
Kiedyś coś o nim słyszałem, jednak jakoś nie miałem okazji używać. W firmie, w której pracuje korzystamy z własnego frameworka, w &#8220;prywatnym&#8221; programowaniu też miałem jakieś własne rozwiązania ze &#8220;starych&#8221; czasów.<br />
Przypomniałem sobie o MVC kilka dni temu, przy okazji robienia niewielkiego projektu w.. uwaga &#8211; PHP ;) Użyłem do tego frameworka <a href="http://www.kohanaphp.com/" onclick="pageTracker._trackPageview('/outgoing/www.kohanaphp.com/?referer=');">Kohana</a> opartego o ten sam wzorzec. Praca z tym frameworkiem była dość przyjemna. Banalna konfiguracja i nareszcie możliwość utrzymania względnie czystego i czytelnego kodu sprawiły, że nareszcie jestem zadowolony z własnego kodu napisanego w PHP ;)
</p>
<p style="text-align:justify">
W przypływie zachwytu postanowiłem więc w wolnej chwili przyjrzeć się temu, jak do sprawy MVC podszedł Microsoft. Cóż &#8211; w pierwszej chwili czułem się totalnie zdezorientowany.<br />
Dziwnie czuje się człowiek, któremu wydaje się, że &#8220;coś tam wie&#8221; a jednocześnie nie wie nagle jak coś działa. Setki atrybutów przy metodach, klasach, DataContext, brak kontrolek.<br />
Po kilku godzinach, na które złożyło się oglądanie <a href="http://www.asp.net/learn/mvc-videos/" onclick="pageTracker._trackPageview('/outgoing/www.asp.net/learn/mvc-videos/?referer=');">Video Tutoriali</a>, odpalenia <a href="http://nerddinner.codeplex.com/" onclick="pageTracker._trackPageview('/outgoing/nerddinner.codeplex.com/?referer=');">NerdDinner</a>, czyli przykładowej aplikacji od MS opartej o MVC muszę przyznać, że spodobało mi się!
</p>
<p style="text-align:justify">
Trochę mnie to martwi, gdyż zapewne najbliższe tygodnie przeznaczę na oglądanie kolejnych video-tutoriali i czytaniu wszystkiego co popadnie. W połączeniu z chronicznym brakiem czasu skończy się niejedną zarwaną nocką ;) Mam już sporo &#8220;pytań&#8221; dotyczących połączenia z bazą danych. Do tej pory używałem własnej klasy opakowującej frameworkowe SQlConnection w połączeniu z procedurami składowanymi. Ciekawe, czy da się łatwo użyć tych, istniejących już, procedur w DataContext.
</p>
<p style="text-align:justify">
Takie luźne przemyślanie.. A jak wyglądało Wasze spotkanie z MVC? Jakie projekty zrealizowaliście przy jego pomocy? Co polecicie do poczytania, niekoniecznie tylko w internecie? Na co denerwującego się natknęliście i możecie przestrzec przed tym innych?</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/UgvjjixNuRY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/weekendowo-przygotowania-do-egzaminu-poznawanie-mvc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/weekendowo-przygotowania-do-egzaminu-poznawanie-mvc/</feedburner:origLink></item>
		<item>
		<title>Polski klon stackoverflow.com – devpytania.pl</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/NvAksHJPfjg/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/polski-klon-stackoverflow-com-devpytania-pl/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 12:09:09 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=714</guid>
		<description><![CDATA[
Wczoraj wpis o klonowaniu a dziś zauważyłem, że powstał klon najlepszego moim zdaniem społecznościowego(?) serwisu programistycznego &#8211; stackoverflow.com.
Z tego co zauważyłem premiera devpytania.pl miała miejsce 3 stycznia. Ja jednak dopiero dziś wpadłem na informację o tym startupie.
Pytanie tylko &#8211; czy się to przyjmie? Stackoverflow.com ma niesamowitą siłę rażenia. Ilość pytań (i dobrych odpowiedzi) jest ogromna [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Wczoraj wpis o klonowaniu a dziś zauważyłem, że powstał klon najlepszego moim zdaniem społecznościowego(?) serwisu programistycznego &#8211; <a href="stackoverflow.com">stackoverflow.com</a>.<br />
Z tego co <a href="http://www.devblogi.pl/2010/01/z-nowym-rokiem-nowym-krokiem_03.html" onclick="pageTracker._trackPageview('/outgoing/www.devblogi.pl/2010/01/z-nowym-rokiem-nowym-krokiem_03.html?referer=');">zauważyłem</a> premiera <a href="devpytania.pl">devpytania.pl</a> miała miejsce 3 stycznia. Ja jednak dopiero dziś wpadłem na informację o tym startupie.</p>
<p>Pytanie tylko &#8211; czy się to przyjmie? Stackoverflow.com ma niesamowitą siłę rażenia. Ilość pytań (i dobrych odpowiedzi) jest ogromna a chyba język angielski w przypadku programowania to żadna bariera.<br />
Uważam jednak, że sama idea jest niezła. Polska &#8220;społeczność&#8221; osób związanych z programowaniem powoli wychodzi z ukrycia ;) Oby tylko z tego serwisu nie zrobił się śmietnik.<br />
Dla mnie najwspanialsza w tego typu serwisach jest czytelność. Każda odpowiedź ma ocenę i od razu widać, co jest wartościowe. Niesamowicie to pomocne w codziennym pędzie.<br />
Sam chętnie będę zaglądał i (być może) służył radą tam i ówdzie ;) </p>
<p>W każdym razie &#8211; powodzenia.</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/NvAksHJPfjg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/polski-klon-stackoverflow-com-devpytania-pl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/polski-klon-stackoverflow-com-devpytania-pl/</feedburner:origLink></item>
		<item>
		<title>[Nonsensopedia] – programowanie. Na wesoło.</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/B1C2vm5Qh3I/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/nonsensopedia-programowanie-na-wesolo/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:53:41 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[na wesoło]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=710</guid>
		<description><![CDATA[Niesamowicie spodobał mi się wpis dotyczący programowania, zamieszczony na nonsensopedii.
Polecam zapoznanie się przy porannej kawie:
http://nonsensopedia.wikia.com/wiki/Programowanie
Mam nadzieję, że poprawi humor, podniesie biorytm i odpędzi złe duchy ;)


Nie znaleziono powiązanych wpisów.
Powiązane wpisy wygenerowane przez wtyczkę Yet Another Related Posts.


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Niesamowicie spodobał mi się wpis dotyczący programowania, zamieszczony na nonsensopedii.<br />
Polecam zapoznanie się przy porannej kawie:</p>
<p><a href="http://nonsensopedia.wikia.com/wiki/Programowanie" onclick="pageTracker._trackPageview('/outgoing/nonsensopedia.wikia.com/wiki/Programowanie?referer=');">http://nonsensopedia.wikia.com/wiki/Programowanie</a></p>
<p>Mam nadzieję, że poprawi humor, podniesie biorytm i odpędzi złe duchy ;)</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/B1C2vm5Qh3I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/nonsensopedia-programowanie-na-wesolo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/nonsensopedia-programowanie-na-wesolo/</feedburner:origLink></item>
		<item>
		<title>Shallow copy a deep copy – klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/BwyTRHaVzlw/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:40:53 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[C# klonowanie]]></category>
		<category><![CDATA[deep copy]]></category>
		<category><![CDATA[ICloneable]]></category>
		<category><![CDATA[serializacja]]></category>
		<category><![CDATA[shallow copy]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=692</guid>
		<description><![CDATA[
Rozróżnia się dwie możliwości klonowania obiektów:

shallow copy &#8211; tzw. płytka kopia. Najczęściej wykonywana przy użyciu metody MemberwiseClone z klasy Object.
deep copy &#8211; tzw. głęboka, pełna kopia. Przyjrzymy się jednej z możliwości jej realizacji &#8211; wykorzystania serializacji do strumienia w pamięci.


Zapewne wszyscy wiedzą o istnieniu metody MemberwiseClone w klasie Object.
Pozwala ona na wykonanie tzw. &#8220;shallow copy&#8221;, [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#'>Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Rozróżnia się dwie możliwości klonowania obiektów:</p>
<ul>
<li>shallow copy &#8211; tzw. płytka kopia. Najczęściej wykonywana przy użyciu metody MemberwiseClone z klasy Object.</li>
<li>deep copy &#8211; tzw. głęboka, pełna kopia. Przyjrzymy się jednej z możliwości jej realizacji &#8211; wykorzystania serializacji do strumienia w pamięci.</li>
</ul>
<p style="text-align:justify">
Zapewne wszyscy wiedzą o istnieniu metody <a href="http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx?referer=');">MemberwiseClone</a> w klasie Object.<br />
Pozwala ona na wykonanie tzw. &#8220;shallow copy&#8221;, czyli &#8220;płytkiej kopii&#8221; obiektu. Kopia taka nie radzi sobie jednak z typami referencyjnymi zagnieżdżonymi w klonowanym obiekcie. Potrafi poprawnie kopiować tylko Value Types.
</p>
<p><span id="more-692"></span></p>
<p style="text-align:justify">
Weźmy przykładową klasę Person:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> FirstName <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> LastName <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> DateTime BirthDate <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> Person Boss <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> Person<span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">string</span> firstName, <span style="color: #FF0000;">string</span> lastName, DateTime birthDate <span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">FirstName</span> <span style="color: #008000;">=</span> firstName<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">LastName</span> <span style="color: #008000;">=</span> lastName<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">BirthDate</span> <span style="color: #008000;">=</span> birthDate<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span> &nbsp; &nbsp; &nbsp;<br />
<span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Możemy zaimplementować interfejs <a href="http://msdn.microsoft.com/en-us/library/system.icloneable.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.icloneable.aspx?referer=');">ICloneable</a> dla &#8220;shallow copy&#8221; w ten sposób:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">object</span> Clone<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">MemberwiseClone</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Co się jednak stanie, gdy wykonamy kopię zmiennej kowalski z poniższego przykładu?
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Person jankowski <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Stefan&quot;</span>, <span style="color: #666666;">&quot;Jankowski&quot;</span>, <span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span>1977,2,25<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
Person kowalski <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Jan&quot;</span>, <span style="color: #666666;">&quot;Kowalski&quot;</span>, <span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span>1980,12,4<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
kowalski.<span style="color: #0000FF;">Boss</span> <span style="color: #008000;">=</span> jankowski<span style="color: #008000;">;</span><br />
<br />
Person kowalskiCopy <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>kowalski.<span style="color: #0000FF;">Clone</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
Debug.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span>kowalski.<span style="color: #0000FF;">Boss</span> <span style="color: #008000;">==</span> kowalskiCopy.<span style="color: #0000FF;">Boss</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p style="text-align:justify">
<p>Wynik? Tak jak oczekiwaliśmy, Boss w obiekcie kowalski oraz kowalskiCopy wskazują na ten sam obiekt &#8211; jankowski.</p>
<p>Jak widać nie jest to idealne wyjście. Rzadko zdarza się, by obiekt zawierał wyłącznie value types. Ponadto metodę MemberwiseClone możemy wywołać tylko w klasie, do której mamy dostęp. Dlaczego? Ponieważ jest ona oznaczona jako protected w klasie Object. Oznacza to, że nie użyjemy jej, gdy chcemy sklonować typ z innej biblioteki, której źródła nie jesteśmy w stanie sami zmodyfikować implementując ICloneable.</p>
<p>Właśnie tutaj z pomocą przychodzi nam serializacja. Wystarczy zserializować obiekt do strumienia w pamięci i zdeserializować do innej instancji. Gotowe.</p>
<p>Jak z realizacją?<br />
Nic nie stoi na przeszkodze, aby zamknąć kod w statycznej metodzie i wykorzystać typ generyczny. Dzięki temu będziemy mogli przy użyciu jednej metody serializować wszystkie typy! No &#8211; prawie wszystkie.</p>
<p>Należy pamiętać, że typ, który chcemy serializować:</p>
<ul>
<li>musi być oznaczony atrybutem <a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.serializableattribute.aspx?referer=');">Serializable</a></li>
<li>wszystkie jego pola muszą być serializowalne</li>
</ul>
<p>Jeśli klasa nie będzie spełniać powyższych wymagań, w runtime otrzymamy SerializationException.</p>
<p> Do naszej klasy wprowadzamy więc małą modyfikację:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&#91;</span>Serializable<span style="color: #000000;">&#93;</span><br />
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
<span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Metoda, którą będziemy serializować nasze obiekty jest dość prosta.</p>
<p>W dyrektywie using tworzymy nowy MemoryStream. Następnie tworzymy instancję <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx?referer=');">BinaryFormattera</a>, informując go w konstruktorze, że będzie użyty w kontekście serializacji.<br />
Serializujemy przekazany obiekt, przewijamy stream do początku i deserializujemy. Musimy przeprowadzić rzutowanie (Deserialize zwraca Object). Trochę kodu:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> T CloneObject<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span> T item <span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span> MemoryStream ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//instancja BinaryFormattera - informujemy go,</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//ze bedzie uzyty w celu klonowania</span><br />
&nbsp; &nbsp; &nbsp; BinaryFormatter bf <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BinaryFormatter<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">new</span> StreamingContext<span style="color: #000000;">&#40;</span>StreamingContextStates.<span style="color: #0000FF;">Clone</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//serializacja</span><br />
&nbsp; &nbsp; &nbsp; bf.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span>ms, item<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//przewijamy memoryStream do poczatku</span><br />
&nbsp; &nbsp; &nbsp; ms.<span style="color: #0000FF;">Seek</span><span style="color: #000000;">&#40;</span>0, SeekOrigin.<span style="color: #0000FF;">Begin</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//deserializacja</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span> T <span style="color: #000000;">&#41;</span>bf.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>To wszystko. Przykład użycia:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Person kowalskiCopy <span style="color: #008000;">=</span> Tools.<span style="color: #0000FF;">CloneObject</span><span style="color: #008000;">&lt;</span>Person<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>kowalski<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
Debug.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span>kowalski.<span style="color: #0000FF;">Boss</span> <span style="color: #008000;">==</span> kowalskiCopy.<span style="color: #0000FF;">Boss</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p>Efekt wykonania tej metody? W oknie output pojawi się false. Oznacza to, że obiekt został w pełni sklonowany &#8211; łącznie z referencją do szefa.</p>
<p>Jest jeszcze kilka niewielkich niuansów związanych z serializacją &#8211; jak np. delegaty czy propertiesy, które nie powinny być serializowalne. To jednak materiał na odrębny, obszerny wpis.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#'>Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/BwyTRHaVzlw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/</feedburner:origLink></item>
		<item>
		<title>Visual Studio – jednoczesne debugowanie kilku projektów w solution</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/2MlNXCmBuH8/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 21:45:06 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[visual studio tricks]]></category>
		<category><![CDATA[debugowanie wielu projektów]]></category>
		<category><![CDATA[visual studio 2008]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=685</guid>
		<description><![CDATA[
Najprostsze rozwiązania często są w Visual Studio sprytnie ukryte. Takie czasem odnoszę wrażenie. Jedną z rzeczy, na które narzekałem przy debugowaniu np. WebService&#8217;ów czy aplikacji współdzielących niektóre zasoby był brak możliwości ustawienia jako &#8220;Startup&#8221; kilku projektów w ramach jednej solucji. Okazuje się jednak, że jest to banalnie proste..



Przeważnie ustawiałem jeden projekt jako startowy korzystając z [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/' rel='bookmark' title='Permanent Link: The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.'>The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Najprostsze rozwiązania często są w Visual Studio sprytnie ukryte. Takie czasem odnoszę wrażenie. Jedną z rzeczy, na które narzekałem przy debugowaniu np. WebService&#8217;ów czy aplikacji współdzielących niektóre zasoby był brak możliwości ustawienia jako &#8220;Startup&#8221; kilku projektów w ramach jednej solucji. Okazuje się jednak, że jest to banalnie proste..
</p>
<p><span id="more-685"></span></p>
<p style="text-align:justify">
Przeważnie ustawiałem jeden projekt jako startowy korzystając z opcji w menu kontekstowym na projekcie: &#8220;Set as startup project&#8221;.<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik046.jpg" rel="lightbox[685]"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik046-150x150.jpg" alt="" title="Opcja &quot;Set as startup project&quot;" width="150" height="150" class="aligncenter size-thumbnail wp-image-686" /></a>
</p>
<p style="text-align:justify">
Możliwe jest jednak ustawienie wielu projektów jako startowych. W tym celu należy wywołać menu kontekstowe na Solution i wybrać Properties:<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik047.jpg" rel="lightbox[685]"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik047-150x150.jpg" alt="" title="Solution, menu kontekstowe" width="150" height="150" class="aligncenter size-thumbnail wp-image-687" /></a>
</p>
<p style="text-align:justify">
Naszym oczom ukaże się okno właściwości. Wybieramy po lewej opcję Common Properties -> Startup Project.<br />
Teraz wystarczy przełączyć je w tryb &#8220;Multiple startup projects&#8221; i wybrać akcję na tych projektach, które nas interesują:<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik048.jpg" rel="lightbox[685]"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik048-150x150.jpg" alt="" title="Właściwości solucji" width="150" height="150" class="aligncenter size-thumbnail wp-image-688" /></a>
</p>
<p style="text-align:justify">
Można ustawić projekt w trybie:</p>
<ul>
<li>None &#8211; wiadomo ;)</li>
<li>Start &#8211; uruchamia z debuggerem</li>
<li>Start without debugging &#8211; wiadomo ;)</li>
</ul>
<p>Także.. happy debugging! ;)</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/' rel='bookmark' title='Permanent Link: The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.'>The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/2MlNXCmBuH8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/</feedburner:origLink></item>
		<item>
		<title>Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/Qw-DQJlHEU4/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 21:30:55 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[jedna instancja aplikacji]]></category>
		<category><![CDATA[mutex]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=677</guid>
		<description><![CDATA[
Uzupełniam ostatnio braki w wiedzy, dotyczące synchronizacji wątków. Gdzieś w podrozdziale dotyczącym tego tematu przykuł moją uwagę Mutex. Mutex to, obok monitorów i semaforów, jedna z &#8220;prymitywnych&#8221; metod synchronizacji. Ma jednak bardzo ciekawą właściwość, odróżniającą ją od kolegów po fachu&#8230;



Otóż co to za właściwość? Tatusiem Mutexu jest bezpośrednio windowsowy kernel a jego właścicielem może być [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/' rel='bookmark' title='Permanent Link: &#8220;throw&#8221; czy &#8220;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej'>&#8220;throw&#8221; czy &#8220;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Uzupełniam ostatnio braki w wiedzy, dotyczące synchronizacji wątków. Gdzieś w podrozdziale dotyczącym tego tematu przykuł moją uwagę <a href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.threading.mutex.aspx?referer=');">Mutex</a>. Mutex to, obok monitorów i semaforów, jedna z &#8220;prymitywnych&#8221; metod synchronizacji. Ma jednak bardzo ciekawą właściwość, odróżniającą ją od kolegów po fachu&#8230;
</p>
<p><span id="more-677"></span></p>
<p style="text-align:justify">
Otóż co to za właściwość? Tatusiem Mutexu jest bezpośrednio windowsowy kernel a jego właścicielem może być w jednej chwili tylko jeden wątek. Wątek, który przejmuje obiekt typu Mutex na własność nie blokuje sam siebie ale musi zwolnić go przy użyciu metody ReleaseMutex. Co w tym nadzwyczajnego? Jeszcze jedna sztuczka!
</p>
<p style="text-align:justify">
Korzystając z jednego z przeciążonych konstruktorów, możemy nadać obiektowi typu Mutex nazwę. Uwaga, kurtyna w górę ;) <strong>Nazwa ta jest unikalna</strong> wśród wszystkich procesów w systemie! Otóż to, panie i panowie ;) Całe to cudeńko pozwala nam niejako udostępniać obiekt Mutex pomiędzy różnymi aplikacjami. Przeważnie użylibyśmy tej właściwości do synchronizacji dostępu tych aplikacji np. do zasobów dyskowych, sieciowych itp. Jednak jest jeszcze jedno interesujące użycie.
</p>
<p style="text-align:justify">
Do sedna. Wykorzystując <a href="http://msdn.microsoft.com/en-us/library/bwe34f1k.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/bwe34f1k.aspx?referer=');">konstruktor z trzema parametrami</a>:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> Mutex<span style="color: #000000;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #FF0000;">bool</span> initiallyOwned,<br />
&nbsp; &nbsp; <span style="color: #FF0000;">string</span> name,<br />
&nbsp; &nbsp; <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">bool</span> createdNew<br />
<span style="color: #000000;">&#41;</span></div></div>
<p>Możemy skonstruować sprytny kod, który pozwoli uruchomić jednocześnie tylko jedną instancję pisanej przez nas aplikacji. Przykład?</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args <span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #FF0000;">bool</span> isNewCreated<span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000;">System.<span style="color: #0000FF;">Threading</span></span>.<span style="color: #0000FF;">Mutex</span> mutex <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Mutex<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span>, <span style="color: #666666;">&quot;MUTEX_DEMO&quot;</span>, <span style="color: #0600FF;">out</span> isNewCreated<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span> isNewCreated <span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Brawo - jesteś pierwszy! ;)&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp;<span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Niestety! Nie byłeś pierwszy ;)&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp;Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #000000;">&#125;</span></div></div>
<p>W sumie jedną linijką kodu załatwiamy sprawdzenie. Być może nie jest to wyjście idealne, ale czasem może uratować trochę czasu.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/' rel='bookmark' title='Permanent Link: &#8220;throw&#8221; czy &#8220;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej'>&#8220;throw&#8221; czy &#8220;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/Qw-DQJlHEU4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/</feedburner:origLink></item>
		<item>
		<title>MS SQL – zapytania do detach, attach i drop connections</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/FhmizmgEYZA/</link>
		<comments>http://andrzej.net.pl/index.php/2009/11/ms-sql-zapytania-do-detach-attach-i-drop-connections/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 21:59:39 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[mssql]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[attach]]></category>
		<category><![CDATA[detach]]></category>
		<category><![CDATA[drop connections]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=670</guid>
		<description><![CDATA[Witam po krótkiej przerwie ;)
Zdobywanie tytułu magistra i mały projekt, który kończę &#8220;po godzinach&#8221; normalnej pracy spowodował, że czasu na bloga nie zostawało. Postaram się jednak częściej pisać, by biorący udział w konkursie na dotnetomaniaku mieli dodatkowe źródło ;)
Dziś podczas kończenia niewielkiej aplikacji do zarządzania zadaniami przeprowadzałem testy pod tytułem &#8220;była sobie baza danych a [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/mssql-porownywanie-dat/' rel='bookmark' title='Permanent Link: MSSQL &#8211; porównywanie dat'>MSSQL &#8211; porównywanie dat</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">Witam po krótkiej przerwie ;)<br />
Zdobywanie tytułu magistra i mały projekt, który kończę &#8220;po godzinach&#8221; normalnej pracy spowodował, że czasu na bloga nie zostawało. Postaram się jednak częściej pisać, by biorący udział w konkursie na <a href="http://dotnetomaniak.pl/" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/?referer=');">dotnetomaniaku</a> mieli dodatkowe źródło ;)</p>
<p style="text-align:justify">Dziś podczas kończenia niewielkiej aplikacji do zarządzania zadaniami przeprowadzałem testy pod tytułem &#8220;była sobie baza danych a teraz nie ma&#8221; ;) Szlag mnie trafiał po dwudziestym powtórzeniu detach / attach, więc postanowiłem sprawę załatwić bez klikania. Potrzebne do tego były jednak zapytania, które pozwalały wykonać odpowiednie akcje. Może komuś oszczędzi to kilku dłuższych chwil na szukanie&#8230;</p>
<p><span id="more-670"></span></p>
<p>Zapytanie do odłączenia bazy:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sp_detach_db <span style="color: #ff0000;">'task_manager'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'true'</span></div></div>
<p>Podczas jego wykonywania można jednak napotkać na błąd:</p>
<blockquote><p>Cannot detach the database &#8216;task_manager&#8217; because it is currently in use.</p></blockquote>
<p>Lepiej więc wykonać najpierw małe hokus-pokus do ubicia połączeń ;)</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">USE</span> master;<br />
GO<br />
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> task_manager<br />
<span style="color: #993333; font-weight: bold;">SET</span> SINGLE_USER<br />
<span style="color: #993333; font-weight: bold;">WITH</span> ROLLBACK IMMEDIATE;<br />
GO<br />
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> task_manager<br />
<span style="color: #993333; font-weight: bold;">SET</span> MULTI_USER;<br />
GO</div></div>
<p>Natomiast ponowne podłączenie bazy:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">EXEC sp_attach_db @dbname <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'task_manager'</span><span style="color: #66cc66;">,</span><br />
@filename1 <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'C:<span style="color: #000099; font-weight: bold;">\P</span>rogram Files<span style="color: #000099; font-weight: bold;">\M</span>icrosoft SQL Server<span style="color: #000099; font-weight: bold;">\M</span>SSQL.1<span style="color: #000099; font-weight: bold;">\M</span>SSQL<span style="color: #000099; font-weight: bold;">\D</span>ata<span style="color: #000099; font-weight: bold;">\t</span>ask_manager.mdf'</span><span style="color: #66cc66;">,</span><br />
@filename2 <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'C:<span style="color: #000099; font-weight: bold;">\P</span>rogram Files<span style="color: #000099; font-weight: bold;">\M</span>icrosoft SQL Server<span style="color: #000099; font-weight: bold;">\M</span>SSQL.1<span style="color: #000099; font-weight: bold;">\M</span>SSQL<span style="color: #000099; font-weight: bold;">\D</span>ata<span style="color: #000099; font-weight: bold;">\t</span>ask_manager_log.ldf'</span></div></div>
<p>Voilà! ;)</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/mssql-porownywanie-dat/' rel='bookmark' title='Permanent Link: MSSQL &#8211; porównywanie dat'>MSSQL &#8211; porównywanie dat</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/FhmizmgEYZA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/11/ms-sql-zapytania-do-detach-attach-i-drop-connections/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/11/ms-sql-zapytania-do-detach-attach-i-drop-connections/</feedburner:origLink></item>
		<item>
		<title>Zmiana wyglądu</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/ESmgBlyhI08/</link>
		<comments>http://andrzej.net.pl/index.php/2009/10/zmiana-wygladu/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 22:06:47 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=657</guid>
		<description><![CDATA[
W poprzedniej skórce bloga czegoś mi brakowało. To jeden z tych przypadków, gdy wiadomo, że coś jest nie tak ale nie wiadomo do końca co ;)



Przejrzałem chyba wszystkie tematy do wordpressa i w końcu trafiłem na ten, który wlaśnie widzicie. Przypadl mi do gustu niesamowicie. Pozostaje oczywiście dopracowanie szczegółów i spolszczenie komunikatów &#8211; jednak większość [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
W poprzedniej skórce bloga czegoś mi brakowało. To jeden z tych przypadków, gdy wiadomo, że coś jest nie tak ale nie wiadomo do końca co ;)
</p>
<p><span id="more-657"></span></p>
<p style="text-align:justify">
Przejrzałem chyba <a href="http://wordpress.org/extend/themes" onclick="pageTracker._trackPageview('/outgoing/wordpress.org/extend/themes?referer=');">wszystkie tematy do wordpressa</a> i w końcu trafiłem na ten, który wlaśnie widzicie. Przypadl mi do gustu niesamowicie. Pozostaje oczywiście dopracowanie szczegółów i spolszczenie komunikatów &#8211; jednak większość gotowa. Mam nadzieję, że spójny wygląd z interesującym layoutem będzie zachęcał do czytania :) Zawsze chciałem mieć coś na zasadzie &#8220;category slider&#8221; widocznego na stronie głównej. Pojawia się co prawda dodatkowe wyzwanie &#8211; poza wpisem trzeba stworzyć również infografikę &#8211; jednak efekt końcowy wg mnie zadowalający.</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/ESmgBlyhI08" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/10/zmiana-wygladu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/10/zmiana-wygladu/</feedburner:origLink></item>
		<item>
		<title>Książki – co czytam. Certyfikacja – czy warto?</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/av3KzDy4_iE/</link>
		<comments>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 21:52:07 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[certyfikacja MS]]></category>
		<category><![CDATA[CLR VIA C#]]></category>
		<category><![CDATA[książki o C#]]></category>
		<category><![CDATA[MCTS 70-536]]></category>
		<category><![CDATA[THE BASE CLASS LIBRARY]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=627</guid>
		<description><![CDATA[
Na wstępie &#8220;krótkie&#8221; wprowadzenie &#8211; opis książki, którą męczyłem przez ostatnie ładnych &#8220;kilka&#8221; dni ;)

Co uważniejsi z czytelników zauważyli malutki widget po prawej stronie &#8211; &#8220;Obecnie czytam&#8221;. Właśnie wymieniła się w niej książka. Skończyłem czytać &#8220;CLR VIA C#&#8221; Richtera, zabieram się za &#8220;VISUAL C# 2005: THE BASE CLASS LIBRARY&#8221; Balena. Z tą książką powinno pójść [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/Ksi%C4%85%C5%BCki-co-czytam" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Ksi_C4_85_C5_BCki-co-czytam?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fksiazki-co-czytam-certyfikacja-czy-warto%2F" style="border:0px"/></a></p>
<p>Na wstępie &#8220;krótkie&#8221; wprowadzenie &#8211; opis książki, którą męczyłem przez ostatnie ładnych &#8220;kilka&#8221; dni ;)</p>
<p style="text-align:justify">
Co uważniejsi z czytelników zauważyli malutki widget po prawej stronie &#8211; &#8220;Obecnie czytam&#8221;. Właśnie wymieniła się w niej książka. Skończyłem czytać <a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=6522&#038;locale=en-us" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/learning/en/us/book.aspx?ID=6522_038_locale=en-us&amp;referer=');">&#8220;CLR VIA C#&#8221; Richtera</a>, zabieram się za <a href="http://www.amazon.com/Programming-Microsoft-Visual-2005-Pro-Developer/dp/0735623082" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Programming-Microsoft-Visual-2005-Pro-Developer/dp/0735623082?referer=');">&#8220;VISUAL C# 2005: THE BASE CLASS LIBRARY&#8221; Balena</a>. Z tą książką powinno pójść łatwiej i szybciej niż z Richterem (takie mam wrażenie).
</p>
<p style="text-align:justify">
CLR VIA C# jest bardzo interesującą pozycją, którą polecam każdemu. Richter w dość swoisty sposób rozebrał na części pierwsze wszystko, z czym spotykamy się na co dzień. Pierwsza część jest mocno teoretyczna &#8211; operacja na otwartym sercu .NET, czyli CLR właśnie. Ciekawostki, ogólny zarys i założenia, które zapadają w pamięć i sporo rozjaśniają. Część &#8220;Working with types&#8221; &#8211; dość ciekawa. Nie zanudza, mimo, iż opisuje rzeczy oczywiste. &#8220;Designing parts&#8221; &#8211; wspaniałe kompendium dla każdego, kto programuje współdzielone komponenty lub po prostu dąży do tego, by jego kod był zgodny ze standardem, skalowalny, bezpieczny i zoptymalizowany. 70 stron czyta się z miłym odczuciem, że nareszcie ktoś uporządkował to nad czym zawsze zastanawiałem się &#8220;czy robię to dobrze?&#8221;.
</p>
<p><span id="more-627"></span></p>
<p style="text-align:justify">
Dział &#8220;Essential types&#8221; również segreguje i porządkuje zagadnienia dotyczące rzeczy, z którymi spotykami się często. Praca z tekstem, typami enumerowanymi, tablicami, interfejsami, typami generycznymi &#8211; po lekturze staje się bardziej przewidywalna i pewna. Same przykłady są naprawdę w porządku. Prezentują często wiele aspektów poruszanego zagadnienia w&nbsp;przystępny sposób. Nie traktują czytelnika jako &#8220;niepełnosprytnego&#8221; wyjaśniając niepotrzebnie każdą linijkę &#8211; oby takie przykłady spotykać w każdej książce.
</p>
<p style="text-align:justify">
Sekcja &#8220;CLR Facilities&#8221; nie jest lekka ale jest niesamowicie przydatna. Świadomość istnienia i sposób działania Garbage Collectora, refleksje i operacje asynchroniczne &#8211; nie taki wilk straszny, jak go malują.
</p>
<p style="text-align:justify">
Książki tej (niemal 650 stron) nie da się przeczytać i zapamiętać wszystkiego. Nie raz jednak wracam do niej podczas codziennej pracy, utrwalając coś, co w danej chwili robię. Sama świadomość, że wiadomo gdzie zajrzeć aby uzyskać pewną podpowiedź czy wskazówkę jest komfortowa. Książka to kompendium, które zwraca uwagę na aspekty często traktowane w innych publikacjach po macoszemu lub wręcz pomijane. &#8220;Important notes&#8221; &#8211; przyciągają uwagę do pułapek, na których można się wyłożyć przy nieumiejętnym używaniu tego, co oferuje C#. Jednocześnie książkę czyta się przyjemnie. Liczne wzmianki o tym, że Microsoft (zdaniem autora) coś schrzanił i ma nadzieję, że naprawią to w następnej wersji przyprawiają o&nbsp;uśmiech i zwracają uwagę na to, że nikt nie jest nieomylny ;) Richter ma co prawda świra na punkcie thread safety, security, wydajności, zasięgu widoczności zmiennych, pieczętowania klas &#8211; i trochę tym zaraża ;) To w sumie jedyny zarzut do książki ;)
</p>
<p style="text-align:justify">
Jeden z przykładów, gdy sedno będzie krótsze niż wstęp ;) Po przeczytaniu &#8220;THE BCL&#8221; zastanawiam się nad połknięciem pozycji stricte &#8220;egzaminowej&#8221; i podejście do MCTS. Propozycja szefostwa i własne obserwacje to <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-536&#038;Locale=en-us" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/learning/en/us/Exam.aspx?ID=70-536_038_Locale=en-us&amp;referer=');">70-536: Microsoft .NET Framework &#8211; Application Development Foundation</a>. Ktoś z Was miał sposobność zdawać? Jak poszło? Jak się przygotowywaliście? Ile czasu Wam to zajęło? Może ktoś, tak jak ja, dopiero planuje? Czy według Was obecnie takie potwierdzenie umiejętności &#8211; poza własną satysfakcją &#8211; jest przydatne?
</p>
<p style="text-align:justify">
Zapraszam do dyskusji w&nbsp;komentarzach. Myślę, że pomoże to i mi rozwiać niektóre wątpliwości.<br />
Jeśli ktoś chce podzielić się informacją o ciekawej książce (niekoniecznie w tematyce egzaminowej) &#8211; również chętnie zapoznam się z Waszym &#8220;co czytam&#8221;.
</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/Ksi%C4%85%C5%BCki-co-czytam" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Ksi_C4_85_C5_BCki-co-czytam?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fksiazki-co-czytam-certyfikacja-czy-warto%2F" style="border:0px"/></a></p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/av3KzDy4_iE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/</feedburner:origLink></item>
		<item>
		<title>“throw” czy “throw exc” – czyli jak najlepiej przerzucić wyjątek wyżej</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/X9jgP8zo9es/</link>
		<comments>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 22:31:19 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[pełny stack trace]]></category>
		<category><![CDATA[przerzucenie wyjątku]]></category>
		<category><![CDATA[re-throw]]></category>
		<category><![CDATA[throw]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=613</guid>
		<description><![CDATA[

Pewnie nie raz staliście przed sytuacją, w której jakaś z funkcji spowodować może powstanie wyjątku, którego wystąpienie trzeba zalogować i przerzucić go dalej (re-throw), aby aplikacja zajęła się nim jak należy. Jednocześnie idealnie, gdy wyjątek zawierał będzie jak najwięcej informacji. Zalicza się do nich przyjaciel każdego programisty &#8211; StackTrace.



Rozpatrzmy poniższy kod:

public sealed class SomeClass
&#160; &#160; [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną'>Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci%C4%87-wyj%C4%85tek-wy%C5%BCej-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci_C4_87-wyj_C4_85tek-wy_C5_BCej-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fthrow-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek%2F" style="border:0px"/></a></p>
<p style="text-align:justify;">
Pewnie nie raz staliście przed sytuacją, w której jakaś z funkcji spowodować może powstanie wyjątku, którego wystąpienie trzeba zalogować i przerzucić go dalej (re-throw), aby aplikacja zajęła się nim jak należy. Jednocześnie idealnie, gdy wyjątek zawierał będzie jak najwięcej informacji. Zalicza się do nich przyjaciel każdego programisty &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx?referer=');">StackTrace</a>.
</p>
<p><span id="more-613"></span></p>
<p style="text-align:justify;">
Rozpatrzmy poniższy kod:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">sealed</span> <span style="color: #FF0000;">class</span> SomeClass<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> SomeTestPublicMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>ApplicationException exc<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//logujemy blad</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">throw</span> exc<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> SomeMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ApplicationException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Błąd w SomeMethod&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify;">
Czyli testowa klasa, której metodę SomeTestPublicMethod udostępniamy jako publiczną, ona natomiast wywołuje prywatną metodę SomeMethod &#8211; rzucającą wyjątek ApplicationException.<br />
Jak widać wystąpienie wyjątku chcemy zalogować w metodzie SomeTestPublicMethod i rzucić wyjątek dalej. Kod wykonujący nasz &#8220;błędny&#8221; program:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeClass sc <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SomeClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sc.<span style="color: #0000FF;">SomeTestPublicMethod</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>Exception exc<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>exc.<span style="color: #0000FF;">Message</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>exc.<span style="color: #0000FF;">StackTrace</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div></div>
<p style="text-align:justify;">
Czego spodziewacie się w StackTrace? Czy zaprowadzi nas ona do oryginalnej metody SomeMethod, która spowodowała błąd? Otóż niestety nie, StackTrace wygląda tak:
</p>
<div id="attachment_619" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/10/plik024.jpg" rel="lightbox[613]"><img src="http://andrzej.net.pl/wp-content/uploads/2009/10/plik024-300x80.jpg" alt="Niepełny StackTrace" title="Niepełny StackTrace" width="300" height="80" class="size-medium wp-image-619" /></a><p class="wp-caption-text">Niepełny StackTrace</p></div>
<p style="text-align:justify;">
Zauważcie, że Message jest w porządku &#8211; pochodzi z oryginalnie rzuconego wyjątku. Dokładna informacja o&nbsp;linii wskazuje jednak dopiero na miejsce, w&nbsp;którym napisaliśmy &#8220;throw exc;&#8221; &#8211; czyli  SomeTestPublicMethod. Może wydawać się to nieistotne, bez debugowania ciężko byłoby jednak odgadnąć w czym problem i&nbsp;gdzie on tak naprawdę powstaje.<br />
Zamieńmy dosłownie jedną linię &#8211; zamiast &#8220;throw exc&#8221; zróbmy &#8220;throw&#8221;. Efekt?
</p>
<div id="attachment_620" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/10/plik025.jpg" rel="lightbox[613]"><img src="http://andrzej.net.pl/wp-content/uploads/2009/10/plik025-300x97.jpg" alt="Kompletny StackTrace" title="Kompletny StackTrace" width="300" height="97" class="size-medium wp-image-620" /></a><p class="wp-caption-text">Kompletny StackTrace</p></div>
<p style="text-align:justify;">
Różnica? Bogatszy StackTrace wskazujący na oryginalne miejsce powstania błędu &#8211; czyli prywatną metodę SomeMethod. Być może zagadnienie niektórym wydaje się trywialne, ale pamiętajcie &#8211; jeśli chcecie po prostu &#8220;pchnąć&#8221; wyjątek dalej, bez utraty informacji (ani opakowania go we własną klasę wyjątku &#8211; np. przekazując jako InnerException) używajcie samego &#8220;throw&#8221;. Oszczędzić może trochę pracy w przyszłości ;)
</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci%C4%87-wyj%C4%85tek-wy%C5%BCej-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci_C4_87-wyj_C4_85tek-wy_C5_BCej-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fthrow-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną'>Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/X9jgP8zo9es" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/</feedburner:origLink></item>
		<item>
		<title>MSSQL – porównywanie dat</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/sucYXsKpj1o/</link>
		<comments>http://andrzej.net.pl/index.php/2009/09/mssql-porownywanie-dat/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 19:18:08 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[mssql]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[datediff]]></category>
		<category><![CDATA[mssql porównanie dat]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=602</guid>
		<description><![CDATA[

Nie wiem jak Wy, ale ja zawsze miałem dylemat, gdy musiałem porównywać datę zapisaną w bazie z tą wysyłaną z procedury C#. Oczywiście mam na myśli porównywanie datetime z&#160;MSSQL z DateTime z&#160;C#. Objawiało się to nader często, gdy np. chciałem wyciągnąć z bazy &#8211; dajmy na to &#8211; zgłoszenia serwisowe z&#160;zakresu dat.
Zgłoszenia zapisywane były z [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/MSSQL-por%C3%B3wnywanie-dat" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/MSSQL-por_C3_B3wnywanie-dat?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fmssql-porownywanie-dat%2F" style="border:0px"/></a></p>
<p style="text-align:justify">
Nie wiem jak Wy, ale ja zawsze miałem dylemat, gdy musiałem porównywać datę zapisaną w bazie z tą wysyłaną z procedury C#. Oczywiście mam na myśli porównywanie datetime z&nbsp;MSSQL z DateTime z&nbsp;C#. Objawiało się to nader często, gdy np. chciałem wyciągnąć z bazy &#8211; dajmy na to &#8211; zgłoszenia serwisowe z&nbsp;zakresu dat.<br />
Zgłoszenia zapisywane były z pełną informacją (data i czas), w postaci:</p>
<pre>
2009-01-08 12:06:20
2009-01-12 13:59:58
2009-01-17 08:32:13
2009-01-21 09:10:14
2009-01-29 09:57:24
</pre>
<p><span id="more-602"></span><br />
Do procedury wysyłane były parametry:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@date_from <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'2009-01-08'</span><br />
@date_to <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'2009-01-12'</span></div></div>
<p>Zwykłe porównanie:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> &nbsp;<span style="color: #66cc66;">*</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> zgloszenia<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> data_zgloszenia <span style="color: #66cc66;">&gt;</span>@date_from <span style="color: #993333; font-weight: bold;">AND</span> data_zgloszenia <span style="color: #66cc66;">&lt;</span> @date_to</div></div>
<p>Zwróci nam &#8220;przekłamane&#8221; wyniki &#8211; nie takie, jakich byśmy się spodziewali:</p>
<pre>
2009-01-08 12:06:20
</pre>
<p style="text-align:justify">
Dlaczego? Dlatego, że nie wysyłając czasu wysyłamy nota bene: &#8220;2009-01-12 00:00:00&#8243;, co jest wcześniejsze niż wartość &#8220;2009-01-12 13:59:58&#8243;.<br />
Łatwo możemy pozbyć się problemu, używając funkcji <a href="http://msdn.microsoft.com/en-us/library/ms189794.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms189794.aspx?referer=');">DATEDIFF(datepart, startdate, enddate)</a>. Zachowuje się ona podobnie jak funkcje CompareTo w C#. Podajemy w pierwszym parametrze część daty, po której chcemy wykonać porównanie (u nas będzie to <em>day</em>) a w dwóch kolejnych parametrach &#8211; daty do porównania. Zastosowanie jest więc banalne:
</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> &nbsp;<span style="color: #66cc66;">*</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> zgloszenia<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> DATEDIFF<span style="color: #66cc66;">&#40;</span>day<span style="color: #66cc66;">,</span> data_zgloszenia<span style="color: #66cc66;">,</span> @date_from<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;=</span> 0 <span style="color: #993333; font-weight: bold;">AND</span> DATEDIFF<span style="color: #66cc66;">&#40;</span>day<span style="color: #66cc66;">,</span> data_zgloszenia<span style="color: #66cc66;">,</span> @date_to<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;=</span> <span style="color: #cc66cc;">0</span></div></div>
<p>Dzięki temu otrzymamy poprawne wyniki. Po prostu przy porównywaniu obcinany jest czas &#8211; brana pod uwagę jest tylko część przenosząca informację o dacie. Rezultat:</p>
<pre>
2009-01-08 12:06:20
2009-01-12 13:59:58
</pre>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/MSSQL-por%C3%B3wnywanie-dat" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/MSSQL-por_C3_B3wnywanie-dat?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fmssql-porownywanie-dat%2F" style="border:0px"/></a></p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/sucYXsKpj1o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/09/mssql-porownywanie-dat/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/09/mssql-porownywanie-dat/</feedburner:origLink></item>
		<item>
		<title>Własny validator w ASP.NET – CheckBoxListValidator</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/P0FG-1XVGQo/</link>
		<comments>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 22:18:58 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[checkboxlistvalidator]]></category>
		<category><![CDATA[custom validator]]></category>
		<category><![CDATA[walidacja checkboxlist]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=589</guid>
		<description><![CDATA[

W przedostatnim wpisie, poruszyłem temat napisania własnego walidatora do daty. Dziś napotkałem na podobny problem &#8211; walidacja kontrokli CheckBoxList pod kątem zaznaczenia przynajmniej jednej wartości. Jakieś było moje zaskoczenie ;-) gdy okazało się, że żadna z&#160;domyślnych kontrolek walidatorów nie potrafi tego niezmiernie skomplikowanego zadania wykonać ;-) Oczywiście można to załatwić banalnie: CustomValidator i odpowiednia prosta [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator'>Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/09/wylaczenie-validatora-w-asp-net-po-stronie-klienta/' rel='bookmark' title='Permanent Link: Wyłączenie validatora w ASP.NET po stronie klienta'>Wyłączenie validatora w ASP.NET po stronie klienta</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/W%C5%82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/W_C5_82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwlasny-validator-w-asp-net-%25e2%2580%2593-checkboxlistvalidator%2F" style="border:0px"/></a></p>
<p style="text-align:justify">
W przedostatnim wpisie, poruszyłem temat napisania <a href="http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/">własnego walidatora do daty</a>. Dziś napotkałem na podobny problem &#8211; walidacja kontrokli CheckBoxList pod kątem zaznaczenia przynajmniej jednej wartości. Jakieś było moje zaskoczenie ;-) gdy okazało się, że żadna z&nbsp;domyślnych kontrolek walidatorów nie potrafi tego niezmiernie skomplikowanego zadania wykonać ;-) Oczywiście można to załatwić banalnie: CustomValidator i odpowiednia prosta funkcja. Gdzie jednak ponowne wykorzystanie kodu &#8211; tak przecież przez nas wszystkich lubiane :) W kolejnym projekcie, na kolejnej stronie &#8211; nie będziemy przecież kopiować kodu.<br />
<span id="more-589"></span>
</p>
<p>W związku z tym, że większość kodu dla walidatorów jest wspólna (różnią się tylko funkcją EvaluateIsValid oraz kodem JS) nie będę zbyt mocno się rozpisywał. Oto kod:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> CheckBoxListValitator <span style="color: #008000;">:</span> BaseValidator<br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> ControlPropertiesValid<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> FindControl<span style="color: #000000;">&#40;</span>ControlToValidate<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CheckBoxList <span style="color: #008000;">!=</span> null<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> EvaluateIsValid<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>FindControl<span style="color: #000000;">&#40;</span>ControlToValidate<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CheckBoxList<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">SelectedItem</span> <span style="color: #008000;">!=</span> null<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnPreRender<span style="color: #000000;">&#40;</span>EventArgs e<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnPreRender</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>ControlPropertiesValid<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">EnableClientScript</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Page.<span style="color: #0000FF;">ClientScript</span>.<span style="color: #0000FF;">RegisterClientScriptResource</span><span style="color: #000000;">&#40;</span>GetType<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;WebControls.Resources.checkboxlist_validate.js&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Page.<span style="color: #0000FF;">ClientScript</span>.<span style="color: #0000FF;">RegisterExpandoAttribute</span><span style="color: #000000;">&#40;</span>ClientID, <span style="color: #666666;">&quot;evaluationfunction&quot;</span>, <span style="color: #666666;">&quot;validate_CBL&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div></div>
<p>Wszystko wygląda standardowo:</p>
<ul>
<li><strong>ControlPropertiesValid</strong> &#8211; sprawdzamy, czy kontrolka, której ID trzyma property ControlToValidate jest rzeczywiście kontrolką typu CheckBoxList</li>
<li><strong>EvaluateIsValid</strong> &#8211; sprawdzamy, czy jakikolwiek element został zaznaczony</li>
<li><strong>OnPreRender</strong> &#8211; podłączamy nasz kod do walidacji po stronie klienta</li>
</ul>
<p style="text-align:justify">
Kod do walidacji CheckBoxLista po stronie klienta również nie jest zbyt skomplikowany. CheckBoxList jest renderowany jako tabelka, w której komórki są zestawem: input typu checkbox + label z atrybutem for. Wystarczy więc pętlą &#8220;przelecieć&#8221; po wszystkich elementach tabelki typu checkbox i sprawdzić, czy którykolwiek z nich jest zaznaczony.</p>
<div id="attachment_594" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/09/plik020.jpg" rel="lightbox[589]"><img src="http://andrzej.net.pl/wp-content/uploads/2009/09/plik020-300x68.jpg" alt="CheckBoxList renderowany jako tabelka" title="CheckBoxList renderowany jako tabelka" width="300" height="68" class="size-medium wp-image-594" /></a><p class="wp-caption-text">CheckBoxList renderowany jako tabelka</p></div>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> validate_CBL<span style="color: #009900;">&#40;</span>sender<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> val <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>sender.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">controltovalidate</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> col <span style="color: #339933;">=</span> val.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;*&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> col.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col.<span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">tagName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;INPUT&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col.<span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p style="text-align:justify">
Gotowe. Nasz skrypt podłączamy tak jako ostatnio &#8211; w zasobach, rejestrując go w pliku AssemblyInfo.cs, w folderze Properties projektu. Jednocześnie oczywiście nie zapominamy o ustawieniu we właściwościah naszego pliku Build Action na Embedded Resource ;)</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&#91;</span>assembly<span style="color: #008000;">:</span> WebResource<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;WebControls.Resources.checkboxlist_validator.js&quot;</span>, <span style="color: #666666;">&quot;application/x-javascript&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span></div></div>
<p>Demo:<br />
<a href="http://asp.andrzej.net.pl/" onclick="pageTracker._trackPageview('/outgoing/asp.andrzej.net.pl/?referer=');">asp.andrzej.net.pl</a></p>
<p>Kod do pobrania:<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/W%C5%82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/W_C5_82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwlasny-validator-w-asp-net-%25e2%2580%2593-checkboxlistvalidator%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator'>Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/09/wylaczenie-validatora-w-asp-net-po-stronie-klienta/' rel='bookmark' title='Permanent Link: Wyłączenie validatora w ASP.NET po stronie klienta'>Wyłączenie validatora w ASP.NET po stronie klienta</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/P0FG-1XVGQo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/</feedburner:origLink></item>
		<item>
		<title>Wyłączenie validatora w ASP.NET po stronie klienta</title>
		<link>http://feedproxy.google.com/~r/Andrzejnetpl/~3/Ewh5GKPR774/</link>
		<comments>http://andrzej.net.pl/index.php/2009/09/wylaczenie-validatora-w-asp-net-po-stronie-klienta/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 07:32:15 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[asp.net validator disable client side]]></category>
		<category><![CDATA[wyłączenie validatora po stronie klienta]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=578</guid>
		<description><![CDATA[

Krótki, szybki poranny wpis ;-) Ostatnio pokazałem, jak napisać własny, prosty walidator w asp.net &#8211; działający po stronie klienta i serwera.
Czasem niektóre pola formularza są ukrywane za pomocą JavaScriptu &#8211; wtedy walidator nie powinien działać. On jednak nie wie, czy kontrolka została ukryta, czy nie.

Podejrzałem ostatnio podczas debugowania WebSite&#8217;u w VisualStudio skrypty, które są ładowane [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET – CheckBoxListValidator'>Własny validator w ASP.NET – CheckBoxListValidator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator'>Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/07/go-to-top-po-asynchronicznym-postbacku-w-updatepanelu/' rel='bookmark' title='Permanent Link: &#8220;Go to top&#8221; po asynchronicznym postbacku w UpdatePanelu'>&#8220;Go to top&#8221; po asynchronicznym postbacku w UpdatePanelu</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/Wy%C5%82%C4%85czenie-validatora-w-ASPNET-po-stronie-klienta-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Wy_C5_82_C4_85czenie-validatora-w-ASPNET-po-stronie-klienta-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwylaczenie-validatora-w-asp-net-po-stronie-klienta%2F" style="border:0px"/></a></p>
<p style="text-align:justify">
Krótki, szybki poranny wpis ;-) Ostatnio pokazałem, jak napisać własny, prosty walidator w asp.net &#8211; działający po stronie klienta i serwera.<br />
Czasem niektóre pola formularza są ukrywane za pomocą JavaScriptu &#8211; wtedy walidator nie powinien działać. On jednak nie wie, czy kontrolka została ukryta, czy nie.<br />
<span id="more-578"></span><br />
Podejrzałem ostatnio podczas debugowania WebSite&#8217;u w VisualStudio skrypty, które są ładowane jako WebResource do konkretnej strony:
</p>
<div id="attachment_583" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/09/ScreenShot0071.jpg" rel="lightbox[578]"><img src="http://andrzej.net.pl/wp-content/uploads/2009/09/ScreenShot0071-300x106.jpg" alt="Debugowanie skryptów w VisualStudio" title="Debugowanie skryptów w VisualStudio" width="300" height="106" class="size-medium wp-image-583" /></a><p class="wp-caption-text">Debugowanie skryptów w VisualStudio</p></div>
<p style="text-align:justify">
Polecam każdemu zapoznanie się z zawartością chociaż raz. Okazuje się, że Microsoft dostarcza nam wielu przydatnych funkcji, wśród których jest m.in.:
</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> ValidatorEnable<span style="color: #009900;">&#40;</span>val<span style="color: #339933;">,</span> enable<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
...<br />
<span style="color: #009900;">&#125;</span></div></div>
<div id="attachment_580" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/09/ScreenShot008.png" rel="lightbox[578]"><img src="http://andrzej.net.pl/wp-content/uploads/2009/09/ScreenShot008-300x206.png" alt="Funkcja JS dostarczona przez MS" title="Funkcja JS dostarczona przez MS" width="300" height="206" class="size-medium wp-image-580" /></a><p class="wp-caption-text">Funkcja JS dostarczona przez MS</p></div>
<p style="text-align:justify">
Pozwala ona na proste wyłączenie / włączenie konkretnego walidatora. Wystarczy przekazać jej uchwyt do kontrolki walidatora. Dzięku wykorzystaniu tej funkcji możemy dopisać jedną linię do naszego kodu ukrywającego walidowaną kontrolkę i wszystko zacznie nabierać sensu ;-)
</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/Wy%C5%82%C4%85czenie-validatora-w-ASPNET-po-stronie-klienta-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Wy_C5_82_C4_85czenie-validatora-w-ASPNET-po-stronie-klienta-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwylaczenie-validatora-w-asp-net-po-stronie-klienta%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET – CheckBoxListValidator'>Własny validator w ASP.NET – CheckBoxListValidator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator'>Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/07/go-to-top-po-asynchronicznym-postbacku-w-updatepanelu/' rel='bookmark' title='Permanent Link: &#8220;Go to top&#8221; po asynchronicznym postbacku w UpdatePanelu'>&#8220;Go to top&#8221; po asynchronicznym postbacku w UpdatePanelu</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://mitcho.com/code/yarpp/' onclick="pageTracker._trackPageview('/outgoing/mitcho.com/code/yarpp/?referer=');">wtyczkę Yet Another Related Posts</a>.</p><img src="http://feeds.feedburner.com/~r/Andrzejnetpl/~4/Ewh5GKPR774" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/09/wylaczenie-validatora-w-asp-net-po-stronie-klienta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://andrzej.net.pl/index.php/2009/09/wylaczenie-validatora-w-asp-net-po-stronie-klienta/</feedburner:origLink></item>
	</channel>
</rss>
