Depuis toujours nous souhaitons développer au mieux des procédures stockées dans SQL Server, afin de clarifier ou d’optimiser nos développements.
Depuis 2005, les procédures stockées et les triggers peuvent être développés en .NET, grâce à votre langage favoris : C#, VB.NET, etc. Nous pouvons ainsi tirer parti de toute la puissance de ce Framework : fonctions mathématiques, cryptages, gestion de chaine de caractères, manipulation des dates, etc.
Lors de cette session, nous expliquerons comment créer des procédures, des triggers et des fonctions d’agrégations dans ce mode CLR. Nous passerons en revue les trucs et astuces utiles pour optimiser nos requêtes. Nous verrons quels sont les avantages de concevoir des procédures SQL en .NET ; mais également quels en sont les inconvénients. Finalement, nous verrons comment déployer facilement les bibliothèques .NET créées, dans SQL Server : quels outils utiliser.
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
...par Raphaël Javaux, le 25 mars 2015.
Copie pour permettre le téléchargement L'original se trouve ici : https://docs.google.com/presentation/d/1A87M-e3u1uXlsQddGsI60EZXHVqiehaNy_SCfj7hUeQ/pub?start=false&loop=false&delayms=3000&slide=id.p
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
Clairement dans cette version, nous assistons à une volonté de simplification. Plus de lisibilité du code, plus d’outils pour ne plus avoir à perdre de temps sur des opérations simples et courantes, pour au final un code de meilleur qualité et plus accessible. La plupart de ces améliorations se trouvent dans cette présentation.
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
...par Raphaël Javaux, le 25 mars 2015.
Copie pour permettre le téléchargement L'original se trouve ici : https://docs.google.com/presentation/d/1A87M-e3u1uXlsQddGsI60EZXHVqiehaNy_SCfj7hUeQ/pub?start=false&loop=false&delayms=3000&slide=id.p
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
Clairement dans cette version, nous assistons à une volonté de simplification. Plus de lisibilité du code, plus d’outils pour ne plus avoir à perdre de temps sur des opérations simples et courantes, pour au final un code de meilleur qualité et plus accessible. La plupart de ces améliorations se trouvent dans cette présentation.
Spark meetup www.meetup.com/Paris-Spark-Meetup/events/222607538/
La dernière version de Spark nous apporte une nouvelle API inspirée des librairies et langage d'analyse statistique. Nous verrons comment Spark Dataframe nous permet de simplement manipuler et explorer les données en conservant la scalabilité de Spark RDD
This course will introduce the core data structures of the Python programming language. We will move past the basics of procedural programming and explore how we can use the Python built-in data structures such as lists, dictionaries, and tuples to perform increasingly complex data analysis.
Ce cours est le premier en lien avec l'algorithmique présente les algorithmes et fonctions récursives ainsi que le type abstrait de données arbre. La première partie revient sur les notions de problème, algorithhme et spécification. La deuxième partie présente la récursion et de nombreux exemples. Enfin, la troisième partie présente le type abstrait de données arbre qui permet d'organiser des données de manière hiérarchique. Le cours se termine avec une introduction aux notions de backtracking et lookahead.
Ce cours introduit à la notion de type abstrait de données (TAD). On commence par y découvrir les principes de complexité temporelle et spatiale permettant d'analyser les performances d'une structure de données et d'algorithmes. Ensuite, le cours présente plusieurs TAD : la pile, la file, le deque et le vecteur. Enfin, il présente comment implémenter des TAD avec des structures chainées.
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
L’arrivée de PHP 5.3 en milieu d’année 2009 a bouleversé la manière de développer des applications web. En effet, cette nouvelle version a apporté de nouveaux outils au langage tels que les espaces de nommage qui favorisent la réutilisabilité du code lorsqu’ils sont employés à bon escient. Les nouveaux frameworks de développement rapide ont aussi suivi le mouvement et reposent sur la base de PHP 5.3. C’est le cas de Symfony2 dont la version stable est prévue prochainement.
Cette présentation offre un tour d’horizon de la nouvelle architecture du framework qui s’articule autour de “bundles”, de librairies externes et de nombreux composants indépendants tels que le conteneur d’injection de dépendances. Nous dresserons un panorama des principales fonctionnalités offertes par le framework telles que la couche d’ORM Doctrine 2, le moteur de templating Twig et la gestion des formulaires. Nous nous intéresserons également à la gestion du cache HTTP, à la couche de sécurité ainsi qu’aux outils de débogage destinés à améliorer la productivité du développeur et la maintenance de l’application.
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
Quels sont les principes d'une bonne conception de logiciel ? Quels sont les design patterns les plus importants ?
Comment assurer l'évolution de la conception ?
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Dans ce cours, on découvre comment construire une interface graphique en Python en utilisant la librairie Tk. Après avoir vu les différents composants de base, ce cours présente la programmation évènementielle qui permet d'écrire du code qui réagit à des évènements comme le clic sur un bouton, par exemple.
Les designs patterns présentés autrement. Du besoin vers le pattern pour avoir un cas concret d'application et pour mieux comprendre l'application.
Les étudiants ont aimé la démarche et leurs retours étaient positifs. Donc j'ai décidé de le partager avec vous.
J'attends vos retours aussi ;)
Enjoy :)
Cette présentation concerne le développement piloté par les tests (TDD, Test-Driven Development). Cette méthodologie se base sur des tests unitaires qui testent de manière indépendante des unités de code (module, procédure/fonction, classe...). En particulier, cette présentation utilise la librairie CUnit utilisée pour le langage C.
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Découverte du moteur de rendu du projet SpartanMicrosoft
Dans cette session, nous découvrirons l'ensemble des nouveautés du moteur de rendu du dernier navigateur de Microsoft. Vous l'avez peut-être déjà découvert lors de l'évènement du 21 janvier. Venez cette fois-ci découvrir ce qu'il y a sous le capot du point de vue du développeur. Ce sera pour nous l'occasion de vous parler des dernières technologies HTML5 comme ECMAScript 6, des dernières avancées côté WebGL ou bien encore du support de Web Audio. Pour finir, vous verrez également les progrès que nous avons effectué du côté la barre de développement.
Spark meetup www.meetup.com/Paris-Spark-Meetup/events/222607538/
La dernière version de Spark nous apporte une nouvelle API inspirée des librairies et langage d'analyse statistique. Nous verrons comment Spark Dataframe nous permet de simplement manipuler et explorer les données en conservant la scalabilité de Spark RDD
This course will introduce the core data structures of the Python programming language. We will move past the basics of procedural programming and explore how we can use the Python built-in data structures such as lists, dictionaries, and tuples to perform increasingly complex data analysis.
Ce cours est le premier en lien avec l'algorithmique présente les algorithmes et fonctions récursives ainsi que le type abstrait de données arbre. La première partie revient sur les notions de problème, algorithhme et spécification. La deuxième partie présente la récursion et de nombreux exemples. Enfin, la troisième partie présente le type abstrait de données arbre qui permet d'organiser des données de manière hiérarchique. Le cours se termine avec une introduction aux notions de backtracking et lookahead.
Ce cours introduit à la notion de type abstrait de données (TAD). On commence par y découvrir les principes de complexité temporelle et spatiale permettant d'analyser les performances d'une structure de données et d'algorithmes. Ensuite, le cours présente plusieurs TAD : la pile, la file, le deque et le vecteur. Enfin, il présente comment implémenter des TAD avec des structures chainées.
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
L’arrivée de PHP 5.3 en milieu d’année 2009 a bouleversé la manière de développer des applications web. En effet, cette nouvelle version a apporté de nouveaux outils au langage tels que les espaces de nommage qui favorisent la réutilisabilité du code lorsqu’ils sont employés à bon escient. Les nouveaux frameworks de développement rapide ont aussi suivi le mouvement et reposent sur la base de PHP 5.3. C’est le cas de Symfony2 dont la version stable est prévue prochainement.
Cette présentation offre un tour d’horizon de la nouvelle architecture du framework qui s’articule autour de “bundles”, de librairies externes et de nombreux composants indépendants tels que le conteneur d’injection de dépendances. Nous dresserons un panorama des principales fonctionnalités offertes par le framework telles que la couche d’ORM Doctrine 2, le moteur de templating Twig et la gestion des formulaires. Nous nous intéresserons également à la gestion du cache HTTP, à la couche de sécurité ainsi qu’aux outils de débogage destinés à améliorer la productivité du développeur et la maintenance de l’application.
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
Quels sont les principes d'une bonne conception de logiciel ? Quels sont les design patterns les plus importants ?
Comment assurer l'évolution de la conception ?
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Dans ce cours, on découvre comment construire une interface graphique en Python en utilisant la librairie Tk. Après avoir vu les différents composants de base, ce cours présente la programmation évènementielle qui permet d'écrire du code qui réagit à des évènements comme le clic sur un bouton, par exemple.
Les designs patterns présentés autrement. Du besoin vers le pattern pour avoir un cas concret d'application et pour mieux comprendre l'application.
Les étudiants ont aimé la démarche et leurs retours étaient positifs. Donc j'ai décidé de le partager avec vous.
J'attends vos retours aussi ;)
Enjoy :)
Cette présentation concerne le développement piloté par les tests (TDD, Test-Driven Development). Cette méthodologie se base sur des tests unitaires qui testent de manière indépendante des unités de code (module, procédure/fonction, classe...). En particulier, cette présentation utilise la librairie CUnit utilisée pour le langage C.
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Découverte du moteur de rendu du projet SpartanMicrosoft
Dans cette session, nous découvrirons l'ensemble des nouveautés du moteur de rendu du dernier navigateur de Microsoft. Vous l'avez peut-être déjà découvert lors de l'évènement du 21 janvier. Venez cette fois-ci découvrir ce qu'il y a sous le capot du point de vue du développeur. Ce sera pour nous l'occasion de vous parler des dernières technologies HTML5 comme ECMAScript 6, des dernières avancées côté WebGL ou bien encore du support de Web Audio. Pour finir, vous verrez également les progrès que nous avons effectué du côté la barre de développement.
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
Comme beaucoup de développeurs une grande partie de mon temps libre est utilisé pour découvrir de nouvelles technologies et développer des applications avec celles-ci.
J'ai donc choisi de découvrir le développement d'application Java sur le cloud, avec Google AppEngine, pour créer le site http://www.resultri.com qui permet de gérer les resultats de triathlon (mon autre passion).
Développer cette application est une aventure interessante que je partage avec vous durant ce BOF:
découverte de GAE et des outils de developpement
les "surprises" du NoSQL, surtout pour un cerveau "cablé relationnel comme le mien"
hmmm tout n'est pas gratuit?
les quelques trucs à savoir : l'importance de memcache, utilisation de CloudSQL, les batchs....
Pour une fois, il s’agit de parler de ce que l’on ne montre pas toujours au public : «l’envers du décor», soit le backend base de données et la synchronisation avec l’application iPhone.
Le but de la session est de présenter notre expérience dans le contexte suivant :
Base de données locale Sqlite
Base de données serveur MySql
Synchronisation des données application - serveur
Présentation de l’application
Présentation de l’administration des données (écrans de maintenance des données intégrés à Joomla)
Présentation de l’approche et du code, productivité de développement pour le backend web
Sqlite sans CoreData
Echange des données en JSON
Procédures stockées et vues MySql
Discussion concernant les techniques possibles et la productivité
Pour une fois, il s’agit de parler de ce que l’on ne montre pas toujours au public : «l’envers du décor», soit le backend base de données et la synchronisation avec l’application iPhone.
Le but de la session est de présenter notre expérience dans le contexte suivant :
Base de données locale Sqlite
Base de données serveur MySql
Synchronisation des données application - serveur
Présentation de l’application
Présentation de l’administration des données (écrans de maintenance des données intégrés à Joomla)
Présentation de l’approche et du code, productivité de développement pour le backend web
Sqlite sans CoreData
Echange des données en JSON
Procédures stockées et vues MySql
Discussion concernant les techniques possibles et la productivité
Si vous pensez encore que le data-binding, l’inversion de dépendances, le pattern MVC ou bien encore la gestion de la navigation sont réservés au code Java des applications web modernes, courrez assistez à ce workshop. AngularJS, le dernier framework JavaScript de chez Google, devrait vous surprendre.
Basée sur l’université AngularJS, ou le futur du développement Web présentée lors de Devoxx France 2013, ce workshop a pour objectif de vous initier à AngularJS.
Les concepts fondamentaux seront mis en en action au travers de l’application Game Store.
Côté industrialisation, nous verrons que tests unitaires, tests fonctionnels et infrastructure de build ne sont pas non plus délaissés.
A l’heure où la couche présentation des applications web est de plus en plus déportée côté client, ce workshop a pour objectif de démystifier ce type de framework permettant de structurer une application JavaScript.
L'environnement est au cœur des préoccupations. Comment peut-on agir positivement sur la consommation d'énergie générées par nos développement lorsque l'on est développeur ou architecte? Quels sont les outils à notre disposition, les bonnes pratiques et les pièges à éviter? Comment mesurer notre impact? L'objectif de cette session est de vous permettre de prendre conscience qu'il est possible d'agir réellement sur l'impact de notre activité au quotidien, en prenant connaissance d'outils et de services dont vous disposez déjà! Si en sortant de cette session vous intégrez certains de ces réflexe au quotidien, vous aurez déjà gagné en plus d'avoir passé un bon moment :-)
Visual Studio aura bientôt 25 ans d’existence. Cet éditeur a accumulé un ensemble de fonctionnalités impressionnantes. Lors de cette session, vous apprendrez comment mieux l’utiliser : les extensions indispensables, trucs et astuces du débogage, points d'arrêt conditionnels, raccourcis clavier, refactorisation du code, Intellisense, live Unit Tests, Code Cleanup, …
Et nous verrons les principales nouveautés de la version 2022.
Blazor is a WebAssembly (Wasm) technology.
A WebAssembly is a safe, portable, low-level code format designed for efficient execution and compact representation.
These slides are used in my DevDay.be 2018 presentation.
Présentation de Microsoft Visual Studio Team Service (VSTS / TFS) : création d'un projet, ajout de code .NET; création de tâches via Excel et compilation du projet.
Lors de cette présentation, nous apprendrons à créer des applications Web plus rapidement et avec moins d'erreurs en utilisant un langage de programmation puissant et amusant.
Agenda
- Installer TypeScript et configurer un nouveau projet.
- Tirer avantage des types de données.
- Développer en Objets avec TypeScript
- Ecrire de meilleures fonctions
- Retrouver vos données avec LINQ
- Programmer de manière asynchrone
- Bonnes pratiques
- Avantages et inconvénients des projets TypeScript
- Conclusion et Discussion
L’écosystème Microsoft est en pleine transformation !
Vous souhaitez démarrer ou renforcer vos projets .NET ?
Nous vous montrerons le chemin qui vous mènera vers la réussite logicielle !
Microsoft Experieces 2016 - Retour d’expériences sur TFS OnlineDenis Voituron
Retour d’expériences TFS Online dans une solution industrielle
La méthodologie Agile peut être appliquée à des projets de taille modeste, mais également à des projets industriels important. Lors de cette session, nous vous présenterons un projet d’industrialisation développé pendant près de 2 ans en méthodologie Agile et en technologies Web (Single Page Application), grâce à Visual Studio Team Services Online (TFS Online). Nous passerons en vue les moyens mis en œuvre et les solutions logicielles collaboratives utilisées. Nous analyserons les problèmes rencontrés, ainsi que les solutions appliquées pour les contourner, et nous reprendrons les 4 points forts appliqués.
Suite à cette session, vous serez conscient de l’organisation nécessaire pour concevoir une solution industrielle utilisée en permanence (24/7) par des milliers d’utilisateurs. Vous disposerez d’une méthodologie Agile exploitable et déjà éprouvée, y compris l’ensemble des solutions logicielles et techniques permettant d’échafauder une application basée sur la qualité des déploiements continus et sur la maintenance évolutive.
Développer avec un Simple Object Mapping Toolkit pour SQL ServerDenis Voituron
La majorité des applications actuelles ont besoin d’enregistrer des informations dans une base de données locale ou serveur. Plusieurs outils existent dont Entity Framework, le plus fréquemment proposés par Microsoft, ou ADO.NET, le plus performant mais le plus complexe à exploiter. Depuis plusieurs années, nous avons construit un ensemble d’outils simples afin de nous aider dans la fabrication de la DAL de nos projets, et plus particulièrement dans la recherche de données en les transformant facilement en objets .NET.
Les cinq bonnes pratiques des Tests Unitaires dans un projet AgileDenis Voituron
Les projets Agiles imposent leurs propres défis aux équipes de test. Un projet Agile est souvent basé sur de multiples itérations, exploite un périmètre de développement incertain, travaille avec une documentation minimaliste. Rapidement, les Tests Unitaires se font sentir pour garantir des évolutions logicielles en douceur.
Lors de cette session, nous présenterons les concepts de base des tests unitaires, quelles en sont les implications et quels sont les sujets applicatifs à tester. Dans la seconde partie de cette session, nous présenterons, par des démonstrations en direct dans Microsoft Visual Studio, les 5 bonnes pratiques des Tests Unitaires intégrés dans un cycle de vie Agile.
Exemples sur https://github.com/dvoituron/SampleUnitTests
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping ToolkitDenis Voituron
La majorité des applications actuelles ont besoin d’enregistrer des informations dans une base de données locale ou serveur. Plusieurs outils existent dont Entity Framework, le plus fréquemment proposés par Microsoft, ou ADO.NET, le plus performant mais le plus complexe à exploiter. Depuis plusieurs années, nous avons construit un ensemble d’outils simples afin de nous aider dans la fabrication de la DAL de nos projets, et plus particulièrement dans la recherche de données en les transformant facilement en objets .NET.
Lors de cette session, nous expliquerons l’historique de ce toolkit en le comparant à quelques outils existants sur le marché, dont ADO.NET, Entity Framework ou Dapper.NET.
Ensuite, via des démos Live, je présenterai les fonctionnalités principales de SqlDatabaseCommand pour réaliser et optimiser les opérations courantes d’accès aux bases de données : récupérations de données typées, gestion des transactions, intégration de traces, gestion des exceptions, génération automatique de classe et l’injection de données pour les tests unitaires. Ces démos seront l’occasion de parler des bonnes pratiques d’accès aux bases de données de type SQL (SQL Server, SQLite, SQL Azure, etc).
Finalement, je montrerai comment utiliser ce toolkit dans des procédures CLR, intégrées à SQL Server. Ces procédures accroissent de manière phénoménale les performances de gestion des données.
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiqueDenis Voituron
Le Model View ViewModel (MVVM) est une architecture et une méthode de conception utilisée dans le génie logiciel. Apparu en 2004, MVVM est adapté pour le développement des applications basées sur les technologies Windows (desktop, tablette ou mobile), mais également Web/HTML5. Cette méthode permet de séparer la vue de la logique et de l'accès aux données en accentuant les principes de binding et d’événement. Une bonne vue générale a été donnée par Laurent Bugnion, le père du MVVMLight, dans le podcast #11 de DevApps (http://devapps.be/podcast/11).
http://www.meetup.com/fr-FR/micbelgique/events/228368909/?eventId=228368909
2. 2007
Principal Microsoft .NET Architect chez Trasys / NRB
Denis Voituron
1995
Ingénieur Civil (Mons – Belgique)
1999
Fondateur d’une société spécialisée dans les CMS
dvoituron@outlook.com
@DenisVoituron
https://www.dvoituron.com
2015
Créateur et animateur du podcast DevApps.be
5. Qu’est ce que SQL CLR ?
Intégration du moteur d’exécution .NET dans SQL Server
• Intégration de la machine virtuelle du Framework .NET :
Common Language Runtime (CLR).
• Mise à disposition de fonctionnalités de développement riches
et hébergées par SQL Server.
• La couche d'hébergement coordonne les chargements des
assemblies (DLL), les tâches (Threads), la mémoire, la sécurité,
le contexte d'exécution, etc.
• Propose de nouvelles fonctionnalités sécurisées
(contrairement aux Extended Stored Procedures – xp)
SQL Engine
Windows
SQL OS
Hosting Layer
CLR
Disponible depuis SQL Server 2005
Pas (encore) dans Azure SQL Database SQL Server dans une VM Azure
7. SQL CLR et Azure
Le 19 avril 2017, Scott Guthrie a présenté Azure SQL Managed Instance
https://channel9.msdn.com/Events/Data-Science/Microsoft-Data-Amp-2017
8. Intégration du CLR dans SQL Server
SELECT value FROM sys.dm_clr_properties WHERE name = 'version'
Catégorie 2005 2008 2012 / 2014 / 2016
Supported .NET
Framework Libraries
CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml
+ System.Core
System.Xml.Linq
User-Defined Types
User-Defined Aggregates
Table-Valued Functions
Max 8000 bytes
Max 8000 bytes & 1 input parameter
No
Max 2 GB
Max 2 GB & 1 or more parameters
Yes
CLR Version 2.0 4.0
.NET Framework
Version
2.0 / 3.0 / 3.5 4.0 / 4.5 / 4.5.x
.NET Framework Version
Installed with SQL Server
2.0 3.5 SP1 4.0
Ref: http://www.sqlservercentral.com/articles/Stairway+Series/119429
11. Activer les CLR
Par défaut, les CLR ne sont pas activées.
SqlContext est un object .NET qui donne accès aux composants
• IsAvailable - Détermine si le contexte est disponible.
• WindowsIdentity - Récupère l’identité de l’appelant.
• SqlTriggerContext - Fournit des informations sur le déclencheur qui a été activé.
• SqlPipe - Canal pour envoyer des messages ou des résultats.
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
12. Créer une fonction CLR “Scalaire”
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
CREATE ASSEMBLY [MyLibrary]
FROM 'C:MyLibrary.dll'
WITH PERMISSION_SET = SAFE
CREATE FUNCTION [ComparableTo] (@source NVARCHAR(MAX), @target NVARCHAR(MAX))
RETURNS BIT
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[ComparableTo];
SELECT dbo.ComparableTo('Van Deput va à l''école', 'Vandeput va a l''ecole ')
13. Déployer dans SQL Server
Utilisation de SqlClrDeployment https://github.com/Apps72/Dev.SqlClrDeployement
SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)ProjectsV12;Database=Scott;"
SqlClrDeployment MyLibrary.dll –output=MonScript.sql
14. Créer une fonction CLR “Table”
public static IEnumerable GetTable()
{
public class MyData
{
public int Id { get; set; }
public DateTime HireDate { get; set; }
}
var connection = new SqlConnection("context connection=true");
connection.Open();
using (var adapter = new SqlDataAdapter(" SELECT EMPNO AS ID, HIREDATE FROM EMP ", connection))
{
var data = new DataTable();
adapter.Fill(data);
}
var result = new List<MyData>();
foreach (DataRow row in data.Rows)
{
result.Add(new MyData()
{
Id = Convert.ToInt32(row["ID"]),
HireDate = Convert.ToDateTime(row["HIREDATE"])
});
}
return result;
15. Créer une fonction CLR “Table”
public static IEnumerable GetTable()
{
using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection()))
{
cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP ");
return cmd.ExecuteTable<MyData>();
}
}
Install-Package Apps72.Dev.Data.SqlServerClr
public class MyData
{
public int Id { get; set; }
public DateTime HireDate { get; set; }
public int Year
{
get { return DateTime.Today.Year - HireDate.Year; }
}
}
16. CREATE FUNCTION [GetTable] ()
RETURNS TABLE(ID INT, Year INT)
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[GetTable];
Créer une fonction CLR “Table”
[SqlFunction(DataAccess = DataAccessKind.Read,
FillRowMethodName = "FillRow_Table",
TableDefinition = "ID INT, Year INT")]
public static IEnumerable GetTable()
{
using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection()))
{
cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP ");
return cmd.ExecuteTable<MyData>();
}
}
private static void FillRow_Table(Object obj, out int id, out int year)
{
var item = (MyData)obj;
id = item.Id;
year = item.Year;
}
SELECT * FROM dbo.GetTable()
ID Year
7369 37
7499 36
17. Créer un déclencheur
[SqlTrigger(Target = "EMP", Event = "FOR INSERT, UPDATE")]
public static void EMP_Inserted()
{
string action = Enum.GetName(typeof(TriggerAction), SqlContext.TriggerContext.TriggerAction);
SqlContext.Pipe.Send($"{action} raised.");
}
CREATE TRIGGER [EMP_Inserted]
ON EMP FOR INSERT, UPDATE
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[EMP_Inserted];
UPDATE EMP SET ENAME = 'SMITH' WHERE EMPNO = 7369
Update raised.
(1 row(s) affected)
18. Créer un fonction d’agrégation
[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = -1)]
public struct StringJoin : IBinarySerialize
{
private List<string> values;
public void Init() {
values = new List<string>();
}
public void Accumulate(SqlString Value) {
values.Add(Value.IsNull ? string.Empty : Value.Value);
}
public void Merge(StringJoin Group) {
values.AddRange(Group.values);
}
public SqlString Terminate() {
values.Sort();
return new SqlString(string.Join("; ", values.ToArray()));
}
...
SELECT dbo.StringJoin(DNAME) FROM DEPT
ACCOUNTING; OPERATIONS; RESEARCH; SALES
20. Quand utiliser SQL CLR ?
Utiliser...
• Performances
o Traitements ligne par ligne (forward only).
o Logique (trop) complexes pour le T-SQL.
o A la place des curseurs.
• Maintenance
o Gestion centralisée du code.
o Simplification des Unit Tests.
o Versionning des DLLs.
• Fonctionnalités
o Fonctionnalités importantes du .NET.
o Logique métier dépendant de tiers.
Ne pas utiliser...
• Si la fonctionnalité existe en T-SQL.
• Pour les commandes DML.
• Pour gérer uniquement des
données.
• Quand la base de données doit être
portable.
• Pour gérer la base sous forme
d’objets.
22. Références
• Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)
http://www.sqlservercentral.com/articles/Stairway+Series/119429
• Top things developers should know about SQL Server
https://channel9.msdn.com/Blogs/dpeeast/Northeast-Roadshow-
Top-things-developers-should-know-about-SQL-Server-Part-1
• Professional SQL Server 2005 CLR Programming
https://www.amazon.com/dp/0470054034
• Introduction to SQL Server CLR Integration
https://docs.microsoft.com/en-
us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration
• SqlDatabaseCommand – CLR
https://www.nuget.org/packages/Apps72.Dev.Data.SqlServerClr
• SqlClrDeployment.exe
https://github.com/Apps72/Dev.SqlClrDeployement
Concepts
Hello World
(démo)
Avantages &
Inconvénients
Ouvrir Visual Studio
Créer un nouveau projet de type Class Library avec le nom MyLibrary
Ecrire le code suivant
using System;
using System.Linq;
using Microsoft.SqlServer.Server;
using System.Globalization;
namespace MyLibrary
{
public class MyClass
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
}
}
Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
Ouvrir Visual Studio
Créer un nouveau projet de type Class Library avec le nom MyLibrary
Ecrire le code suivant
using System;
using System.Linq;
using Microsoft.SqlServer.Server;
using System.Globalization;
namespace MyLibrary
{
public class MyClass
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
}
}
Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
Ouvrir Visual Studio
Créer un nouveau projet de type Class Library avec le nom MyLibrary
Ecrire le code suivant
using System;
using System.Linq;
using Microsoft.SqlServer.Server;
using System.Globalization;
namespace MyLibrary
{
public class MyClass
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
}
}
Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
Ouvrir Visual Studio
Créer un nouveau projet de type Class Library avec le nom MyLibrary
Ecrire le code suivant
using System;
using System.Linq;
using Microsoft.SqlServer.Server;
using System.Globalization;
namespace MyLibrary
{
public class MyClass
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
}
}
Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”