Ny dansk podcast om udvikling: builder.dk

Som du måske allerede har læst, så synes Nis og jeg at der mangler en god dansk podcast om udvikling. Det har vi lavet om på.

Vi har netop lanceret builder.dk - dansk podcast for udviklere og entreprenøre

builderlogo

Vi håber du synes om dette initiativ, tjek den første episode som handler om Scrum!

Stay tuned...

/Dennis

ASP.NET MVC Preview 3 er netop udgivet

Jeg læste netop at ASP.NET MVC Preview 3 er blevet udgivet.

ScottGu: This morning we released the Preview 3 build of the ASP.NET MVC framework.

Scott Hanselman har på sin blog allerede postet 2 kom-i-gang videoer til preview 3

Du kan downloade ASP.NET MVC Preview 3 her

Happy day

Dennis

ISNULL i T-SQL byder på ubehagelig overraskelse

KillABug-Bag Jeg har gennem mange år være flittig bruger af ISNULL funktionen i t-sql. Den anden dag fik jeg en fejl ind fra en kunde, som søgte på en værdi vedkommende viste fandtes i deres system, men søgning kunne ikke finde recorden.

Efter at have kigge i min stored procedure noget tid, uden at finde fejlen, begyndte jeg at teste på et sted hvor jeg brugte ISNULL.

Problemet er bedst illustreret med et eksempel, lad os oprette en tabel til at teste med:

DECLARE @Customers TABLE (
Id INT,
InternalName NVARCHAR(10),
Firstname NVARCHAR(10),
Lastname NVARCHAR(10)
) INSERT INTO @Customers ( [Id], [InternalName], [Firstname], [Lastname] ) VALUES ( 1, NULL, N'Dennis', N'Knappe' )

Nu har vi en tabel med en NULL værdi i InternalName feltet, og Dennis i FirstName og Knappe i LastName. Lad os så prøve at lave en forespørgsel:

SELECT ISNULL(InternalName, FirstName +' '+ LastName) AS CustomerName 
FROM @Customers

Hvad returnere denne forespørgsel? Hvis du ligesom mig trode at den returnerede Dennis Knappe, kan du godt læse videre.

Jeg løfter sløret allerede nu. Den returnerer:

Dennis Kna

Ja, det er rigtigt. Det lader til at ISNULL tager datatypen fra det første argument og caster det sidste argument til samme længde. Altså vil min FirstName + ' ' + LastName blive til NVARCHAR(10). Jeg må indrømme at det tog lidt tid at hitte ud af. Jeg forsøgte efterfølgende at kigge i dokumentationen for ISNULL hos M$, men der står intet om denne lille "feature" og der står, som Jakob rigtig nok skriver i mine kommentarer: replacement_value must have the same type as check_expresssion. Jeg har åbenbart været lidt for hurtig på aftrækkeren, og ikke læst det som stor ordentligt. Anyway er der måske flere af min slags derude, og de får hermed glæde af løsningen :-)
(teksten efter overstregning er tilføjet efter publish af dette blogindlæg)

Løsningen på problemet

Jeg kan umiddelbart se to muligheder for at komme rundt om dette problem, du får dem begge her:

1. Løsning med at caste argument to til den længede man ønsker:

SELECT ISNULL(CAST(InternalName AS NVARCHAR(20)), FirstName +' '+ LastName) AS CustomerName 
FROM @Customers

 

2. Brug COALESCE (mit valg)

SELECT COALESCE(InternalName, FirstName +' '+ LastName) AS CustomerName
FROM @Customers

 

Coalesce funktionen er åbenbart ligeglad med at typerne ikke er helt ens, hvilket jeg også havde forventet at ISNULL var.

/END TRANSACTION

Vista bytter om på mine skærme og det er pisse træls

autoitlogoPå kontoret bruger jeg to skærme, og jeg har for få dage siden opstillet min bærbare på venstre side af min eksterne skærm, og det kan Vista bare ikke finde ud af. Hver eneste gang jeg har låst min computer og logger på igen, så bytter den indstillingerne om, og den tror min bærbare er på højre side af den eksterne skærm.

Jeg har forsøgt forskellige ting uden held, og tænkte til sidst at det må man da kunne scripte sig ud af. Efter lidt søgen på nettet fandt jeg AutoIt, som er et freeware BASIC lignede script sprog, som er designet til automatisering af Windows GUI.

Her er hvad de selv skriver om AutoIt

AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, self-contained and will run on all versions of Windows out-of-the-box with no annoying "runtimes" required!

Jeg sad og legede lidt med sproget, og hold da helt op hvor jeg morede mig. Efter ganske kort tid havde jeg fået bakset et script sammen som kunne skifte positionen på mine skærme, og alt hvad jeg nu skal gøre, er at eksekvere mit script når jeg logger på.

Scriptet fylder kun 7 liniers kode:

Run("C:\WINDOWS\system32\control.exe desk.cpl,@0,3")
WinWaitActive("Display Settings")
Send("{DOWN 20}")
Send("{RIGHT 40}")
Send("{UP 20}")
Send("{TAB 6}")
Send("{ENTER}")

Det er da top dollar, og hver gang jeg afvikler koden får jeg en lille griner fordi boksen åbner, og jeg visuelt kan se at den flytter rundt på skærmene.

Nu mangler jeg bare at finde ud af hvordan jeg får Vista til at fyre scriptet af automatisk når jeg logger på, efter at have låst Vista med WindowsKey + L. Jeg kan med det samme røbe at det ikke er logonscript under group policy (WindowKey + R > gpedit.msc)

grouppolicy

Hvis du ved hvordan man gør, så smid lige en kommentar :-)

/Dennis

Vigtige system tabeller når man arbejder med Service Broker

Som jeg skrev i mit sidste indlæg, ville mit næste blog indlæg indeholde en liste, over de system tabeller, som er gode at huske, når man arbejder med Service Broker.

Følgende tabeller (Catalog Views) benyttes af Service Broker. Et Catalog View er en tabel som benyttes af SQL Server Data Engine. Alle tabellerne er specificeret i SQL Books Online.

  • sys.conversation_endpoints
  • sys.service_contract_usages
  • sys.conversation_groups
  • sys.service_message_types
  • sys.remote_service_bindings
  • sys.service_queue_usages
  • sys.routes
  • sys.services
  • sys.service_contracts
  • sys.transmission_queue
  • sys.service_contract_message_usages

Den som jeg selv har brugt mest er sys.transmission_queue. Hvis en besked ikke kan afleveres til sin target kø, vil den blive placeret i transmissions køen. Her kan man kigge på kolonnen transmission_status, som fortæller hvorfor beskeden ikke kan leveres. Ganske handy.

/Dennis

"Walk on a fresh tree, the dry one will break"

Aktivere og deaktivere Service Broker på en database

Den seneste tid har jeg rodet en del med Service Broker på SQL Server 2005. Da selve understøttelsen for Service Broker i Enterprise Manager stort set er fraværende, er der en hel del ting man lige skal huske. Hvordan aktiverer man fx Service Broker på en database, og hvordan deaktiverer man den igen? Hvilke system tabeller er gode at kigge i når tingene går galt (for det gør de, i hvert fald indtil man er dus med uhyret).

I god linie med mit tidligere udsagn om at poste t-sql tips og tricks her på bloggen, vil disse også komme til at omhandle Service Broker.

Den første af slagsen er helt basal, hvordan aktiverer man Service Broker på en database?

ALTER DATABASE [Database Name] SET ENABLE_BROKER; 

Og hvis man vil deaktivere den skriver man:

ALTER DATABASE [Database Name] SET DISABLE_BROKER;

Hvis man via t-sql vil vide om Service Broker er aktiveret eller deativeret kan man skrive:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'Database Name'

Arbejder du også med Service Broker? Smid en kommentar!

/Dennis

"Walk on a fresh tree, the dry one will break"

Sådan sender du en e-mail notificering når du har for lidt diskplads

De sidste to indlæg jeg har lavet her på bloggen, har vist hvordan man nemt kan sende en e-mail med t-sql, og hvordan man tjekker hvor meget diskplads der er ledigt på dine SQL drev.

I dette indlæg vil jeg kombinere disse to indlæg, og vise hvordan man kan lave et script, der sender en e-mail når diskpladsen når et kritisk niveau. I mit eksempel vil jeg have en mail når et drev har mindre end 10 GB (altså 10000 MB).

DECLARE @FreeSpace TABLE (Drive CHAR(1), FreeMB BIGINT); 
INSERT INTO @FreeSpace EXEC master..xp_fixeddrives;
IF EXISTS (SELECT * FROM @FreeSpace WHERE FreeMB < 10000) 
BEGIN   
    EXEC msdb.dbo.sp_send_dbmail   
        @profile_name = 'Administrator',   
        @recipients = 'sysadmin@importantcompany.com',   
        @body = 'Der er lavvande på en eller flere af dine SQL disks. Se vedhæftede fil for detaljer',   
        @subject = 'Diskplads advarsel',   
        @query = 'DECLARE @FreeSpace TABLE (Drive CHAR(1), FreeMB BIGINT);
INSERT INTO @FreeSpace EXEC master..xp_fixeddrives;
SELECT * FROM @FreeSpace WHERE FreeMB < 10000',  
        @attach_query_result_as_file = 1,   
        @execute_query_database = 'msdb'        
END

Nu mangler du bare at smide koden ind i et SQL Server Agent Job, og definere en schedule.

/Dennis

Tjek hvor meget diskplads du har ledigt med t-sql

Her kommer et af verdens korteste blogindlæg, men ikke desto mindre er det faktisk nyttigt. Ved at blæse følgende sql af i din query analyzer, får du returneret hvor mange megabytes du har ledigt på dine diske. Handy.

EXEC master..xp_fixeddrives

Prøv det, prøv det :-)

/Dennis

Send e-mails direkte fra t-sql

Her kommer der et lille fif som er meget nyttigt.

Hvor ofte vil man ikke gerne have en mail hvis en eller anden tåbelig procedure fejler, eller går godt for den sags skyld. I SQL Server 2005 er det blevet rigtig nemt at sende e-mails direkte fra t-sql, se selv:

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Administrator',
    @recipients = 'whocares@anybody.com',
    @body = 'Dit backup job fejlede igen, øv, se så at få det rettet!',
    @subject = 'Din backup procedure fejlede (igen)';

Hvis du tror det er alt hvad man kan med den procedure, så kan du godt tro om igen. Der er ikke mindre end 21 forskellige argumenter du kan kaste dig ud i. Lad mig komme med et eksempel mere:

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Administrator',
    @recipients = 'whocares@anybody.com'
    @body = 'Dit backup job fejlede igen igen igen, øv, se så at få det rettet!',
    @subject = 'Din backup procedure fejlede (igen)',
    @query = 'SELECT * FROM BackupLog',
    @attach_query_result_as_file = 1,
    @execute_query_database = 'Databasenavn'

Argumentet @query kan indeholde en hvilken som helst valid query, og man kan vælge om resultatet skal vises i mail body, eller om et skal vedhæftes som en fil. I dette tilfælde har jeg valgt det sidste. Der er en række argumenter som bestemmer hvordan layoutet af resultatet skal være. Det er jo en rigtig smart måde at sende nogle data direkte til en kunde, f.eks. rapporter.

Læs hele Microsofts dokumentation af sp_send_dbmail

/Dennis

Sync Google Calendar med Outlook

Jeg nyder i stadig større grad, at mine applikationer ikke er installeret på min computer, men derimod er services tilgængelig via nettet. Hvis du ligesom mig anvender Google Calendar til at holde styr på dine aftaler, så lyt efter lidt endnu. Google har frigivet et synkroniserings tool som kan lave en 2 vejs synkronisering mellem Google Calendar og Outlook. Ja ja, jeg ved godt at man har kunnet hente forskellige andre tools som gør det samme, men alle dem jeg har fundet har kostet $$. Denne er gratis og det er fedt!

En af grundene til at jeg skiftede fra Outlook til Mozilla Thunderbird eksisterer ikke længere.

googlecalendarsync

/Dennis

ASP.NET MVC Scaffold Generator

Her til morgen faldt jeg lige over en freeware ASP.NET MVC Scaffold Generator. For dem som ikke ved hvad det er for en fisk, kan jeg kort fortælle at det er et værktøj som automatisk kan generere administrations sider udfra en datamodel. I dette tilfælde er administrations siderne MVC baseret.

Firmaet bag dette værktøj, har lave en screencast, som man kan tjekke inden man downloader. De stiller også et support forum til rådighed.

Følgende features er understøttet (direkte klippet fra deres hjemmeside):

  • Uses the LinqToSql data to generate source code.
  • Ruby on Rails like CRUD pages creator with a single button click.
  • Ruby on Rails like error reporting in the CRUD pages.
  • Ability to create pages for selected tables.
  • Create a common controller that links all the Selected table's List and Add action.

I fremtiden lover de bl.a. support for VB.NET (who cares, haha), fremmednøgler, ADO.NET Entity Framework.

Til sidst kan jeg blot fortælle, at der også er support for den seneste marts version af MVC. Her er et lille screenshot af uhyret:

aspnetmvcscaffold

/Dennis

Undo enkelte transaktioner med SQL Log Rescue

Kender du det? Sommetider bliver man bare vildt begejstret over en eller anden applikation man lige har fundet. Sådan havde jeg det forleden. En gammel kunde ringede og fortalte, at han i et forvirret øjeblik var kommet til at svare ja til at slette en ikke ubetydelig mænge records i hans system (læs 27.000, ups!).

På systemet er der mange kunder, og han ville gerne have mig til at lave en restore for kun denne ene kunde. Da jeg fortalte at det kunne man ikke bare gøre, det var ligesom alt eller intet blev der lidt stille i den anden ende. Kan du så ikke lave en restore til en ny database og så kopiere de manglende data over? Det kunne man jo i princippet godt gøre, men databasen er ret normaliseret, og det ville betyde et større puslespils arbejde at kaste sig ud i, hvilket kunne blive ret dyrt. Vi blev enige om at jeg blot skulle lave en restore så tæt på tidspunktet som muligt, og så måtte kunderne bare taste de data ind som de mistede på den halvanden time, øv øv øv.

Da jeg var i gang med at finde det præcise tidspunkt for skaden, kom jeg i tanke om et værktøj jeg havde set hos RedGate (leverandør at TOP KLASSE SQL VÆRKTØJER, kan kun varmt anbefales). Jeg smuttede forbi deres website, og fandt hurtigt det jeg søgte: SQL Log Rescue. Jeg siger det lige igen: SQL Log Rescue, og igen: SQL Log Rescue, og igen: SQL Log Rescue :-)

For det første er SQL Log Rescue gratis hvilket jo altid er en god start. For det andet så rykker applikationen bare for vildt. Jeg åbner programmet, logger på den database hvor skaden er sket. Den analyserer logfilerne, og viser en liste over samtlige transaktioner. Nu vælger jeg de transaktioner som jeg ønsker at fortryde, og klikke Undo. Nu dyrker SQL Log Rescue lidt voodoo og ofrer en ged, og BAM, så er der genereret et undo script som kan trylle de 27.000 records ind i databasen igen, lige til at brænde af i min query analyzer.

Jeg kunne nu ringe til kunden og sige at hans data var på plads igen, og at han i øvrigt ikke havde mistet en eneste transaktion for tiden mellem skaden og indtil nu. Behøver jeg at fortælle at han blev meget glad?

Her er en stribe screenshots der viser processen:

1. Vælg nyt recovery projekt

logrescue1

2. Vælg server, login og database

locrescue2JPG 

3. Her vælges hvilke logfiler man vil vælge fra

logrescue4 

4. Vælg transakation(er) og klik Undo Operations

logrescue5

5. Her er så dit Undo script.

logrescue6

RedGate har også en demo video af produktet som du kan tjekke hvis du stadig er i tvivl.

/Dennis

Tjekke for konflikt imellem to tabeller med fra- og tildatoer

Jeg sad på et tidspunkt med en sjov SQL udfordring. Jeg havde to tabeller, tabel A og tabel B, der hver indeholdt X antal rækker med fra- og tildatoer. Jeg ville nu lave en forespørgsel der kunne give mig alle rækker fra tabel A, som ikke var i konflikt med rækkerne i tabel B. Efter et par minutter tænkte jeg: Det kan ikke lade sig gøre uden at bruge en StoredProcedure med CURSOR, FETCH og hele gøjemøget (hvilket ikke giver den bedste performance på denne klode). Hmm.. der må være en mulighed... Efter lidt tankeknas kom jeg frem til følgende KANONSMARTE løsning:

SELECT * FROM A WHERE (
SELECT COUNT(*) FROM B WHERE (
A.FromDate BETWEEN B.FromDate AND B.ToDate OR
A.ToDate BETWEEN B.FromDate AND B.ToDate OR
B.FromDate BETWEEN A.FromDate AND A.ToDate OR
B.ToDate BETWEEN A.FromDate AND A.ToDate
) ) = 0

Hvis man så ønsker at få alle de rækker, hvor der rent faktisk er konflikt, kan man jo bare sige, at antallet skal være større end nul.

SELECT * FROM A WHERE (
SELECT COUNT(*) FROM B WHERE (
A.FromDate BETWEEN B.FromDate AND B.ToDate OR
A.ToDate BETWEEN B.FromDate AND B.ToDate OR
B.FromDate BETWEEN A.FromDate AND A.ToDate OR
B.ToDate BETWEEN A.FromDate AND A.ToDate
) ) > 0

Pretty nice... Cool

/Dennis

Single/Multi/Restricted user mode på en database

For dem som ikke kender mig, kan jeg fotælle, at jeg altid har været lidt af en T-SQL fan og skabs-DBA. Jeg har brugt SQL Server siden version 6.5 og synes det er et total fedt produkt. Jeg har ikke været så vant til at anvende T-SQL til at lave mine daglige opgaver i SQL serveren (som nu er en 2005 version), jeg har forladt mig på de ting som SQL Server Management Studio har stillet til rådighed.

Denne "dårlige" vane har jeg tænkt mig at gøre op med, og har derfor tilmeldt mig AGD (Anonyme GUI DBAer) - Mit navn er Dennis og jeg er er GUI DBA... Cry

Jeg vil gennem den næste tid poste indlæg med små fede kommandoer som man kan fyre af i T-SQL, og jeg starter med en kommando som kan ændre din database til SINGLE USER mode. Det er mega nemt, man skriver blot:

ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Dette sætter din database i SINGLE_USER mode, og den kan så kun tilgås af dbo. Ønsker man at have databasen i SINGLE_USER mode, men så den kan tilgås af alle, skriver man: 

ALTER DATABASE dbname SET RESTRICTED_USER
GO

Når man vil have den i normal mode igen, skriver man: 

ALTER DATABASE knappekragh SET MULTI_USER 
GO
/Dennis

Min MVC Webcast er nu online

Min annoncerede webcast om ASP.NET MVC er nu online hos Microsoft.

Tjek det og kom med din mening. Jeg påtænker at lave en stribe mindre webcast og poste den her på bloggen, så dine forslag vil jeg sætte pris på.

Microsoft har bøffet lidt i redigeringen af min webcast, der er et afsnit som skulle have været klippet ud da det glippede i første forsøg. Cool

Husk også at tjekke nogle af de andre webcasts.

God fornøjelse

/Dennis 

 

MVC Webcast

I går var jeg en tur hos Microsoft hvor jeg lavede en webcast omkring ASP.NET MVC frameworket. Det var rigtig sjov at deltage i dette projekt, og der blev da også godt 30 minuttes webcast ud af det.

Webcasten skal anvendes til Microsofts store online launch af Windows Server 2008, SQL Server 2008 og Visual Studio 2008 der finder sted den 28. februar 2008.

Som Microsoft selv skriver på deres hjemmeside:

Det er ikke hver dag vi lancerer tre produkter på én gang, men det sker i 2008. Den 28. februar søsætter vi verdens største online launch nogensinde i Danmark. Den bør du ikke gå glip af, så husk at sætte et kryds i kalenderen. I et stort opsat show præsenterer vi flagskibet Windows Server 2008. Samtidig præsenteres SQL Server 2008 og Visual Studio 2008 på scenen.

Hvad venter du på? Tilmeld dig nu.. (du kan vinde en frokost foran skærmen).

Mens du venter kan du nyde et screenshot fra min webcast :-)

MVC_webcast

MVP for femte år i træk

MVP LogoJeg har endnu engang modtaget en MVP award fra Microsoft. Det er nu femte år i træk. Mine arme hænger stadig oppe i luften :-)

Men hvad er en MVP egentligt for en fidus? Her er en Definition på MVP fra Microsofts MVP website.

Microsoft Most Valuable Professionals (MVPs) are exceptional technical community leaders from around the world who are awarded for voluntarily sharing their high quality, real world expertise in offline and online technical communities. Microsoft MVPs are a highly select group of experts that represents the technical community's best and brightest, and they share a deep commitment to community and a willingness to help others.

Googles masterplan?

Jeg fandt denne lille video hos Google Inside. Det kan godt virke skræmmende (gys)

 


Find more videos like this on Google Inside

 

God weekend

Nyt XML feed adresse

Jeg har fået ny feed adresse, opdater i din reader så du fortsat kan læse mine indlæg :o)

http://feeds.feedburner.com/dennisknappe?format=xml

En plakat der giver overblik over .NET framework 3.5

Denne plakat giver et godt overblik over de mest brugte typer og namespaces i .NET framework 3.5. Skriv den ud paa farveprinteren og smid den op paa vaegen.

Du kan finde en PDF med plakaten paa Paul Andrews blog, eller downloade direkte her

Have fun Cool

MVC Demo Sourcecode

Scott Hanselman har postet nogle eksempler paa sin blog omkring MVC (Model View Controller). Koden er beregnet til demo og kan ikke koere da der ikke er DLL filer med. Uanset saa giver de en udemaerket introduktion til det som ASP.NET holdet sender ud i CTP om ikke ret laenge.

Personligt glaeder jeg mig rigtig meget til at bygge min webapps med MVC.

Du kan finde eksemplernerne her

Popfly - det er sku sjovt.

Jeg så et indlæg fra en som er på holdet der bygger Popfly. Popfly er en online applikation til at bygge Mashup applikationer med via SIlverlight. En Mashup applikation er når man bygger en applikation der tager brug af to eller flere forskellige services på nettet. Følgende er en ImageSphere som viser en søgning på Bill Gates fra Live Search billeder.

Det tog ca. 5 minutter at lave, regnet fra det tidspunkt hvor jeg lavede min konto :-)

 

Haha.. jeg blev lige nødt til at lave en mere. Denne gang er det en søgning på Monkey Island

Visual Studio 2008 + .NET framework 3.5 frigives november 2007

Jeg sidder i skrivende stund og hører keynote til TechEd 2007 i Barcelona. Keynote bliver holdt af Soma Somasegar (Corporate Vice President, Microsoft Developer Division). Hans keynote har været i gang ca. 30 minutter og han har netop annonceret at  Visual Studio 2008 og Microsoft .NET framework 3.5 bliver frigivet i denne måned til download på MSDN (der var stor klapsalve) Cool

TechEd Developers i Barcelona - kommer du?

For første gang skal jeg til TechEd Developers, heldigvis er det i Barcelona (jeg elsker bare at være i Spanien). Jeg har booket mig ind på et hotel kun få meter fra La Rambla, og jeg glæder mig til at sidde og nyde en caña og en café con leche på en listig bar Cool

Ask the experts 

Som en del af MVP programmet har jeg fået muligheden for at hjælpe til på Microsofts ATE (Ask the experts) Booth. Her vil jeg være at finde flere gange i løbet af ugen, så kom endelig forbi og få en sludder.

Hvis du også skal til TechEd så skriv en mail, og lad os mødes...

Nos vemos!
Tjek også antikvariat.dk, Pulterkammeret eller IP Now