h1

Index backup

maj 27, 2009

Man kan inte bara scripta ut index från studion i sql2005. Så här kommer ett litet script hur man gör.

DECLARE cIX CURSOR FOR
SELECT OBJECT_NAME(SI.Object_ID), SI.Object_ID, SI.Name, SI.Index_ID
FROM Sys.Indexes SI
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON SI.Name = TC.CONSTRAINT_NAME AND OBJECT_NAME(SI.Object_ID) = TC.TABLE_NAME
WHERE TC.CONSTRAINT_NAME IS NULL
AND OBJECTPROPERTY(SI.Object_ID, ‘IsUserTable’) = 1
ORDER BY OBJECT_NAME(SI.Object_ID), SI.Index_ID

DECLARE @IxTable SYSNAME
DECLARE @IxTableID INT
DECLARE @IxName SYSNAME
DECLARE @IxID INT

– Loop through all indexes
OPEN cIX
FETCH NEXT FROM cIX INTO @IxTable, @IxTableID, @IxName, @IxID
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @IXSQL NVARCHAR(4000) SET @PKSQL = ”
SET @IXSQL = ‘CREATE ‘

– Check if the index is unique
IF (INDEXPROPERTY(@IxTableID, @IxName, ‘IsUnique’) = 1)
SET @IXSQL = @IXSQL + ‘UNIQUE ‘
– Check if the index is clustered
IF (INDEXPROPERTY(@IxTableID, @IxName, ‘IsClustered’) = 1)
SET @IXSQL = @IXSQL + ‘CLUSTERED ‘

SET @IXSQL = @IXSQL + ‘INDEX ‘ + @IxName + ‘ ON ‘ + @IxTable + ‘(‘

– Get all columns of the index
DECLARE cIxColumn CURSOR FOR
SELECT SC.Name
FROM Sys.Index_Columns IC
JOIN Sys.Columns SC ON IC.Object_ID = SC.Object_ID AND IC.Column_ID = SC.Column_ID
WHERE IC.Object_ID = @IxTableID AND Index_ID = @IxID
ORDER BY IC.Index_Column_ID

DECLARE @IxColumn SYSNAME
DECLARE @IxFirstColumn BIT SET @IxFirstColumn = 1

– Loop throug all columns of the index and append them to the CREATE statement
OPEN cIxColumn
FETCH NEXT FROM cIxColumn INTO @IxColumn
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@IxFirstColumn = 1)
SET @IxFirstColumn = 0
ELSE
SET @IXSQL = @IXSQL + ‘, ‘

SET @IXSQL = @IXSQL + @IxColumn

FETCH NEXT FROM cIxColumn INTO @IxColumn
END
CLOSE cIxColumn
DEALLOCATE cIxColumn

SET @IXSQL = @IXSQL + ‘)’
– Print out the CREATE statement for the index
PRINT @IXSQL

FETCH NEXT FROM cIX INTO @IxTable, @IxTableID, @IxName, @IxID
END

CLOSE cIX
DEALLOCATE cIX

/JFR

h1

HATten är död!

maj 25, 2009

Idag har jag börjat använda BizTalk Server 2009 för första gången. Det känns inte som att det är några större förändringar mot BizTalk 2006 r2, dock finns det några välkomna nyheter, främst runt adapters och tekniker, dessutom TFS stöd.

En riktigt sjysst ny grej var att HATen försvunnit, jag har alltid ogillat HAT, den har andats 1986 i mina ögon, ful och jobbig att använda (utvecklingen verkar ha skett av Apples värsta fiende). Funktionaliteten från HAT har istället flyttats in i Administrations konsolen, bättre på alla sätt och vis. En grej som jag inte har gillat med BizTalk är alla olika verktyg som är utspridda här och var (Silverlight har lite av samma sjuka), detta är ett bra steg i rätt riktning.

/JK

h1

Codepage

maj 20, 2009

Ibland är det smidigt vid stora jobb som att skapa kataloger att skapa upp de via autogenerade bat-filer.

Tyvärr, så fick människorna, som alla vet, olika språk efter att ha ställt till det med babels torn.

Vi i Sverige kan ha tex å, ä och ö i katalognamn om vi vill. Detta ställer till det om du inte ändrar codepage ibland när du vill köra en batfil.

Lokalt att skapa en katalog Direkt i cmd-fönstret går bra. Men kör du bat-fil så ändras tex ö till ngt obskyrt.

Du kan förhindra detta genom att skriva:

chcp 1252

Detta först i bat-filen. Då äbdras codepage till western europe, eller latin1 som den också kallas.

Default är det 850 som är codepage.

//JFR

h1

Dataskyffling del 2

april 17, 2009

För att spinna vidare på min Ninja-kollegas resonemang om dataskyffling så kan jag tipsa om ett underbart verktyg som har sparat mig och mina kollegor MÅNGA timmars jobb. Om man inte är beroende av att datasynkronisering sker i realtid finns ett alldeles utmärkt verktyg från Red Gate som heter SQL Compare. Med hjälp av verktyget kan man både synka data och struktur, jag har använt det flera år och det fungerar helt perfekt, enkelt och snabbt att använda. Det enda negativa jag kan komma på om det är att det inte är gratis ;)

 Det finns också liknande funktionalitet i Visual Studio Database Edition, men detta har jag tyvärr inte haft möjlighet att testa ännu.

Läs mer om SQL Compare här: http://www.red-gate.com/products/SQL_Compare/index.htm

/JK

h1

Dataskyffling via fil

april 17, 2009

Ofta har man stött på att man ska skyffla data från ett ställe till ett annat. Replikering eller inte, så ibland så finns inte den möjligheten.

Enklast möjliga som jag då kommit på är helt enkelt är att i varje tabell trigga upp att när en ändring sker skriva den förändringen till en ändringstabell, i form av exakta kommandot.

Tex: delete from tabellnamn where id=1

Om det inte är i realtid som ändringarna måste ske, så kan man sedan med jämna mellanrum köra sqlcommand och tömma alla rader till en textfil.

Sedan överför man den text-filen till den andra ”speglade” basen, på det sättet som det är möjligt. Själva dumpningen är blixtsnabb, och en miljon rader kan gå på ngn sekund.

Kom ihåg att sätta primärnyckel på en räknare!

På andra sidan kan man läsa in textfilen rakt av eftersom det är rena sql-kommandon det handlar om.

Kom ihåg:
-Att en backup/restore initialt behövs på den ”speglade”
-Att aktivera xpcmdshell

//JFR

h1

Ledigt enkelt…

april 14, 2009

Efter lång ledighet kommer här enklast möjligast konvertering av en Array till ArrayList.

ArrayList al = new ArrayList();

al = ArrayList.Adapter(arrayname);

/JFR

h1

Läsvärt om arkitektur?

april 8, 2009

En bekant till mig tipsade om The Architectural Journal, en skrift som kommer ut kvartalsvis och kan laddas ner från Microsoft,  enligt honom ska den tydligen skall den vara riktigt bra. Konstigt nog har jag missat denna helt men jag ska nu göra mitt bästa för att läsa ikapp de nummer som kommit ut hittills. Ser fram emot att läsa dom, verkar vara ett relativt enkelt sätt att hålla sig uppdaterat i vad som händer, recension kommer när jag tragglat mig igenom några nummer.

Läs mer om The Architectural Journal här: http://msdn.microsoft.com/en-us/architecture/bb219085.aspx

/JK

h1

Texas Walker Ranger

mars 31, 2009

Eller inte riktigt, men Dependencywalker tänkte jag tipsa om idag. Dependencywalker är ett litet nätt program som hjälper dig om det fattas något beroende. Såhär kan det se ut om du drar och droppar en dll rakt ner i programmet.

dependency2

Som man kan se här så visas alltså vilka dll’er eller liknande som saknas för den du droppar.

Detta är enormt värdefullt. Du hittar Dependencywalker gratis på: http://www.dependencywalker.com/

//JFR

h1

Team Foundation – SDK

mars 31, 2009

Databinda egendefinierade fält mot gridview/datagrid
Den senaste tiden har jag bland annat roat mig med att utveckla en webbklient mot Team Foundation Server, det är enkelt, kul och lite annorlunda mot den vanliga webbutvecklingen jag håller på med i vanliga fall.

Ett problem jag stötte på i samband med det är att jag hade varit inne och pillat lite på mina work items, bland annat hade jag skapat några nya fält. So far so good, inga problem.. Det funkade att läsa upp work item, ändra, skapa  nytt etc. Problem uppstod dock när jag skulle databinda mitt resultat mot en gridview, gridviewn vägrade att visa upp mina egendefinierade fält.

Efter lite tänkemöda och googlande stött jag tillslut på följande utmärkta exempel från Kevin Dietz som hjälpte mig ett en snabb och enkel lösning på problemet:  
http://www.tfsexamples.com/Default.aspx?Page=DisplayQueryInGridView&AspxAutoDetectCookieSupport=1

/JK

h1

Konvertera en arraylist to array

mars 29, 2009

Stötte på detta som var lite annorlunda än vad jag trodde. Skapande av en array i .NET skapar jag som:

System.Array arrayName;

Vilket gör att när man tex ska konvertera en arraylist till array så är det så enkelt som:
 
System.Array arrayName = arrayListName.ToArray(typeof(int));
 
Men då jag använde en annan killes .NET-dll (eller tjej) så helt plötsligt ville det programmet ha en array som int[] och inte vanlig array. Hur lösa det tänker man då, inte fan kunde man trycka in ovanstående array utan fel;
 
funktionsnamn(ref int[])
 
Fick istället skapa en sådan här array enligt:
 
int[] arrayName;
 
och konverteringen:
 
arrayName = (int[])arrayListName.ToArray(typeof(int));
 
Varför inte bara använda det från början tänker alla då, jo därför att en tredje persons dll ville ha en arraylist och det skulle vara samma lista. Så det blev mellanmjölk för att bland lättmjölk och standardmjölk…