Cum nu am cistigat Sql Server Heroes

Dupa ce am crezut ca am cistigat un Windows Home Server ( vezi http://sqlblog.com/blogs/adam_machanic/archive/2008/11/21/pass-2008-friday-keynote-parallel-scale.aspx )… la anuntul oficial se pare ca nu …

Asta e – mi-a placut CDC din Sql Server 2008 –si sufeream ca nu avea o interfata grafica.

Singura problema este ca mi-a amintit de o intimplare, de mult uitata, din clasa a 8-a:

Maica-mea se intelegea bine cu diriginta – si la sfirsit ii da telefon: Doamna, felicitari! Baiatul dvoastra a luat premiul 1 cu coronita!

Maica-mea mi-a spus –eu nu am bagat de seama …nu asta conta pentru mine…

Peste ½ h , telefon : S-a produs o incurcatura – s-au recalculat si a luat premiul 2…

Maica-mea vroia sa ma consoleze- eu i-am spus ca nu conteaza- dadeam la Caragiale si vroiam sa termin o problema de matematica mai dificila…

Peste ½ h , telefon : S-a produs o incurcatura – s-au recalculat din nou si a luat premiul 3…

Pina la urma am luat mentiune …

Nu pot sa zic ca nu imi pare rau dupa Windows Home Server …

Descrierea aplicatiei

Aplicatia pe care m-am gindit sa o facem va realiza urmatoarele:

    Va tine o evidenta (paralela !) a angajatilor dintr-o firma ( va fi integrat Active Directory si va tine datele intr-o baza de date Sql Server 2008)

    Va tine o evidenta a conturilor acestora pe diverse aplicatii, precum si a diferitelor beneficii ale user-ilor ( telefon, laptop, etc)

    Va face un workflow pentru un nou angajat, astfel incit sa se stie sigur cine ce are de facut( cumparat birou, laptop, etc)

    Pentru toate aceste actiuni se va tine o evidenta a celor care adauga/modifica date in sistem.

    Pe masura ce vom dezvolta aplicatia, ii vom adauga tot felul de noi functionalitati.Sa o numim Evidan(de la Evidenta Angajati)

 

Sa definim principalele roluri de actiune asupra sistemului:

  1. Administrator – are “puterea” de a “sterge” un angajat daca acesta nu a avut atribute, precum si de a defini atributele Workflow-ului si ale angajatului / aplicatiilor.
  2. Responsabil : indeplineste un anumit punct al workflow-ului pentru un nou angajat( ii da telefon, laptop, birou, il introduce in Active Directory, creeaza un email )
  3. HelpDesk – introduce / sterge atributele user-ului
  4. Raportare –are dreptul sa extraga un raport de pe site

 

Cerintele de lucru pentru versiunea 1 :

  1. Definirea workflow-ului si administrarea acestuia
  2. Importul angajatilor din Active Directory
  3. Trecerea unui angajat nou prin workflow
  4. Trecerea unui angajat care pleaca prin workflow
  5. Vizualizarea etapelor workflow-ului pentru angajat
  6. Vizualizarea resurselor care tin de un angajat.

Sunt deschis la sugestii pentru orice imbunatatire

Site-uri asa nu

Eu stiu ca nu sunt un devigner – dar sunt citeva lucruri care le stiu…si, mai ales, stiu cind nu imi place ceva.

Pentru “asa nu” am ales 2 site-uri reprezentative:

  1. http://www.arlechinoclub.ro/

Acesta este unul din motivele pentru care nu imi place Flash-ul – e asa de usor sa iti dai liber imaginatiei, dar si asa de usor sa faci un site de nefolosit.

Daca gasiti telefonul de contact in primele 10 secunde aveti un punct.

Daca gasiti cum sa reveniti de la contact la prima informatie in 5 secunde, aveti al doilea punct.

Daca stiti cum sa trimiteti unui prieten informatia cu adresa clubului – cu un simplu link – aveti al treilea punct.

  1. http://www.caustic.ro

Ce vreau sa zic : aparent e OK, design OK , vinde soft. Totusi ceva nu tine, de ex. http://www.caustic.ro/csoftware.html sau http://www.caustic.ro/aspwebsites.html

In plus “Buy” te pune sa completezi “product id” in loc sa si-l completeze singur

Voi ce exemple aveti ? (triviale, va rog)

 

Ajutor la Tutorial .NET 3.5

La fiecare parte a tutorialului( sau aproape ) o sa am citeva chestii pe care trebuie sa le faca cititorul singur.

De exemplu, la cel cu “aplicatii mici de test” am dat ca tema de casa realizarea aceleiasi aplicatii in Powershell. Daca cineva m-ar ajuta sa realizez temele de casa (cu poze despre cum l-a facut) , pot oferi ca recompensa :

  1. Un link pe blog catre blog-ul lui
  2. O revista Sql Server Magazine ( e adevarat, citita….) –daca e prin Bucuresti si ne putem intilni …Prin posta cred ca e mai mare daraua decit ocaua…
  3. Cistigarea proprie de experienta despre cit de greu/usor se scrie un tutorial…
  4. Habar nu am ce si-ar mai putea dori, dar puteti face sugestii rationale.

Ce ziceti ?

APLICATII MICI DE TEST

Acum vom trece aplicatia minimala de consola in mai multe outputuri : Windows Forms, Asp.NET, WPF

Vom transforma aceasta aplicatie intr-una de Windows Forms

Click dreapta pe solutie, Add=> New Project, Windows Forms Application


 

Dublu click pe form1, luam un buton din Toolbox , dublu click pe el, si apare evenimentul de click

 


 

Copiem exemplu de la aplicatia ConsoleApplication1, modificand Console.Write in MessageBox

In figura alaturata se vede ca nu aplicatia nu stie cine este SqlConnection. Dar, imediat in stinga, exista un icon mic -daca dati click pe el, o sa vedeti ca stie – alegeti “using”

 


 

Alegeti “set as startup project”

 


 

CTRL+F5 si apasati pe “buton1” – ar trebui sa va apara

 


 

 

Ce am observat ? Ca am scris de 2 ori acelasi cod. Daca am avea de modificat, nu ar fi cam greu in aceasta aplicatie -dar pentru o aplicatie mare am putea intimpina probleme. Ar fi bine daca acest cod s-ar tine undeva , intr-o locatie comuna – ceea ce in Windows numim dll.

OK – sa adaugam un dll – click dreapta pe Solution, Add=>New Project , Class Library

A aparut “Class1” si adaugam codul de pe Consola, modificat putin – nu mai interceptam SqlException -ca nu am stii ce sa intoarcem ( de fapt, ar trebui sa ne facem clasa noastra de exceptii – dar despre asta mai tirziu) – si intoarcem chiar ce gasim in BD:

    public
string MessageFromBD()

{


using (SqlConnection sc = new
SqlConnection())

{

sc.ConnectionString = @”Server=.\SqlExpress;Database=testAndrei;Trusted_Connection=True;”;

sc.Open();


using (SqlCommand sco = new
SqlCommand())

{

sco.CommandType = CommandType.Text;

sco.CommandText = “select top 1 Test from TestTable”;

sco.Connection = sc;


string text = sco.ExecuteScalar().ToString();


return text;

}

}

 

}

 

 

Bun – acum sa chemam acest mesaj si in consola, si in Windows Forms.La amindoua dam click dreapta pe “References”, “Add reference”, “projects”


Selectam ClassLibrary1 si dam OK. Puem pe Console Application1 set as startup

Inlocuim codul din ConsoleApplication1, Program cu urmatorul:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

namespace ConsoleApplication1

{


class
Program

{


static
void Main(string[] args)

{


try

{

ClassLibrary1.Class1 p = new ClassLibrary1.Class1();


string text = p.MessageFromBD();


Console.WriteLine(“found “ + text);

}


catch (SqlException ex)

{


Console.WriteLine(” Eroare conexiune:” + ex.Message);


return;

}

 

 

}

}

}

 

CTRL+F5,ca sa vedem rezultatul. Daca merge, haidem sa il modificam si pe cel de Windows Forms( nu uitati sa puneti referinta si set as startup)

 

Bun – acum vom face si o aplicatie WPF -click dreapta pe solutie, Add=>New Application, WpfApplication.

Adaugati referinta la ClassLibrary1, adaugati acelasi cod ca la Windows Forms si CTRL+F5

 

Ultimul pas, facem o aplicatie Web pentru aceasta aplicatie:

In carte=>testBD creeam un folder numit WebApplication1.Apasam “Start=>Run , control panel( swtich to classic view daca scrie asa ceva), administrative tools, Internet Information Services”

Expandati “local computer “, “WebSites”,”Default Web Site”, click dreapta pe “default web site”,new , “Virtual directory”


 

La alias scrieti “WebApplication1” si la Directory scrieti calea catre folder ( la mine, C:\carte\testBD\WebApplication1)

Asigurati-va ca la click dreapta pe “WebApplication1” , properties, ASP.NET, versiunea este 2.0


 

 

Bun – acum sa creeam aplicatia. Pornim Microsoft Visual Web Developer 2008 Express Edition si “File=>OpenWebSite, Local IIS” si expandati pina dati de WebApplication1

 


 

 


Acum adaugam dll-ul care facea comunicarea cu BD:

 

File=> Add=> Existing project si navigati pina la ClassLibrary1( la mine, C:\carte\testBD\ClassLibrary1). Adaugati csproj.Adaugam referinta la dll: La fel, click dreapta pe http://localhost/WebApplication1 , add reference, projects, classlibrary1

Acum adaugam pagina unde o sa vedem mesajul :

click dreapta pe http://localhost/WebApplication1 , add new item, Web Form ( fiti atent in ce limbak dati -C# sau VB.NET…)

Acum, gasiti jos Design – apasati pe el

 


 

 

Din toolbox alegeti din nou butonul , trageti pe forma si dati dublu click

Vom pune (aproape) acelasi cod ca si pentru WindowsForms/Console/WPF:

protected
void Button1_Click(object sender, EventArgs e)

{


try

{

ClassLibrary1.Class1 p = new ClassLibrary1.Class1();


string text = p.MessageFromBD();

Response.Write(“found “ + text);

}


catch (SqlException ex)

{

Response.Write(” Eroare conexiune:” + ex.Message);


return;

}

}

 

Apasati CTRL+F5, apasati pe buton si ar trebui sa va scrie:

Eroare conexiune:Cannot open database “testAndrei” requested by the login. The login failed. Login failed for user ‘TEST1\ASPNET’. ”

Mai tineti minte ca am folosit conexiunea trusted :

sc.ConnectionString = @”Server=.\SqlExpress;Database=testAndrei;Trusted_Connection=True;”;

 

Acum, haideti sa ne identificam cum trebuie si in ASP.NET. click dreapta pe http://localhost/WebApplication1 , add new item,Web Configuration File(lasati numele de Web.Config asa cum este!), gasiti authentication si puneti linga:

<identity
impersonate=true/>

CTRL+F5 din nou si acum apare:

Eroare conexiune:Cannot open database “testAndrei” requested by the login. The login failed. Login failed for user ‘TEST1\IUSR_TEST1’.

Tare, nu ? Am schimbat un user cu altul – din ASPNET, sub care ruleaza ASP.NET, am schimbat IUSR_TEST1 – sub care rulam default.

Hai sa facem ultima schimbare , ca sa ne recunoasca IIS :

Apasam “Start=>Run , control panel( switch to classic view daca scrie asa ceva), administrative tools, Internet Information Services”

Click dreapta pe “WebApplication1” , properties, Directory security, Anonymous access, Edit,scoateti “Anonymous Access”


 

OK si iar OK. Ne intoarcem la aplicatie si…Ura!, merge:

 

 


 

 

Observatii:

  1. Daca, in loc sa utilizam conexiunea “trusted”( Trusted_Connection=True ) foloseam una in care sa avem credentiale de SQLServer( de ex., sa cu ce parola ati dat) nu ne mai loveam de impersonare..

     

  2. Acest lucru ne-a facut atenti si la aplicatia Windows Forms – e clar ca ea se bazeaza tare pe faptul ca suntem utilizatori “preferentiali” – cu drepturi de administrator – pentru SQL Server

     

  3.  

  4. Tema pentru acasa : realizati aceeasi aplicatie in Silverlight (Hint :In Asp.NET, pe proiect,dati click dreapta, add new File=>Silverlight application)

 

 

Lecturi Recomandate:

    How to implement impersonation in an ASP.NET application, http://support.microsoft.com/default.aspx/kb/306158

Primul meu proiect popfly

Pentru ca popfly a ajuns la DevLabs , am zis sa ii dau o (noua) sansa. Aveam deja marota mea preferata, cursul valutar BNR si BCE – si am zis : Ce ar fi sa o fac pe user-ul amarit si sa incerc sa le integrez – de ex., sa vad cursul comun pe USD ?Mai ales ca am 2 RSS-uri pentru asta : http://www.infovalutar.ro/cursuribce.rss si http://www.infovalutar.ro/cursuri.rss

Asa ca, inarmat cu Windows Live ID, am inceput sa fac combinatii de Mashup.

Inceputul a fost usor – adauga un RSS, adauga un al doilea RSS … Hmmm ? Cum sa le combin ? Am cautat « combine » …Dar, din pacate, insista sa le combin fara sa imi dea un criteriu de combinare … Hmm. Am inceput sa fac ce trebuia sa fac de la inceput – si anume sa citesc Help-ul… Am dat pina la urma de RSSList- care nu e de fapt lista de RSS, ci , mai curind, un output de RSS. Si aici a trebuit sa ma bag un pic prin cod ca sa fac legatura – ajutat, bineinteles, de codul generat deja…

 

data[“RSSList”] = new Array();

var num = data[“RSS”].length;

var num2 = data[“RSS (2)”].length;

 

rsslist.__reserved.pendingCalls = num + num2;

if (num == 0)

{

console.write(“There are no incoming items.”);

environment.finish();

}

for (var i=0; i<num; i++)

{

try

{

 

var find = data[“RSS”][i].title;

var text = “BNR : 1 ” +data[“RSS”][i].title + ” = ” + data[“RSS”][i].description + ” RON “;

 

for(var j=0;j<num2;j++)

{

if(data[“RSS (2)”][j].title == find)

{

text += ” BCE : 1 EUR = ” + data[“RSS (2)”][j].description + ” ” + data[“RSS (2)”][j].title ;

break;

}

 

}

var result = rsslist.show(data[“RSS”][i].title,text, data[“RSS”][i].link);

 

}

catch (ex)

{

environment.reportErrorInLoop(i, ex);

}

}

 

 

Concluzii :

  1. Inca e dificil, dupa parerea mea, de facut un mashup pentru un utilizator obisnuit. Nu e acelasi lucru ca in Word, in care poti sa experimentezi mult mai usor …
  2. Nivelul de interfata grafica de ales controalele lasa mult de dorit. As vrea sa vad pe un tab controalele MS si pe altul celelalte…
  3. E super usor sa il transformi intr-un Vista/Web gadget … mai greu un pic pe Facebook …

 

Adresa lui la popfly : http://www.popfly.com/users/ignatandrei/cursvalutar

Pe Windows Live il gasiti la

http://gallery.live.com/LiveItemDetail.aspx?li=3d55ae26-79a5-47b7-a9bc-de3d5654a295 (pentru Vista)

si la http://gallery.live.com/LiveItemDetail.aspx?li=9ef48f72-15a0-4754-9efa-f93efa316ff3 (pentru Web)

Daca are cineva Vista, ziceti-mi(pozati-mi) si mie cum arata

    

SQL Server Heroes

    Dragii mei,

Am fost nominalizat la Sql Server Heroes cu CDC Helper

Nu mi-ar strica un  Windows Home Server – asa ca , daca voi considerati ca proiectul merita ( face Change data capture pe interfata grafica…), puteti vota aici

https://connect.microsoft.com/SQLServer/Survey/Survey.aspx?SurveyID=7231 ( cred ca va trebuie un Windows Live ID)

Inca ceva: poate cineva sa verifice proiectul pe SQL Server 2008 release ( nu am decit express care nu are CDC…)

Aveti doua posibilitati : fie cod sursa de la adresa http://www.codeplex.com/CDCHelper/Release/ProjectReleases.aspx , fie instalati aplicatia (daca aveti .NET 3.5 si Sql Server 2008) de la adresa http://serviciipeweb.ro/downloads/cdchelper/ si apasati pe test…

Multumesc,

Andrei

VERIFICARE INSTALARE

    Ca sa verificam aplicatia, vom creea o noua baza de date si ne vom conecta la o tabela sa obtinem datele.

 

Pornim Sql Server Management Studio ( Start=> Programs => Microsoft SQL Server 2008 => SQL Server Management Studio ) si ne conectam la .\SqlExpress ( numele instantei este in Control Panel=> Administrative Tools => services => Sql Server. Vedeti Path to executable . Daca se termina in “<cale>\sqlservr.exe” –s<Nume>, atunci numele sub care va conectati este .\<Nume> . Daca nu, va puteti conecta la . )

 

Ok, acum dati click dreapta Databases, NewDatabase si introduceti “testAndrei”.

Apasati apoi OK

Expandeaza apoi “Databases” apasind pe + ( daca e deja expandat, click pe Databases si apoi F5)

Expandeaza “testAndrei”, click dreapta pe table, “New Table”. La “column name” pune Test si apasa “enter” . Apasa CTRL+S si introdu “TestTable”

Expandeaza “Tables” apasind pe + ( daca e deja expandat, click pe Tables si apoi F5)

Click dreapta si “Edit 200 rows” . In casuta puneti “Andrei” si apasa “enter”

Acum inchide tot.

 

Felicitari, ai creat prima ta baza de date, cu prima tabela !

O vom acces acum prin C#.

Deschide Microsoft Visual C# 2008 Express Edition (Start=> Programs => Microsoft Visual C# 2008 Express Edition) . File=> New project si alegeti “Console Application”

Introduceti urmatorul text:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

namespace ConsoleApplication1

{


class
Program

{


static
void Main(string[] args)

{


using (SqlConnection sc = new
SqlConnection())

{

sc.ConnectionString = @”Server=.\SqlExpress;Database=testAndrei;Trusted_Connection=True;”;


try

{

sc.Open();

}


catch (SqlException ex)

{


Console.WriteLine(” Eroare conexiune:” + ex.Message);


return;

}


using (SqlCommand sco = new
SqlCommand())

{

sco.CommandType = CommandType.Text;

sco.CommandText = “select top 1 Test from TestTable”;

sco.Connection = sc;


string text = sco.ExecuteScalar().ToString();


Console.WriteLine(” am gasit in BD “ + text);

}

}

 

}

}

}

 

Dupa cite observati, am interceptat eroare de conexiune cu try/catch – daca SQL Server nu e pornit sau exista o alta problema, da o eroare custom.

 

Apasati CTRL+Shift+B si, daca v-au dat erori, rezolvati-le sau scrieti-mi.

Daca nu, CTRL+F5 si , daca totul e OK, va va aparea :

 

am gasit in BD andrei

Press any key to continue . . .

 

Daca nu, puteti sa imi scrieti – dar dati-mi, va rog, descrierea erorii …

 

 

 

 

Ca bonus vom accesa SQL Server prin Powershell . Deschideti din nou Sql Server Management Studio , expandati Databases si click dreapta pe “TestAndrei”. Acolo aveti “Start PowerShell” . Sa zicem ca vrem sa obtinem o lista cu toate tabelele din BD TestAndrei( deocamdata una singura, dar orisicit …) . Nimic mai simplu : Dati “cd Tables” , <enter> si apoi “dir”

Daca am vrea sa exportam lista intr-un format, am putea da urmatoarea comanda

DIR | Sort-Object -Property Schema,Name | Format-Table schema, name –AutoSize

Daca am vrea sa le si exportam, de exemplu in CSV, vom utilize

DIR | Sort-Object -Property Schema,Name | Select-Object schema, name | export-csv c:\tables.csv

Rezultatul ar trebui sa fie urmatorul :

 

#TYPE System.Management.Automation.PSCustomObject

Schema,Name

dbo,TestTable

 

Data viitoare vom trece aceasta aplicatie minimala prin in Windows Forms, WPF, ASP.NET ca sa dau o idée despre ce ne asteapta de la acest tutorial.

 

Sursa o gasiti si la

http://serviciipeweb.ro/iafblog/content/binary/net35/instalare/testBD.zip

Backupul bazei de date

http://serviciipeweb.ro/iafblog/content/binary/net35/instalare/testandrei.zip

Ca sa refaceti aplicatia :

Extrageti continutul zip-urilor.

Pentru a reface Baza de date urmariti pasii:

Porniti Sql Server Management Studio ( Start=> Programs => Microsoft SQL Server 2008 => SQL Server Management Studio ) si ne conectam la .\SqlExpress ( numele instantei este in Control Panel=> Administrative Tools => services => Sql Server. Vedeti Path to executable . Daca se termina in “<cale>\sqlservr.exe” –s<Nume>, atunci numele sub care va conectati este .\<Nume> . Daca nu, va puteti conecta la . )

 

Ok, acum dati click dreapta Databases=> Restore Database , puneti la numele bazei de date “TestAndrei” –sper sa nu folositi acest nume ( daca da, dati, va rog, altul! ) . Selectati apoi “From device” apasati cele 3 puncte si selectati fisierul .bak.

 

Verificati, de asemenea, la “options” ce cale aveti scrisa pentru locatia fisierelor.

Cum am spus, data viitoare vom trece aceasta aplicatie minimala prin in Windows Forms, WPF, ASP.NET ca sa dau o idée despre ce ne asteapta de la acest tutorial.

 

Lecturi Recomandate:

 

    PowerShell tutorial : https://blogs.technet.com/chitpro-de/archive/2007/05/10/english-version-of-windows-powershell-course-book-available-for-download.aspx    

    ConnectionStrings : http://www.connectionstrings.com/