Windows Azure laboratorium 2016 K.M. Ocetkiewicz, T. Goluch

Podobne dokumenty
Windows Azure laboratorium 2013 K.M. Ocetkiewicz, T. Goluch

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Zaawansowane aplikacje internetowe - laboratorium

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Leszek Stasiak Zastosowanie technologii LINQ w

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Instrukcja instalacji i konfiguracji bazy danych SQL SERVER 2008 EXPRESS R2. Instrukcja tworzenia bazy danych dla programu AUTOSAT 3. wersja 0.0.

Programowanie aplikacji przetwarzających w chmurze. Bazy danych.

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Systemy baz danych Prowadzący: Adam Czyszczoń. Systemy baz danych. 1. Import bazy z MS Access do MS SQL Server 2012:

Instrukcja laboratoryjna

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Zaawansowane użycie Azure Storage. Ewa Baćmaga Integral Technologies

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Założenia do ćwiczeń: SQL Server UWM Express Edition: \SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Projektowanie systemów baz danych

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Dr Michał Tanaś(

Ref. 7 - Język SQL - polecenia DDL i DML

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Db4o obiektowa baza danych wersja.net

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Język SQL, zajęcia nr 1

Wykład 5: PHP: praca z bazą danych MySQL

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Programowanie obiektów

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Biuletyn informacyjny WeriOn. 3/2015 Instrukcja konfiguracji połączenia z programem Subiekt GT r.

CREATE USER

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Zaawansowane aplikacje internetowe laboratorium REST

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Procedury techniczne modułu Forte Kontroling. Pakiety DTS

Instalacja SQL Server Express. Logowanie na stronie Microsoftu

Wykład 6 Dziedziczenie cd., pliki

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Database Connectivity

Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości

Informatyka Ćwiczenie 10. Bazy danych. Strukturę bazy danych można określić w formie jak na rysunku 1. atrybuty

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA

Program RMUA. Instrukcja konfiguracji i pracy w programie. (Wersja 2)

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

VComNet Podręcznik użytkownika. VComNet. Podręcznik użytkownika Wstęp

Instrukcja instalacji Control Expert 3.0

SERWER AKTUALIZACJI UpServ

Tworzenie i wykorzystanie usług sieciowych

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Autor: Joanna Karwowska

Podstawy technologii WWW

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Wprowadzenie do Doctrine ORM

Platformy Programowania

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

System. Instalacja bazy danych MySQL. Autor : Piotr Zielonka tel Piotrków Tryb., sierpień 2018r.

Oracle PL/SQL. Paweł Rajba.

Instalacja MySQL.

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Instrukcja użytkownika. Aplikacja dla WF-Mag

Podstawowe wykorzystanie Hibernate

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Microsoft.NET: Warstwa dostępu do danych (DAL) w aplikacjach ASP.NET Web Forms

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

R o g e r A c c e s s C o n t r o l S y s t e m 5

dziennik Instrukcja obsługi

Instrukcja użytkownika. Aplikacja dla Comarch ERP XL

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

Konfiguracja oprogramowania w systemach MS Windows dla kont z ograniczonymi uprawnieniami

Zadanie 3. Tworzenie i odnajdowanie obiektów w Active Directory

Konfiguracja oprogramowania w systemach MS Windows dla kont z ograniczonymi uprawnieniami

Ćwiczenia 2 IBM DB2 Data Studio

AKTYWNY SAMORZĄD. Instrukcja instalacji, aktualizacji i konfiguracji.

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Specyfikacja API Runtime BAS 3.0

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Aplikacje WWW - laboratorium

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Zapytania i wstawianie etykiet z bazy danych do rysunku

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

PROJEKTOWANIE APLIKACJI INTERNETOWYCH

Podstawy programowania III WYKŁAD 2

Transkrypt:

Windows Azure laboratorium 2016 K.M. Ocetkiewicz, T. Goluch 1. Wstęp Windows Azure jest przykładem usługi, popularnie nazywanej chmurą. W modelu tym dostajemy do dyspozycji pewne środowisko obejmujące elementy takie jak maszyny wirtualne, bazy danych, przestrzeń na dane, szynę komunikacyjną itp. Z jednej strony rozwiązanie to ma zalety nie musimy administrować fizycznymi komputerami, martwić się o ich wydajność i skalowalność naszej aplikacji (zawsze możemy zażyczyć sobie większej liczby maszyn), z drugiej jednak strony środowisko to narzuca pewne ograniczenia co do modelu programistycznego, a każdy element środowiska jest odpowiednio wyceniony i użycie go kosztuje (i to niemało) co powoduje, że Azure znajdzie raczej zastosowanie w dużych, komercyjnych projektach. Projekty korzystające z Azure tworzymy wybierając nowy projekt Templates Visual C# Cloud Azure Cloud Service. Większość API Azure korzysta z HTTP i w związku z tym błędy opisane są w sposób zaczerpnięty z tego protokołu. Na przykład, próba dostępu do nieistniejącego zasobu zakończy się błędem 404 Not found a próba utworzenia kontenera o nieprawidłowej nazwie skutkuje błędem 400 Bad Request. Dodatkowa literatura: Introducing Windows Azure http://www.windowsazure.com/en-us/develop/net/fundamentals/intro-to-windows-azure/?fb=pl-pl Windows Azure Execution Models http://www.windowsazure.com/en-us/develop/net/fundamentals/compute/?fb=pl-pl Windows Azure Technical Documentation http://msdn.microsoft.com/en-us/library/windowsazure/dd163896.aspx Kalkulator kosztów http://www.windowsazure.com/pl-pl/pricing/calculator/ 2. Usługa WCF Zbudowanie usługi WCF w środowisku Azure wymaga jedynie dodania do projektu roli WCF Service Role (prawym przyciskiem myszy na projekcie, New Web Role Project... i WCF Web Service Role (lub dodania jej od razu podczas tworzenia projektu). Serwis tworzymy tak samo, jak serwis hostowany na poprzednich laboratoriach. Możemy go także przetestować narzędziem WCFTestClient. Szczegóły dotyczące endpointu możemy ustawić wybierając właściwości naszej roli WCF (w poddrzewie Roles naszego projektu w Solution Explorer) i przechodząc do zakładki Endpoints. 3. Tabele Tabele są pojemnikami na nierelacyjne dane, zawierające jednak pewną strukturę. Tabela jest kolekcją encji, zaś encja (odpowiednik wiersza tabeli w SQL) jest kolekcją właściwości w postaci par klucz-wartość. Tabela nie wymusza struktury każda encja w tabeli może mieć inny zbiór kluczy. Encja może posiadać do 252 właściwości. Jej całkowity rozmiar nie może przekraczać 1MB. Każda encja identyfikowana jest przez klucz główny (RowKey, typu String), który musi być unikatowy w ramach węzła. Dodatkowo posiada także klucz partycji (PartitionKey, typu String) encje o takim samym kluczu partycji przechowywane będą w tym samym węźle (maszynie) oraz znacznik czasu (Timestamp). Wartości przypisane do kluczy mogą mieć następujące typy: Binary (tablica bajtów, maksymalnie 64KB), Bool, DateTime, Double, GUID, Int, Int64, String (maksymalnie 64KB). sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 1

Dostęp do tabel możliwy jest poprzez Storage Account. Wszystkie tabele zawarte w jednym Storage Account nie mogą przekraczać łącznie 100TB. Aby skorzystać z tabeli, musimy dodać referencje do System.Data.Services.Client oraz Microsoft.WindowsAzure.Storage lub Microsoft.WindowsAzure.Storage.Table (w zależności od wersji Azure SDK, w przypadku starszych wersji może także wystąpić konieczność doinstalowania do projektu pakiet OData (należy wyszukać ODataLib poprzez Manage NuGetPackages... lub wydać polecenie install-package Microsoft.Data.OData -Version 5.0.2 w konsoli menedżera pakietów). Następnie musimy zdefiniować klasę, która będzie reprezentowała nasze dane. Powinna ona dziedziczyć po klasie TableEntity oraz posiadać bezparametrowy konstruktor. Pola, które mają być zapamiętane w tabeli muszą być właściwościami dostępnymi publicznie (także do zapisu). public class TestEntity: TableEntity public TestEntity(string rk, string pk) this.partitionkey = pk; // ustawiamy klucz partycji this.rowkey = rk; // ustawiamy klucz główny // this.timestamp; jest tylko do odczytu public TestEntity() public string s get; set; public int i get; set; Dostęp do konkretnej tabeli uzyskujemy poprzez referencję: // w przypadku rzeczywistego Azure //var accountname = "konto"; //var key = "hasło"; //var credentials = new StorageCredentials(accountName, key); //var account = new CloudStorageAccount(credentials, true); // true jeżeli HTTPS // w przypadku emulatora var account = CloudStorageAccount.DevelopmentStorageAccount; CloudTableClient cl = account.createcloudtableclient(); var table = cl.gettablereference(nazwatabeli); table.createifnotexists(); // utworzenie tabeli jeżeli nie istnieje //table.deleteifexists(); // usunięcie tabeli gdy istnieje Nazwa tabeli musi zaczynać się od litery. Może ona zawierać od 2 do 63 znaków, wyłącznie alfanumerycznych. Wielkość liter nie jest brana pod uwagę. Podejrzeć zawartość utworzonych tabel możemy w Server Explorer z menu View i rozwijając drzewo Windows Azure Storage. Dodanie nowej encji do tabeli wymaga utworzenia operacji wstawienia, przekazania jej encji do wstawienia i wykonania operacji na tabeli: var e = new TestEntity(key, partitionkey); TableOperation op = TableOperation.Insert(e); t.execute(op); Operacje wstawiania możemy łączyć w paczki do 100 encji. Wykonanie paczki operacji ma postać: TableBatchOperation batchoperation = new TableBatchOperation(); batchoperation.insert(new TestEntity(key1, partitionkey1));... batchoperation.insert(new TestEntity(keyn, partitionkeyn)); table.executebatch(batchoperation); Podobnie wygląda pobranie danych z tabeli w przypadku pojedynczej encji (w przypadku braku szukanej encji Result będzie miało wartość null): TableOperation op = TableOperation.Retrieve<TestEntity>(pk, k); var res = t.execute(op); TestEntity e = (TestEntity)res.Result; sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 2

lub wybranych encji: pkey = "kluczpartycji"; rkey = "kluczwiersza"; TableQuery<TestEntity> query = new TableQuery<TestEntity>().Where(TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, pkey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rkey))); foreach (TestEntity e in table.executequery(query)) Console.WriteLine("0, 1", e.partitionkey, e.rowkey); Dostępne są także operacje usuwania (TableOperation.Delete), modyfikacji (TableOperation.Replace), dodania lub modyfikacji (TableOperation.InsertOrReplace). Wszystkie one pobierają encję jako argument. How to use the Table Storage Service https://azure.microsoft.com/pl-pl/documentation/articles/storage-dotnet-how-to-use-tables/ Azure Storage Naming Rules https://blogs.msdn.microsoft.com/jmstall/2014/06/12/azure-storage-naming-rules/ 4. BLOBy BLOBy (Binary Large Object) umożliwiają przechowywanie w ramach Storage dużych danych binarnych. Rozmiar BLOBa blokowego jest ograniczony przez 200GB, maksymalny rozmiar BLOBa stronicowanego (który jest efektywniejszy w przypadku częstych modyfikacji zawartości) to 1TB. Dostęp do BLOBów jest możliwy jest poprzez Storage Account. Tak jak encje przechowywane są w tabelach, tak BLOBy podzielone są na kontenery. Nazwa kontenera powinna: - zwierać tylko małe litery, cyfry i minusy, - nie może rozpoczynać się ani kończyć minusem ani zawierać dwóch kolejnych minusów, - mieć długość od 3 do 63 znaków. Nazwy BLOBów z kolei, mogą mieć od 1 do 1024 znaków i zawierać wszystkie znaki dostępne w adresach URL. Nie powinny jednak kończyć się kropką, ukośnikiem ( / ) ani żadną ich kombinacją. Nie powinny też zawierać odwróconego ukośnika ( \ ). Dostęp do danych mamy poprzez strumienie zapisując dane do BLOBa podajemy strumień z danymi, odczytując podajemy strumień, do którego dane mają zostać zapisane. // account utworzone jak w przypadku tabel CloudBlobClient client = account.createcloudblobclient(); CloudBlobContainer container = client.getcontainerreference(nazwakontenera); container.createifnotexists(); // pobranie referencji do blokowego BLOBa var blob = container.getblockblobreference(nazwabloba); // null gdy nie istnieje // zapisanie strumienia do BLOBa var bytes = new System.Text.ASCIIEncoding().GetBytes(value)); var s = new System.IO.MemoryStream(bytes); blob.uploadfromstream(s); // odczytanie bloba do strumienia sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 3

var s2 = new System.IO.MemoryStream(); blob.downloadtostream(s2); string content = System.Text.Encoding.UTF8.GetString(s2.ToArray()); // usunięcie blob.delete(); blob.deleteifexists(); // lista BLOBów string lst = ""; foreach (IListBlobItem item in container.listblobs(null, false)) if (item.gettype() == typeof(cloudblockblob)) CloudBlockBlob blob = (CloudBlockBlob)item; lst += String.Format("Block blob of length 0: 1", blob.properties.length, blob.uri) + "\n"; else if (item.gettype() == typeof(cloudpageblob)) CloudPageBlob pageblob = (CloudPageBlob)item; lst += String.Format("Page blob of length 0: 1", pageblob.properties.length, pageblob.uri) + "\n"; else if (item.gettype() == typeof(cloudblobdirectory)) CloudBlobDirectory directory = (CloudBlobDirectory)item; lst += String.Format("Directory: 0", directory.uri) + "\n"; How to use the Windows Azure Blob Storage Service in.net https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/ Understanding Block Blobs and Page Blobs http://msdn.microsoft.com/en-us/library/windowsazure/ee691964.aspx 5. Kolejki Kolejki są kolejnym mechanizmem przechowywania lub przekazywania danych w ramach Storage Account. Kolejka jest typową kolejką FIFO (First In First Out), w której przechowujemy wiadomości. Zawartością wiadomości może być napis lub tablica bajtów. Rozmiar pojedynczej wiadomości jest ograniczony przez 64KB zaś liczbę wiadomości ogranicza limit rozmiaru Storage (100TB). Korzystanie z kolejki wpisuje się w schemat wyznaczony przez tabele i BLOBy pobieramy referencję a następnie z niej korzystamy. Dodatkowo, potrzebujemy jeszcze przestrzeni nazw Microsoft.WindowsAzure.Storage.Queue. Nazwa kolejki ma takie same ograniczenia jak nazwa kontenera. // account utworzone jak pooprzednio CloudQueueClient client = account.createcloudqueueclient(); CloudQueue queue = client.getqueuereference(nazwakolejki); // utworzenie kolejki queue.createifnotexists(); // usunięcie kolejki queue.delete(); queue.deleteifexists(); // wysłanie wiadomości sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 4

var msg = new CloudQueueMessage( wiadomość ); queue.addmessage(msg); Zerknięcie (ang. peek) jest operacją zwracającą nam pierwszą wiadomość w kolejce. Wiadomość ta nie jest jednak usuwana. Jeżeli kolejka jest pusta, rezultatem będzie null. // zerknięcie na wiadomość var msg2 = queue.peekmessage(); Odebranie wiadomość jest operacją dwufazową. Metoda GetMessge zwraca nam wiadomość (lub null gdy kolejka jest pusta), Operacja ta powoduje, że wiadomość staje się chwilowo (domyślnie przez 30 sekund, czas ten można zmodyfikować dodając parametr do GetMessage) niewidoczna. W tym czasie należy wiadomość usunąć, inaczej środowisko stwierdzi, że obsługa wiadomości nie powiodła się i wiadomość wróci do kolejki (aby można było ją jeszcze raz obsłużyć). // odebranie wiadomości var msg3 = queue.getmessage(); queue.deletemessage(msg3); // odebranie grupy wiadomości wiadomości IEnumerable<CloudQueueMessage> lst = queue.getmessages(10); // liczba wiadomości foreach(var m in lst) queue.deletemessage(m); Wiadomości posiadają następujące pola: AsString - zawartość wiadomości jako napis AsBytes - zawartość wiadomości jako tablica bajtów ExpirationTime - czas życia wiadomości (kiedy przestanie być aktualna) InsertionTime - czas wstawienia do kolejki DequeueCount - liczba pobrań wiadomości z kolejki Wiadomości można także modyfikować. Aby to zrobić, pobieramy wiadomość z kolejki i zamiast ją usunąć, wołamy metodę UpdateMessage: CloudQueueMessage msg = queue.getmessage(); msg.setmessagecontent("nowa treść"); queue.updatemessage(message, TimeSpan.FromSeconds(0.0), MessageUpdateFields.Content MessageUpdateFields.Visibility); How to use the Queue Storage Service https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-queues/ 6. Worker Role Worker Role (pracownik) jest obiektem wykonującym pracę lub obliczenia. Dodanie Worker Role do projektu wymaga kliknięcia na poddrzewie Roles naszego projektu i wybraniu Add -> New Worker Role Project... Otrzymamy w ten sposób klasę dziedziczącą po RoleEntryPoint i implementującą trzy metody: OnStart, OnStop oraz Run. Metoda OnStart jest wywoływana w momencie uruchomienia pracownika i powinna zwrócić true jeżeli inicjalizacja się powiodła (w przypadku zwrócenia false obiekt jest niszczony). Metoda OnStop wywoływana jest w momencie zatrzymywania pracownika (w przypadku zatrzymania lub aktualizacji usługi, restartu maszyny Azure lub gdy metoda Run się zakończy). Metoda ta powinna zakończyć się szybko lub być gotowa na sytuacje, gdy jej wykonanie zostanie przerwane. Wreszcie metod Run wykonuje właściwą pracę i w zasadzie nie powinna się kończyć (główna pętla powinna mieć postać zbliżoną do while(true)...). Komunikaty diagnostyczne, wypisywane poprzez Trace.WriteLine można obejrzeć klikając prawym przyciskiem myszy na ikonie emulatora Azure w zasobniku systemowym i wybierając Show Compute Emulator UI oraz przechodząc do odpowiedniego pracownika. sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 5

Build an Application that Runs in a Cloud Service in Windows Azure http://msdn.microsoft.com/en-us/library/windowsazure/hh180152.aspx Configuring a Windows Azure Project http://msdn.microsoft.com/en-us/library/windowsazure/ee405486.aspx 7. Azure SQL Kolejnym dostępnym kontenerem na dane jest relacyjna baza danych. Jest to wariant Silnik bazy danych ma swoje ograniczenia i nie jest to (jak w przypadku emulatora) SQL Server. Tworzenie bazy danych w realnym systemie Azure jest opisane w pozycji How to use Windows Azure SQL Database in.net applications. W przypadku emulatora należy uruchomić SQL Server Object Explorer (z menu View). Jeżeli nie jest on dostępny (wykonanie komendy powoduje błąd) trzeba zainstalować aktualizację: z menu "Tools" wybieramy "Extensions and Updates", z zakładki Updates instalujemy "Microsoft SQL Server Update for database tooling" i restartujemy Visual Studio. Następnie w podwęźle (localdb)\v11.0 węzła SQL Server klikamy prawym przyciskiem myszy na Databases i wybieramy Add new database podając w oknie dialogowym nazwę i lokalizację bazy. Do połączenia się z bazą danych możemy skorzystać z przestrzeni nazw System.Data.SqlClient. Najpierw tworzymy połączenie: SqlConnection c = new SqlConnection(); i ustawiamy w nim ConnectionString: c.connectionstring = "Driver=SQL Server Native Client 11.0; + "Server=(LocalDB)\\v11.0;Database=nazwa;Trusted_Connection=yes;"; lub (w zależności od wersji sterowników bazy danych): c.connectionstring = "Data Source=(LocalDB)\\v11.0;Database=nazwa;Trusted_Connection=yes;"; gdzie nazwa jest nazwą utworzonej bazy danych. Uwaga: w realnym środowisku Azure ConnectionString będzie miał postać: Driver=SQL Server Native Client 10.0; Server=tcp:xxxxxxxxxx.database.windows.net; Database=testDB; Uid=MyAdmin@xxxxxxxxxx; Pwd=pass@word1;Encrypt=yes; Po otrzymaniu połączenia otwieramy je metodą Open() (na koniec należy je zamknąć metodą Close()). Wykonanie zapytania wymaga utworzenia obiektu SqlCommand wołając CreateCommand na połączeniu. W tak utworzonym obiekcie ustawiamy pole CommandText na treść zapytania SQL i wykonujemy je jedną z trzech metod: ExecuteNonQuery - jeżeli zapytanie nie zwraca wyniku (np. CREATE TABLE, INSERT itp.) wartością zwróconą jest liczba zmodyfikowanych wierszy lub -1 w przypadku np. tworzenia tabeli ExecuteScalar - jeżeli interesuje nas tylko jedna pierwsza wartość pierwszego wiersza wyniku wartością zwróconą jest object reprezentujący zwróconą wartość lub null w przypadku jego braku ExecuteReader - gdy chcemy otrzymać pełny wynik wartością zwróconą jest obiekt typu SqlDataReader; posiada on metodę Read przechodzącą do następnego wiersza oraz metody Get...(num) zwracające wartość kolumny o numerze num (licząc od zera) w postaci podanego typu (GetString(0), GetGuid(0), GetInt32(0) itp.) np.: c.open() var cmd = c.createcommand(); sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 6

cmd.commandtext = "insert into tabela values(1, 'test')"; cmd.executenonquery(); cmd.commandtext = "select count(id) from tabela"; int num = (Int32)cmd.ExecuteScalar(); cmd.commandtext = "select value, text from tabela"; var rc = cmd.executereader(); string rv = ""; while(rc.read()) rv += rc.getstring(0) + " " + rc.getstring(1) + "\n"; c.close(); Transakcje możemy przeprowadzać w następujący sposób: var t = conn.begintransaction(); cmd.transaction = transaction; cmd.commandtext =...; cmd.execute...(); if(/* OK */) t.commit(); else t.rollback(); Jeżeli potrzebujemy automatycznie generowanych identyfikatorów, należy wybrać uniqueidentifier jako typ kolumny klucza oraz ustawić domyślną wartość na newid(). Kolumna taka będzie miała typ Guid. Dodatkowa literatura: SQL Database documentation http://azure.microsoft.com/en-us/documentation/services/sql-database/ Windows Azure SQL Database http://msdn.microsoft.com/en-us/library/windowsazure/ee336279.aspx How to use Windows Azure SQL Database in.net applications https://www.windowsazure.com/en-us/develop/net/how-to-guides/sql-database/?fb=pl-pl#using-odbc Guidelines and Limitations (Windows Azure SQL Database) http://msdn.microsoft.com/en-us/library/windowsazure/ff394102.aspx sieciowe07d77448-3773-4e2d-8bdc-1895ca2423d9 7