Archive for December, 2010

Prawda o SqlCommand.Parameters

Czy zastanawialiście się kiedyś jak dodawać parametry do SqlCommand? Klasa ta zawiera pole Parameters typy SqlParameterCollection, na którym możemy wykonać między innymi metodę AddWithValue(string, object). W internecie jak i w dokumentacji w nazwach parametrów na początku jest zawsze użyty znak “@”.

Przy okazji jednego z projektów musiałem odpowiedzieć sobie na pytanie: Czy muszę zadbać o “@” przy nazwie parametru? Nie zastanawiając się długo postanowiłem, zgodnie duchem empiryzmu, sprawdzić co się stanie w poszczególnych sytuacjach.

Baza danych.

Dla testów mała baza danych z jedną procedurą pobierającą dwa parametry:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE DATABASE SqlCmdParametersTest
USE [SqlCmdParametersTest]
CREATE PROCEDURE [dbo].[spTest]
	@Param1 INT,
	@Param2 INT
AS
BEGIN
	SET NOCOUNT ON;
	SELECT
 		@Param1 Col1,
		@Param2 Col2END
GO
-- TEST
EXEC [dbo].[spTest] 1, 2
EXEC [dbo].[spTest] @Param1=1, @Param2=2
EXEC [dbo].[spTest] @Param2=1, @Param1=2

Aplikacja testowa

Teraz nie pozostaje nic innego jak przygotować małą aplikację konsolową, która skorzysta z tej procedury. Wiadomo, że podstawowym sposobem dodawania parametrów jest użycie “@” na początku nazwy, zatem będzie to pierwszy sposób użycia. Jako drugi przypadek weźmiemy parametr bez tego znaku. Czy to wszystkie możliwości? Nie – można to przecież jeszcze połączyć i użyć raz z “@” a raz bez – ot tak, żeby było trudniej. Zatem do dzieła:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Data;
using System.Data.SqlClient;
 
namespace SqlCmdParametersTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection sqlConn = new SqlConnection(@"Data Source=localhost;Initial Catalog=SqlCmdParametersTest;Integrated Security=SSPI;Persist Security Info=true"))
            {
                sqlConn.Open();
                using (SqlCommand sqlCmd = new SqlCommand())
                {
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.Connection = sqlConn;
                    sqlCmd.CommandText = "[dbo].[spTest]";
 
                    //call with @
                    Console.WriteLine("With @");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("@Param1", 1);
                    sqlCmd.Parameters.AddWithValue("@Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
 
                    //call without @
                    Console.WriteLine("Without @");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("Param1", 1);
                    sqlCmd.Parameters.AddWithValue("Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
 
                    //call mixed
                    Console.WriteLine("Mixed");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("@Param1", 1);
                    sqlCmd.Parameters.AddWithValue("Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
                }
            }
 
            Console.ReadLine();
        }
 
        private static void ReadResult(SqlDataReader reader)
        {
            if (reader.Read())
            {
                Console.WriteLine("Result:");
                Console.WriteLine("{0} {1}", reader["Col1"], reader["Col2"]);
            }
            else
            {
                Console.WriteLine("Result is empty");
            }
        }
    }
}

Wynik dziąłania aplikacji widać na rysunku poniżej:

SqlCmdParametersTestResult

Jak widać wynik jest zgodny z oczekiwaniami – wszystko działa poprawnie, nawet “mix”. Warto jeszcze sprawdzić co dociera do SQL Servera, bo może to on jest tą “sprytną stroną”… Po uruchomieniu SQL Profilera widzimy, że jednak krok ku wygodzie a przede wszystkim swobodzie jest po stronie .NET Framework.

SqlCmdParametersTestSqlProfiler

Wniosek

Z SqlCommand.Parameters można korzystać swobodnie i bez martwienia się o “@” lub jej brak.

Paczka do pobrania


Czas podsumować rok 2010

Wielkimi krokami zbliża się koniec roku 2010, zatem trzeba by go z tej okazji podsumować… Chciałem podzielić ten post na dwie części – praca i po pracy, ale na dobrą sprawę, to w pracy nie dużo się zmieniło – pracuję w toruńskim oddziale QXL. Inne jest tylko miejsce, gdyż jakiś czas temu zmieniliśmy siedzibę na większą. Podobnie jak poprzednio siedzę w bardzo fajnym pokoju, z dużą ilością światła (czasem trochę zbyt dużą, bo mamy bardzo pokaźne okno 😛 ), zatem przeprowadzkę uznaję za sukces :)

Dużo więcej zmian można zaobserwować w działalności poza pracą. Zacznijmy od samego początku.

W tym roku postanowiłem zmigrować bloga na nową domenę i własny hosting. Plusem jest na pewno większa kontrola niż w stosunku do live.spaces.com, które niedługo przestaną funkcjonować. Opublikowałem w sumie 60 posów – całkiem nieźle moim zdaniem. Tematyka różna, choć najwięcej poświęconych było Windows Communication Foundation. Od momentu uruchomienia statystyk (2010-10-11) mam ponad 3000 odsłon. Dziękuję wszystkim odwiedzającym i mam nadzieję, że będziecie odwiedzać mnie jeszcze częściej.

W tym roku w ramach TGD.NET poprowadziłem trzy prezentacje. O zwinnych metodykach (SCRUM), o wzorcu Service Oriented Architecture (SOA + .NET = WCF) oraz awaryjna prezentacja o Windows Phone7. Dlaczego awaryjna? Z powodu nagłych i obfitych opadów śniegu na początku grudnia jeden z prelegentów nie mógł do nas dotrzeć. Szybka ankieta z jednym pytaniem: “Chcecie posłuchać o WP7?” – na sali las rąk :)
W maju wspólnymi siłami zorganizowaliśmy Visual Studio 2010 Community Launch zakończone sukcesem dzięki wytężonej pracy całego zespołu. Po drodze zostałem zaproszony na Toruński Dzień Informatyka z prezentacją o Silverligth, a Artur Boryczko zaproponował poprowadzenie sesji na IT Academic Day na PJWSTK, gdzie postanowiłem podjąć tematykę SOA i WCF.

Największym jednak osiągnięciem w dziedzinie prowadzenia prezentacji był mój udział, a w rezultacie wygrana w konkursie Speaker Idol odbywającym się w ramach Microsoft Technology Summit.

W tym roku przysiadłem też trochę do projektów, które możecie znaleźć na dedykowanej stronie mojego bloga. Przygotowałem ShipBattleChallenge, MassMail oraz Windows Phone 7 Accelerometer Emulator,  który to spotkał się z dużym zainteresowaniem wśród deweloperów WP7.

Zaktywizowałem się również jeżeli chodzi o pisanie. Od września przygotowuję cykl artykułów poświęcony Windows Communication Foundation, który możecie znaleźć na portalu codeguru.pl. Ich aktualna lista znajduje się na stronie Artykuły i publikacje. Na dzień dzisiejszy artykuły te mają sporo ponad 10000 odsłon!

Idąc krok dalej postanowiłem również spróbować swoich sił na CodeProject.com opisując wymieniony wyżej emulator akcelerometru, który w ciągu dwóch tygodni odwiedziło prawie 4000 czytelników.

Jak widać trochę się działo, i mam nadzieję, że będzie się dziać również w 2011 roku: w planach webcasty, organizacja konferencji, prelekcje (w tym MTS oraz Silesian CodeCamp), artykuły, książka(i).

Jednocześnie z tego miejsca chciałbym złożyć wam życzenia na nadchodzący rok:

Aby każda chwila przy ekranie monitora była związana z pasją tworzenia i zdobywania wiedzy, a przede wszystkim dobrą zabawą, która z tego płynie. Żeby codziennie móc do siebie powiedzieć – jestem zadowolona/zadowolony z dzisiejszego dnia.


Windows Phone 7 Accelerometer Emulator

Windows Phone 7 Accelerometer Emulator
W dziale projektów dodałem najnowszy projekt, który ma na celu ułatwienie tworzenia aplikacji opartych o akcelerometr. Jak wiadomo emulator WP7 nie wspiera takiej funkcjonalności, dlatego postanowiłem przygotować odpowiedni projekt, który pozwala uporać się z tym problemem bez wykorzystania dodatkowych urządeń.

Aby z niego skorzystać wystarczy dosłownie kilka linijek kodu:

1
2
3
4
5
6
7
8
9
10
11
var acc = new WP7AccelerometerProvider();
acc.ReadingChanged += OnAccelerometerProviderReadingChanged;
 
try
{
    acc.Start();
}
catch (Exception exc)
{
    //txtblk.Text = exc.Message;
}

oraz obsłużenie pojawienia się nowych informacji:

1
2
3
4
5
private void OnAccelerometerProviderReadingChanged(object sender, WP7AccelerometerReadingEventArgs args)
{
    //do what you want with data
    ProcessAccelerometerData(args.X, args.Y, args.Z, args.Timestamp);
}

Przykładowy screen wykorzystania emulatora:

WP7 Accelerometer Emulator UI

Jest to pierwsza wersja emulatora, jednakże w wolnym czasie będę starał się ją rozwijać o czym możecie przeczytać na stronach:

Strona projektu w języku polskim
Strona projektu w języku angielskim


Bezpieczeństwo aplikacji ASP.NET oraz MVC3 na TGD.NET

Toruńska Grupa Deweloperów .NET ma przyjemność zaprosić na 24 spotkanie podczas którego odbędą się dwie prezentacje:

Piotr Buler poprowadzi: “Bezpieczeństwo aplikacji ASP.NET”

O czym będzie:
Prezentacja wprowadzająca w tematykę bezpieczeństwa, przedstawiająca podstawowe zagadnienia i sprawy z nim związane (1. część) oraz pokazująca mechanizmy pozwalające tworzyć bezpieczne aplikacje w ASP.NET Framework (2. część). Wybrane przykłady ataków (np. SQL Injection) “na osłodę” teoretycznej części spotkania.
Agenda:

  1. Bezpieczeństwo – ogólny zarys (security overview) (1. cz.)
  2. Dlaczego jesteśmy potencjalną ofiarą ataku?
  3. Szyfrowanie (data encryption)
  4. Zabezpieczenia w platformie .NET (2. cz.)
  5. Wybrane przykłady ataków

O prelegencie:
Piotr Adam Buler – student informatyki na WMiI UMK. Zainteresowania:

  • tworzenie aplikacji webowych
  • bezpieczeństwo w internecie

Ireneusz Koszek poprowadzi: “Umarł król (MVC2) niech żyje król (MVC3)”

O czym będzie:
Podczas prezentacji poruszone będą tematy nowości jakie niesie ze sobą najnowsze wcielenie ASP.NET MVC.
Agenda:

  1. krótki wstęp do MVC
  2. razor view engine – nowy view engine by microsoft
  3. lepsze wsparcie dla javascript – remote validation, unobtrusive java script, wbudowane wsparcie dla JSON’a
  4. partial page caching
  5. nowy zestaw helperów (facebook, bing, google analytics, Chart(), WebGrid(), Crypto(), WebMail(), itd)
  6. nowe atrybuty
  7. sessionless controllers
  8. global filters
  9. dynamic ViewModel
  10. nowe ActionResult (HttpNotFoundResult, PermanentRedirectResult, HttpStatusCodeResult)
  11. nowe możliwości automatycznej walidacji modelu
  12. NuGet package manager – package manager dla ASP.NET
  13. lepsza integracja z IoC containers, extensibility points

Dodatkowo:
W związku z przygotowaniami do organizacji przez TGD.NET konferencji na temat aplikacji i gier na urządzenia mobilne wszystkich zainteresowanych pomocą w ogranizacji zapraszamy na małą pogawędkę na ten temat w mniej oficjalnej atmosferze w jednym z toruńskich klubów.
Jeżeli nie możesz przybić, a chcesz pomóc przy organizacji możesz łatwo się z nami skontaktować (na przykład odpowiadając na tego maila).

Gdzie i kiedy:
Spotkanie odbędzie się 14 grudnia od godziny 17:00 w SALI S3 na Wydziale Matematyki i Informatyki UMK (ul. Chopina 12/18) . Wstęp na wykład jest wolny. Rejestracja na spotkanie jest obowiązkowa.
(Link dla osób korzystających z Codeguru: Rejestracja na spotkanie)


ASP.NET Button i jQuery dialog

jQuery jak zapewne każdy wie jest bardzo przydatnym i użytecznym narzędziem. jQuery UI to zestaw wtyczek (możemy je nazwać kontrolkami), które pozwalają na szybkie “upiększenie” naszej strony. Okazuje się jednak, że bywają pewne kolizje na drodze jQuery UI i ASP.NET. Przykładem może tu być wykorzystanie pluginu “dialog” dla kontenerów (np. div) zawierających przyciski ASP:Button.

<div id="dialogDiv">
   Dialog content
   <asp:Button id="btnDoSomething" runat="server" Text="Do something" onclick="btnDoSomething_click"/>
</div>

Okazuje się, że gdy chcemy wykonać $(“#dialogDiv”).dialog(‘open’); to niestety przycisk, który się znajduje w wyskakującym okienku przestaje działać. Aby tego uniknąć musimy dodać wykorzystać poniższy kawałek kodu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function showjqdialog(){
   jQuery(document).ready(function() {
      var dlg = $("#dialogDiv").dialog({
            modal: true,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
             },
           width:500
      });
      dlg.parent().appendTo(jQuery("form:first"));
      dlg.dialog('open');
   });
}

Najważniejszy fragment to ustawienie rodzica naszego okienka na formularz dokumentu tak, aby mógł on przejąć akcję przycisku. Chodzi tu oczywiście o fragment:

1
dlg.parent().appendTo(jQuery("form:first"));

Dodatkowo pokazanie okna dialogowego najlepiej jest wykonać w momencie gdy dokument jest już w pełni załadowany. Chodzi tu oczywiście o fragment jQuery(document).ready(function() {…});

Dla dopełnienia informacji na temat jQuery UI dialog i działania z ASP.NET kilka słów na temat jak go uruchomić warunkowo z code behind. Otóż w metodzie obsługującej kliknięcie przycisku dodajemy:

1
2
3
if(showDialogCondition){
   ClientScript.RegisterStartupScript(Page.GetType(), "dialogscript", "<script type="\"text/javascript\""><!--mce:0--></script>");
}

Dzięki temu podczas ładowania strony zostanie doładowany kawałek skryptu odpowiedzialny za pokazanie okna dialogowego. Pamiętając o tym, że czekamy w funkcji showjqdialog() na załadowanie dokumentu mamy pewność o poprawnym działaniu kodu.


Mój artykuł na codeguru.pl – WCF w praktyce. Część 6 – Wiązania (binding)

Po nieco dłuższej przerwie przyszedł czas na kolejną odsłonę cyklu poświęconego pracy z Windows Communication Foundation. Tym razem na warsztat trafiły wiązania (ang. bindings). Oczywiście jest to preludium możliwości jakie niosą za sobą wiązania, jednakże bez opowiedzenia o nich cykl mijałby się z celem.

Następny temat dotyczy punktów końcowych i ich adresów, co pozwoli domknąć kwestie nakreślenia kierunku, w którym należy podążać siadając do technologii WCF. W dalszej kolejności przedstawię natomiast nowości jakie przyniosła nowa odsłona .NET Framework w kontekście Windows Communication Foundation. Gorąco zapraszam do lektury całego cyklu.

Bezpośredni link do artykułu.


Spotkajmy się: ITAD na PJWSTK

Już w najbliższą środę zapraszam was na moją sesję poświęconą architekturze SOA (ang Service Oriented Architecture) oraz technologii WCF. Prezentację poprowadzę w ramach IT Academic Day na Polsko Japońskiej Wyższej Szkole Technik Komputerowych w Warszawie i będzie miała ona tytuł “SOA + .NET = WCF“.

Pozostali prelegenci to Daniel Dudek, Tomasz Wiśnieski, Tobiasz Koprowski i Paweł Lipiński, zatem naprawdę watro przyjść i posłuchać! Gorąco zapraszam!

Jeżeli nie możecie się pojawić podczas konferencji ma być udostępniony live streaming, co pozwoli dostrzeć do jeszcze większej liczby odbiorców niż tak, którą pomieści aula. Na tych, którzy zdecydują się przyjść czekają atrakcyjne nagrody, wśród których jest XBOX 360 + Kinect! Oj będzie sie działo…

Szczegółowe informacje znajdziecie na stronie konferencji.


  • O mnie

    Maciej Grabek

    Moje profile na:

    MVP

    Codeguru.pl GoldenLine
    Twitter CodeProject

  • english version
  • Polecam

  • Copyright © Maciej Grabek. All rights reserved.
    Powered by WordPress
    %d bloggers like this: