Mim

Select * from Seb where Sujets in (SQL Server 2008, ADO.NET, Visual Studio 2008)

mai 2008 - Messages

Aujourd'hui MSDN Tour à Marseille !
MTT08 Mtt_Bewise  

Et voilà, le MSDN Tour est de passage à Marseille, et BEWISE est présent !

Les Sessions ont bien commencé, certaines salles sont déjà bien pleine, c'est bon signe :)

J'ai quelques photos, prises ce matin par Laurent Galmiche, responsable de l'agence BEWISE à Aix en Provence :

 

Photo 1 : Le calme de l'accueil avant la tempête

CIMG1324

Photo 2 : La tempête débarque Smile

CIMG1331

Photo 3 : Le stand BEWISE, où nous nous retrouvons entre les sessions (notez la touch-classe from Vertice)

CIMG1327

Photo 4 : Préparation d'une session

CIMG1325

Photo 5 : Un session DEV en cours

CIMG1334

SqlFileStream

Avec l'arrivée du Framework 3.5 SP1 béta, de nouvelles classes ont fait leur apparition.

Notamment un ensemble de classes pour gérer le nouveau type SQL SERVER 2008 : FILESTREAM.

Lors de mes différentes présentations sur le sujet, j'ai toujours du utiliser une classe encapsulant un appel à une dll C, que je ne présentais pas d'ailleurs :) en expliquant que "bientôt" nous aurions droit à de vrais classes managed pour gérer tout ça

Et bien, c'est le cas; le framework (3.5 SP1 béta) est là !

Maintenant, tout devient (relativement) simple Happy

D'abord le script de création d'une table contenant un type FILESTREAM :

-- 1. Enable FILESTREAM support
EXEC [sp_filestream_configure] @enable_level = 3;

-- 2. Create a database with a File Group that contains FILESTREAM
CREATE DATABASE FileManagement 
ON
PRIMARY ( 
    NAME = FileManagement_Primary,
    FILENAME = 'c:\temp\data\FileManagement.mdf'),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM ( 
    NAME = FileManagement_FileGroup,
    FILENAME = 'c:\temp\data\FileManagement')
LOG ON  ( NAME = FileManagement_Log,
    FILENAME = 'c:\temp\data\FileManagementLog.ldf')
GO

-- 3. Create a Table with FILESTREAM
CREATE TABLE [dbo].[Files] 
(
    FileID uniqueidentifier NOT NULL ROWGUIDCOL PRIMARY KEY,
    FileContents varbinary(max) FILESTREAM DEFAULT(0x)
)
GO

En préambule, on crée une transaction (BIENSUR !)

SqlTransaction tx = conn.BeginTransaction();

J'insère dans ma table, contenant un filestream, une ligne (tout ça pour récupérer un contexte de transaction par la suite)

SqlCommand insertFileCommand = conn.CreateCommand();
insertFileCommand.Transaction = tx;
insertFileCommand.CommandText = "INSERT INTO Files (FileID) VALUES (@FileID)";
Guid newFileID = Guid.NewGuid();
insertFileCommand.Parameters.Add("@FileID", SqlDbType.UniqueIdentifier).Value = newFileID;
insertFileCommand.ExecuteNonQuery();

Je récupère le contexte de transaction :

SqlCommand getPathAndTokenCommand = conn.CreateCommand();
getPathAndTokenCommand.Transaction = tx;
getPathAndTokenCommand.CommandText = "SELECT FileContents.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM Files WHERE FileID = @FileID";
getPathAndTokenCommand.Parameters.Add("@FileID", SqlDbType.UniqueIdentifier).Value = newFileID;
SqlDataReader tokenReader = getPathAndTokenCommand.ExecuteReader(CommandBehavior.SingleRow);
tokenReader.Read();
SqlString filePathName = tokenReader.GetSqlString(0);
SqlBinary fileToken = tokenReader.GetSqlBinary(1);
tokenReader.Close();

Et maintenant j'utilise ce fameux nouveau type, comme un simple type FileStream (j'ouvre un flux, et j'écris dedans !)

FileStream inputFile = File.OpenRead("TextFile1.txt");
SqlFileStream sqlFile = new SqlFileStream(filePathName.Value, fileToken.Value, System.IO.FileAccess.Write);
byte[] buffer = new byte[512 * 1024]; // 512Kb

int bytesRead = inputFile.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
    sqlFile.Write(buffer, 0, bytesRead);
    bytesRead = inputFile.Read(buffer, 0, buffer.Length);
}

J'oublie pas de tout fermer hein ;)

 

sqlFile.Close();
inputFile.Close();
tx.Commit();
conn.Close();

 

Et voilà !

Bon FILESTREAM ! Applause

Premiers pas dans l’espace

Un article très bien écrit par mon collègue Djeepy sur la Géolocalisation dans SQL SERVER 2008

Premiers pas dans l’espace

Pour vous mettre en appétit :

image_3

image_thumb_5

Bonne lecture ! 

Fx 3.5 sp1 beta et Sync Services for ADO.Net

Je viens d'installer le SP1 du Framework 3.5 ainsi que le SP1 de Visual Studio 2008.

Il est clair qu'il y a beaucoup de nouveautés trés excitantes dans le SP1.

Support de l'intellisense poussé de Javascript, Support d'Entity Framework, Astoria, AJAX History, amélioration des perfs de Visual Studio 2008 etc  ...

Mais aussi plus proche de SQL Server 2008, le support de celui dans Visual Studio 2008 (ENFIN !!)

Et bien sachez que je viens de découvrir une nouveauté peu relayée du SP1.

Une mise à jour du Designer de Sync Services qui supporte non seulement SQL Server 2008, mais aussi une des features de celui ci : Le Change Tracking !

LocalDatabaseCacheDesigner01

Notez le petite case à cocher : "User Sql Server Change Tracking"

J'avais déjà auparavant fais du change tracking avec SQL Server 2008 et Sync Services (cf ma démo au Tech Days 2008) mais l'avoir intégré nativement dans le designer, je trouve ça juste ... cool !

Bon là il est un peu tard, mais promis je vais fous faire un petit article sur le Change Tracking et Sync Services, qui sont "ON NE PEUT PLUS" complémentaire l'un et l'autre !

Restez à l'écoute, je me sens d'humeur inspirée !!!

LinqPad

Bonjour à tous,

linqpadlogo

Je viens de découvrir un tool absolument "Must Have" pour tout bon développeur qui se respecte : LinqPad

Cet utilitaire est grosso-modo un Notepad Pour Linq.

J'adore !

Vous lancez et vous faites du LINQ :

image

J'ai trouvé tout de suite, un cas d'utilisation direct de cet outil.
Je veux faire du Linq To Sql dans une base de donnée, vite fait pour voir le contenu de la table Client.

Et bien avec LinqPad, pas besoin de créer un projet VS.Net, de créer un DataContext, une classe console, ou une winforms, blah blah blah ...

Je lance juste LinqPad, je me connecte à ma base de donnée (si ça n'a pas été déjà fait dans une session antérieure) et j'interroge directement ma table client... en LINQ !

En plus vous trouverez plein d'exemples, que ce soit LINQ simple ou LINQ to SQL ou encore LINQ To XML.

Enormissime !