<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Benjamin Devuyst</title>
	<atom:link href="https://blog.developpez.com/bdevuyst/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/bdevuyst</link>
	<description>:)</description>
	<lastBuildDate>Mon, 16 Mar 2020 06:57:16 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Server Sent Event &#8211; implémentation simple en c#</title>
		<link>https://blog.developpez.com/bdevuyst/p13191/dotnet-net/server-sent-event-implementation-csharp</link>
		<comments>https://blog.developpez.com/bdevuyst/p13191/dotnet-net/server-sent-event-implementation-csharp#comments</comments>
		<pubDate>Mon, 16 Mar 2020 06:57:16 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Sources]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=197</guid>
		<description><![CDATA[Il arrive que l&#8217;on ai besoin de permettre à un backend de notifier une app cliente (push). Pour ce faire, dotnet met à notre disposition SignalR. Or, si les contraintes techniques ne permettent pas de le mettre en oeuvre (ou si votre idéologie est contre), la solution du Server Sent Event peut être un candidat solide. En effet, SSE est : &#8211; Léger &#8211; Simple à mettre en oeuvre (client ou server) &#8211; Interopérable (java [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il arrive que l&rsquo;on ai besoin de permettre à un backend de notifier une app cliente (push).<br />
Pour ce faire, dotnet met à notre disposition SignalR.<br />
Or, si les contraintes techniques ne permettent pas de le mettre en oeuvre (ou si votre idéologie est contre), la solution du Server Sent Event peut être un candidat solide.</p>
<p>En effet, SSE est :<br />
&#8211; Léger<br />
&#8211; Simple à mettre en oeuvre (client ou server)<br />
&#8211; Interopérable (java / dotnet dans mon cas)<br />
&#8211; Transparent sur le réseau (ne nécessite que http)</p>
<p>Le lien suivant vous permet de disposer d&rsquo;une implémentation simple en C# de SSE&#8230;</p>
<p>https://github.com/benjamin-devuyst/dotnet.serversentevents.client/tree/master/Foxrough.ServerSentEvents.Client/</p>
<p>Plus d&rsquo;infos sur SSE : https://medium.com/conectric-networks/a-look-at-server-sent-events-54a77f8d6ff7</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS Build outputs par projet</title>
		<link>https://blog.developpez.com/bdevuyst/p12842/dotnet-net/tfs-build-outputs-par-projet</link>
		<comments>https://blog.developpez.com/bdevuyst/p12842/dotnet-net/tfs-build-outputs-par-projet#comments</comments>
		<pubDate>Tue, 10 Mar 2015 10:47:44 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=190</guid>
		<description><![CDATA[Par défaut, TFS génère ses outputs dans un répertoire commun à tous les projets d&#8217;une solution. Si vous souhaitez disposer des outputs par projet, il vous faut ajouter : /p:GenerateProjectSpecificOutputFolder=true à la ligne de commande MSBuild. Cela peut s&#8217;ajouter dans les configurations de build TFS : Attention : cela ne fonctionne qu&#8217;avec MSBuild du Framework 4.5 ! Enjoy]]></description>
				<content:encoded><![CDATA[<p>Par défaut, TFS génère ses outputs dans un répertoire commun à tous les projets d&rsquo;une solution.</p>
<p>Si vous souhaitez disposer des outputs par projet, il vous faut ajouter : <strong>/p:GenerateProjectSpecificOutputFolder=true</strong> à la ligne de commande MSBuild.</p>
<p>Cela peut s&rsquo;ajouter dans les configurations de build TFS :<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Builds-MSBuildArgs.png" alt="TFS2013-Builds-MSBuildArgs" /></p>
<p><strong>Attention</strong> : cela ne fonctionne qu&rsquo;avec MSBuild du Framework 4.5 !</p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment éviter de modifier les requêtes TFS à chaque changement d&#8217;itération</title>
		<link>https://blog.developpez.com/bdevuyst/p12839/alm/comment-eviter-de-modifier-les-requetes-tfs-a-chaque-changement-diteration</link>
		<comments>https://blog.developpez.com/bdevuyst/p12839/alm/comment-eviter-de-modifier-les-requetes-tfs-a-chaque-changement-diteration#comments</comments>
		<pubDate>Wed, 04 Mar 2015 13:40:56 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[actuel]]></category>
		<category><![CDATA[changement]]></category>
		<category><![CDATA[current]]></category>
		<category><![CDATA[itération]]></category>
		<category><![CDATA[requête]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=172</guid>
		<description><![CDATA[Lorsque l&#8217;on crée un workitem dans TFS, il est de bon usage de préciser le chemin d&#8217;itération. TFS propose un ensemble de requêtes afin de manipuler les workitems de l&#8217;itération actuelle. Le problème : lorsque l&#8217;itération actuelle est modifiée, il est indispensable de modifier chaque requête traitant de l&#8217;itération actuelle afin d&#8217;adapter le filtre &#171;&#160;IterationPath&#160;&#187;. Ce billet propose une solution pour éviter ces fréquentes modifications. Le contournement est assez simple : il suffit de créer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lorsque l&rsquo;on crée un workitem dans TFS, il est de bon usage de préciser le chemin d&rsquo;itération.<br />
TFS propose un ensemble de requêtes afin de manipuler les workitems de l&rsquo;itération actuelle.<br />
<strong>Le problème </strong>: lorsque l&rsquo;itération actuelle est modifiée, il est indispensable de modifier chaque requête traitant de l&rsquo;itération actuelle afin d&rsquo;adapter le filtre &laquo;&nbsp;IterationPath&nbsp;&raquo;.</p>
<p>Ce billet propose une solution pour éviter ces fréquentes modifications.<br />
<span id="more-172"></span></p>
<p>Le contournement est assez simple : il suffit de </p>
<ul>
<li>créer une itération nommée &laquo;&nbsp;Current&nbsp;&raquo;</li>
<li>modifier les requêtes &laquo;&nbsp;Current&nbsp;&raquo; pour pointer vers cette itération</li>
<li>Ensuite, lorsque l&rsquo;itération actuelle change, il suffit de déplacer la nouvelle itération sous l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; préalablement créée</li>
</ul>
<p><strong>Info </strong>: Le but du jeu n&rsquo;est pas de compter le nombre d’occurrence du terme itération dans ce billet <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Voyons cela en détail :</p>
<ul>
<li>
<h2>Préparation</h2>
<ol>
<li>
<h3><strong>Création de l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; dans TFS</strong></h3>
<p>Ouvrir l&rsquo;éditeur d&rsquo;itérations de TFS (la capture d&rsquo;écran traite de TFS 2013)<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Iterations.png" alt="TFS2013-Iterations" /><br />
Créer une itération nommée &laquo;&nbsp;<strong>Current</strong>&nbsp;&raquo; sous Releases.</li>
<li>
<h3><strong>Edition des requêtes</strong></h3>
<p>Ouvrir le module WIT (WorkItem Tracking) de Visual Studio.<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Queries.png" alt="TFS2013-Queries" /><br />
Pour chaque requête traitant de l&rsquo;itération actuelle, modifier le filtre pour pointer vers &laquo;&nbsp;Current&nbsp;&raquo;&#8230;<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-QueryEdition.png" alt="TFS2013-QueryEdition" /><br />
Enregistrer</li>
</ol>
</li>
<li>
<h2>Lorsqu&rsquo;une itération débute</h2>
<ol>
<li>Ouvrir l&rsquo;éditeur d&rsquo;itérations de TFS (la capture d&rsquo;écran traite de TFS 2013)<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-1.png" alt="TFS2013-MoveCurrent-1" /><br />
Ci-dessus, l&rsquo;itération est nommée : &laquo;&nbsp;2015-03-04 Sprint 1&Prime;</p>
<p><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-2.png" alt="TFS2013-MoveCurrent-2" /><br />
Déplacer l&rsquo;itération (drag-drop), de son emplacement vers &laquo;&nbsp;Current&nbsp;&raquo;<br />
TFS synchronisera les workitems concernés (modification de l&rsquo;itération) dynamiquement.</p>
<p><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-3.png" alt="" /><br />
Le résultat&#8230;</li>
</ol>
</li>
<li>
<h2>Lorsqu&rsquo;une itération se termine</h2>
<p>Il suffit de déplacer l&rsquo;itération terminée pour la repositionner sur son parent. Dans mon exemple, Le résultat sera :<br /><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-4.png" alt="TFS2013-MoveCurrent-4" />
</li>
</ul>
<p>Enfin, si vous souhaitez ne pas devoir effectuer la phase de préparation à chaque création d&rsquo;un teamproject, vous pouvez toujours modifier le template TFS afin d&rsquo;intégrer l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; et les requêtes modifiées. Les projets TFS créés intégreront alors la notion d&rsquo;itération courante et les requêtes liées.</p>
<p>La notion a été trouvé ici : <a href="http://intellitect.com/transitioning-between-sprintsiterations-with-tfs/" target="_blank">Transitioning Between Sprintsiterations With TFS</a>, </p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Génération de packages ClickOnce au sein de TFS Build</title>
		<link>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build#comments</comments>
		<pubDate>Fri, 21 Jun 2013 13:26:28 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=88</guid>
		<description><![CDATA[Problématique : La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&#8217;objectif est de créer un package ClickOnce lors de l&#8217;exécution du nightly build sous TFS 2010 (industrialisation oblige). Solution #1 : Utiliser l&#8217;activity présente dans la librairie tfsbuildextensions. Inconvénients : L&#8217;utilisation de l&#8217;activity est peu documentée&#8230; Il convient donc d&#8217;ouvrir avec iLSpy l&#8217;assembly pour pouvoir la paramétrer. Cela pourra faire l&#8217;objet d&#8217;un autre billet. L&#8217;implémentation de l&#8217;activity impose à la build [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Problématique </strong>: La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&rsquo;objectif est de créer un package ClickOnce lors de l&rsquo;exécution du nightly build sous TFS 2010 (industrialisation oblige).</p>
<p><strong>Solution #1 :</strong> Utiliser l&rsquo;activity présente dans la librairie <a href="http://tfsbuildextensions.codeplex.com" title="tfsbuildextensions" target="_blank">tfsbuildextensions</a>.<br />
<em>Inconvénients </em>:</p>
<ul>
<li>L&rsquo;utilisation de l&rsquo;activity est peu documentée&#8230; Il convient donc d&rsquo;ouvrir avec iLSpy l&rsquo;assembly pour pouvoir la paramétrer.<br /> Cela pourra faire l&rsquo;objet d&rsquo;un autre billet.</li>
<li>L&rsquo;implémentation de l&rsquo;activity impose à la build de ne contenir (au plus) qu&rsquo;une seule application !
<p>En effet, la création du package ClickOnce est réalisée à la main.<br />
Les grandes lignes du processus sont les suivantes :<br />
 1. Copie du contenu du répertoire binaries de la build dans le répertoire du package<br />
 2. Renommage des fichiers en .deploy<br />
 3. Manipulation de Mage.exe pour créer le manifest de déploiement et le signer.</p>
<p>Etant donné que sous un build TFS, le répertoire des binaries est commun à tous les projets de la build, si votre solution contient plus d&rsquo;une application, le package ClickOnce généré contiendra également les binaires des autres applications&#8230;</p>
<p>Dans ce cas, il ne vous plus reste qu&rsquo;à passez votre chemin et à évaluer la solution #2 !</li>
</ul>
<p>
<strong>Solution #2 :</strong> Modification du template pour ajouter la génération du package ClickOnce par l&rsquo;appel MSBuild.<br />
<u>Étapes :</u></p>
<ol>
<li><strong>Configuration ClickOnce dans le projet concerné</strong><br />
Cela consiste à ouvrir les propriétés du projet, et a paramétrer la publication ClickOnce.<br />
Ensuite, à exécuter le wizard de déploiement afin de tester le paramétrage, et le corriger le cas échéant.<br />
Attention a ne pas oublier d&rsquo;archiver les modifications sur TFS !
</li>
<li><strong>Trouver les bons paramètres en ligne de commande msbuild</strong><br />
L&rsquo;idée est la suivante : il est possible de générer un package ClickOnce à partir d&rsquo;un appel MSBuild à condition de disposer des bons paramètres.<br />
La ligne de commande est la suivante (dans mon cas) :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">msbuild &nbsp;chemin-vers-fichier-projet.csproj<br />
&nbsp; /t:build;publish <br />
&nbsp; /p:ApplicationVersion=1.2.3.4 <br />
&nbsp; /p:BootstrapperEnabled=true <br />
&nbsp; /p:IsWebBootstrapper=true <br />
&nbsp; /p:Configuration=Release <br />
&nbsp; /p:ManifestKeyFile=chemin-vers-fichier-signature.pfx <br />
&nbsp; /p:OutputPath=chemin-vers-repertoire-sortie<br />
&nbsp; /p:InstallUrl=http://url-installation-clickonce</div></div>
<table border="1" cellpadding="5">
<tr>
<td>/t:build;publish</td>
<td>MSBuild doit exécuter Build et Publish</td>
</tr>
<tr>
<td>/p:ApplicationVersion</td>
<td>Propriété indiquant le numéro de version ClickOnce du déploiement<br />
Le format : Majeur.Mineur.Build.Revision</td>
</tr>
<tr>
<td>BootstrapperEnabled</td>
<td>Valeur indiquant si le bootstrapper (setup.exe) doit être généré.</td>
</tr>
<tr>
<td>IsWebBootstrapper</td>
<td>Valeur indiquant que le déploiement ClickOnce doit pouvoir être effectué par le Web (manifeste de déploiement xxx.application)</td>
</tr>
<tr>
<td>Configuration</td>
<td>Valeur indiquant la configuration de build (Debug, Release).</td>
</tr>
<tr>
<td>ManifestKeyFile</td>
<td>Chemin vers le fichier pfx qui signe le manifeste ClickOnce</td>
</tr>
<tr>
<td>OutputPath</td>
<td>Chemin vers le répertoire de destination du package (pour la génération)</td>
</tr>
<tr>
<td>InstallUrl</td>
<td>URL cible de l&rsquo;installation ClickOnce<br />
Ex. : http://server/monapplicationClickOnce</td>
</tr>
</table>
<p><strong>Attention :</strong> Si le fichier de signature a besoin d&rsquo;un mot de passe, il est indispensable d&rsquo;installer le certificat de l&rsquo;autorité racine dans le magasin correspondant du poste de travail, et d&rsquo;installer le certificat de signature dans le magasin my de l&rsquo;utilisateur courant.</p>
</li>
<li><strong>Modification du template de build</strong><br />
Elle consiste à ajouter une activité de type &laquo;&nbsp;MSBuild&nbsp;&raquo; après la commande MSBuild native au workflow en renseignant les paramètres obtenus à l&rsquo;étape ci dessus.<br />
Il peut être nécessaire de préciser une condition d&rsquo;exécution (&laquo;&nbsp;If&nbsp;&raquo;) si plusieurs fichiers solution sont indiqués dans la build afin d&rsquo;éviter que l&rsquo;action de packaging soit exécutée plusieurs fois.<br />
Exemple d&rsquo;utilisation dans un workflow :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png" alt="ClickOnce-TFS-Build" width="1000" height="538" class="aligncenter size-full wp-image-161" /></a></p>
<p>La paramétrage de l&rsquo;activité msbuild de packaging ressemble à ceci :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png" alt="ClickOnce-TFS-Build-Props" width="964" height="579" class="aligncenter size-full wp-image-159" /></a><br />
<br />
J&rsquo;attire votre attention sur les deux points suivants :<br />
 &#8211; Les paramètres /p: &#8230; sont injectés dans la case &laquo;&nbsp;CommandLineArguments&nbsp;&raquo;<br />
 &#8211; Le contenu de &laquo;&nbsp;CommandLineArguments&nbsp;&raquo; formatte la chaine à l&rsquo;aide de string.Format (d&rsquo;où la syntaxe {x})<br />
 &#8211; Les paramètres /t: &#8230; sont injectés dans la case &laquo;&nbsp;Targets&nbsp;&raquo;</p>
<p>Je vous laisse consulter la MSDN pour la documentation relative aux paramètre d&rsquo;une activité de build
</li>
</ol>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS 2010, build et MsTest 2012</title>
		<link>https://blog.developpez.com/bdevuyst/p11983/alm/tfs-2010-build-et-mstest-2012</link>
		<comments>https://blog.developpez.com/bdevuyst/p11983/alm/tfs-2010-build-et-mstest-2012#comments</comments>
		<pubDate>Tue, 21 May 2013 12:08:49 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=81</guid>
		<description><![CDATA[Nous disposons de projets .net réalisés en Framework 4.5 et dont la ferme ALM est TFS 2010. Ces projets disposent d&#8217;assemblies de tests, et l&#8217;intégration continue (build) exécutent ces tests. Nativement, il n&#8217;est pas possible d&#8217;exécuter des tests 4.5 sous une machine de build TFS 2010. En effet, le log d&#8217;exécution des builds atteste qu&#8217;il tente d&#8217;utiliser mstest en version 2010 : &#160;&#187; Exécuter MSTest pour les assemblys de tests C:\Program Files (x86)\Microsoft Visual Studio [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nous disposons de projets .net réalisés en Framework 4.5 et dont la ferme ALM est TFS 2010.<br />
Ces projets disposent d&rsquo;assemblies de tests, et l&rsquo;intégration continue (build) exécutent ces tests.</p>
<p>Nativement, il n&rsquo;est pas possible d&rsquo;exécuter des tests 4.5 sous une machine de build TFS 2010.<br />
En effet, le log d&rsquo;exécution des builds atteste qu&rsquo;il tente d&rsquo;utiliser mstest en version 2010 :</p>
<p>&nbsp;&raquo;<br />
<b>Exécuter MSTest pour les assemblys de tests<br />
  C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe &#8230;</b><br />
&nbsp;&raquo;</p>
<p>La solution consiste à indiquer aux agents de build quel est le chemin de mstest 2012, à savoir :</p>
<ol>
<li>Faire une copie du template de build $\BuildProcessTemplate\DefaultTemplate.xaml<br />
   Exemple de nom pour la copie : DefaultTemplate-MsTest2012</li>
<li>Ouvrir le template DefaultTemplate-MsTest2012 et rechercher les occurrence d&rsquo;activités nommées<br />
    soit &laquo;&nbsp;Exécuter MSTest&nbsp;&raquo;, soit &laquo;&nbsp;Run Test&nbsp;&raquo;</li>
<li>Renseigner dans l&rsquo;argument &laquo;&nbsp;ToolPath&nbsp;&raquo; des activités d&rsquo;exécution de MSTest le chemin du répertoire qui contient mstest pour la version 2012 sur les machines de build<br />
Chemin par défaut :<br />
  &laquo;&nbsp;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\&nbsp;&raquo;</li>
</ol>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS 2010 &#8211; Build WF &gt; CheckIn dll</title>
		<link>https://blog.developpez.com/bdevuyst/p11966/alm/tfs-2010-build-wf-checkin-dll</link>
		<comments>https://blog.developpez.com/bdevuyst/p11966/alm/tfs-2010-build-wf-checkin-dll#comments</comments>
		<pubDate>Mon, 13 May 2013 10:25:43 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=70</guid>
		<description><![CDATA[Dans le cadre de gros développements, nous séparons les projets en plusieurs solutions. Exemple : Solution 1 : Composants extérieurs ne disposant d&#8217;aucune interaction avec les couches de services métiers (drivers, interfaces avec des systèmes extérieurs, etc) Solution 2 : Composants de la couche de services métiers, ou utilisant la couche métier (excepté les applications finales) Solution 3 : Composants affectant les applications finales (exe, applications web, configuration unity, controles graphiques, reporting, etc.) Pour plus [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cadre de gros développements, nous séparons les projets en plusieurs solutions.</p>
<p>Exemple :</p>
<ul>
<li>Solution 1 : Composants extérieurs ne disposant d&rsquo;aucune interaction avec les couches de services métiers (drivers, interfaces avec des systèmes extérieurs, etc)</li>
<li>Solution 2 : Composants de la couche de services métiers, ou utilisant la couche métier (excepté les applications finales)</li>
<li>Solution 3 : Composants affectant les applications finales (exe, applications web, configuration unity, controles graphiques, reporting, etc.)</li>
</ul>
<p>Pour plus d’informations sur le multi sln : <a href="http://tfsguide.codeplex.com/" title="tfsguide.codeplex.com">tfsguide.codeplex.com</a></p>
<p>Les dll&rsquo;s générées par les projets non finaux (Solution 1 et 2 ci dessus) sont alors archivées, afin que les membres de l&rsquo;équipe ne soient pas obligés de re générer les sorties de projets à chaque modification de source effectuée par un collègue.<br />
Les références entre projets de solutions différentes étant par dll dans le repository correspondant.</p>
<p>Lorsque l&rsquo;intégration continue est en place, un build par solution est installé.<br />
Dès lors, lorsqu&rsquo;une source est archivée, le contrôleur de build initie un build de la solution concernée.</p>
<p>Etant donné que le build se produit à chaque archivage, il est de bonne augure de le responsabiliser afin qu&rsquo;il réalise lui même la mise à jour des dll lors des archivages (cela décharge donc les développeurs de cette tache).</p>
<p>Le workflow TFS 2010 situé dans l&rsquo;archive <a href="http://bdevuyst.ftp-developpez.com/blog/TFS/Template-de-build-TFS-2010-CheckIn-dll-multi-sln.zip" title="Template-de-build-TFS-2010-CheckIn-dll-multi-sln" target="_blank">Template-de-build-TFS-2010-CheckIn-dll-multi-sln.zip</a> réalise cela sur base du DefaultTemplate.xaml</p>
<p>Attention</p>
<ul>
<li>
le compte utilisateur exécuté par les services de build doit disposer de droits d&rsquo;extraction / archivage sur le répertoire !
</li>
<li>
Nous vous conseillons de ne pas exécuter deux identiques simultanément (mode continu avec un délai de xx minutes entre deux démarrages;  le délai préconisé correspond à la durée d&rsquo;exécution des builds)
</li>
<p>Edit : J&rsquo;ai modifié le WorkFlow pour permettre d&rsquo;éviter l&rsquo;évènement de CheckIn ( via RepositoryConstants.NoCICheckInComment) afin d&rsquo;éviter les builds en cascade (la solution 2 utilise les dll produites par la solution 1, du coup, si CheckIn dll Sln 1 &gt; Build Sln 2).</p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS et workflow de build</title>
		<link>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build#comments</comments>
		<pubDate>Tue, 07 May 2013 08:46:50 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=67</guid>
		<description><![CDATA[Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet ! Customize Team Build 2010 Edit 2013-05-16 : Petite précision, dans la partie Part 5 : Increase AssemblyVersion, l&#8217;auteur précise dans le code de l&#8217;activité check out l&#8217;instruction &#160;&#187; workflow.Folders &#160;&#187; pour récupérer les répertoires mappés dans le workspace. Ensuite, &#160;&#187; folder.LocalItem &#160;&#187; pour récupérer le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet !</p>
<p><a href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx" title="Customize Team Build 2010" target="_blank">Customize Team Build 2010</a></p>
<p><b>Edit 2013-05-16 :</b> Petite précision, dans la partie Part 5 : <a href="http://www.ewaldhofman.nl/post/2010/05/13/Customize-Team-Build-2010-e28093-Part-5-Increase-AssemblyVersion.aspx" title="Increase AssemblyVersion" target="_blank">Increase AssemblyVersion</a>, l&rsquo;auteur précise dans le code de l&rsquo;activité check out l&rsquo;instruction &nbsp;&raquo; workflow.Folders &nbsp;&raquo; pour récupérer les répertoires mappés dans le workspace.<br />
Ensuite, &nbsp;&raquo; folder.LocalItem &nbsp;&raquo; pour récupérer le chemin local (dans la boucle &laquo;&nbsp;pour chaque folder contenu dans le workspace&nbsp;&raquo;).<br />
Le problème est le suivant : si le workspace contient un folder cloaked, il est bien contenu dans la liste retournée par la propriété workspace.Folder, mais la propriété LocalItem est nulle ! (ce qui est logique !)<br />
Donc, lorsqu&rsquo;il est nécessaire de lister les répertoires : il faut ajouter un filtre sur soit <b>folder.IsCloaked</b> soit sur <b>string.IsNullOrEmpty(folder.LocalItem)</b> afin de ne récupérer que les folders mappés dans le workspace courant !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi solution Visual Studio et dépendances</title>
		<link>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances</link>
		<comments>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances#comments</comments>
		<pubDate>Tue, 26 Mar 2013 09:51:57 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[big]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[complex]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[multiple]]></category>
		<category><![CDATA[muti]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=56</guid>
		<description><![CDATA[Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc). Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &#62; l&#8217;utilisation de mécaniques d&#8217;injections de dépendances &#8211; en d&#8217;autres termes, Article sur les IOC), On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230; ce billet propose juste une piste de travail [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc).<br />
Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &gt; l&rsquo;utilisation de mécaniques d&rsquo;injections de dépendances &#8211; en d&rsquo;autres termes, <a href="http://philippe.developpez.com/articles/dotnet/injectiondedependances/" title="Article sur les IOC">Article sur les IOC</a>),</p>
<p>On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230;</p>
<p>ce billet propose juste une piste de travail pour ce genre de problématiques&#8230;</p>
<p>Or, d&rsquo;après les cahiers blancs MS (<a href="http://tfsguide.codeplex.com/" title="Un bon guide de mise en place des pratiques TFS">Un bon guide de mise en place des pratiques TFS</a>), des fichiers SLN de plus d&rsquo;une douzaine de projet ont des conséquences fâcheuses sur le projet :<br />
 &#8211; Absence d&rsquo;optimisation des assemblies à la compilation, (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les machines des développeurs  (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les agents de builds (intégration continue),  (je confirme)<br />
 &#8211; Piètre performance au chargement de la solution  (je confirme)<br />
 &#8211; &#8230;</p>
<p>La solution consiste à considérer les stratégies décrites dans le cahier blanc, pour éventuellement aboutir sur un Multi SLN.<br />
Exemple :<br />
 &#8211; SLN1 : Projets totalement indépendants des projets de la solution (drivers, API client de partenaires extérieurs, API commune à l&rsquo;entreprise)<br />
 &#8211; SLN2 : Projets de la couche de services, la DAL, etc.<br />
 &#8211; SLN3 : Projets propres à la couche de présentation</p>
<p>L&rsquo;exemple ci-dessus est une stratégie, d&rsquo;autres stratégies existent.</p>
<p>La règle, en termes de références entre projets, est la suivante : tous les projets situés au sein du même SLN peuvent se référencer entre eux, les liens entre projets de solutions différentes doivent se réaliser par DLL.<br />
Dès lors, les outputs des projets des solutions (excepté celle de présentation) doivent être archivées (par solution) afin de ne pas forcer les développeur à devoir régénérer toutes les SLN lorsqu&rsquo;un autre membre de l&rsquo;équipe modifie une couche intermédiaire.<br />
En d&rsquo;autres termes :<br />
 &#8211; les outputs des projets de la SLN1 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN1) puis archivés.<br />
 &#8211; les outputs des projets de la SLN2 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN2) puis archivés.</p>
<p>La commande xcopy à placer dans le postBuild Event du projet est la suivante :<br />
   xcopy /E /Y /D /R &laquo;&nbsp;$(TargetDir)*.*&nbsp;&raquo; &laquo;&nbsp;$(SolutionDir)_Build-SLN-1-[SlnName]&nbsp;&raquo;</p>
<p>/E : Copie les répertoires et sous-répertoires, y compris les répertoires vides<br />
/Y : Supprime la demande de confirmation de remplacement de fichiers de destination existants<br />
/D : Copie les fichiers modifiés à partir de la date spécifiée. Si aucune date n&rsquo;est donnée, copie uniquement les fichiers dont l&rsquo;heure source est plus récente que l&rsquo;heure de destination<br />
/R : Remplace les fichiers en lecture seule</p>
<p>La dernière option est très importante, car les dll&rsquo;s de destination sont en Read Only (puisque archivées sur TFS)&#8230; Sans le /R, on peut avoir des erreurs comme :<br />
Error	3	The command &laquo;&nbsp;xcopy /E /Y /D &laquo;&nbsp;E:\DEV\&#8230;\MonProjet\bin\Debug\*.*&nbsp;&raquo; &laquo;&nbsp;E:\DEV\_Build-SLN-1-SlnName&nbsp;&raquo; &#8230; exited with code 4.</p>
<p>Astuce : Pour vérifier le message d&rsquo;erreur réel : copier la commande remontée par Visual Studio lors des erreurs de build liées à xcopy dans une invite de commande et l&rsquo;exécuter !</p>
<p>Un dernier point : Si vous êtes confronté à ces problèmes de solutions complexes, je vous invite à<br />
 &#8211; lire le document cité ci dessus afin d&rsquo;élaborer une stratégie de multi SLN (non trivial),<br />
 &#8211; échanger avec les membres de l&rsquo;équipe, car en définitive ce sont eux qui exploiteront les SLNs !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Initialiser les données d&#8217;une base de données avec Entity Framework 5</title>
		<link>https://blog.developpez.com/bdevuyst/p11296/dotnet-net/initialiser-les-donnees-dune-base-de-donnees-avec-entity-framework-5</link>
		<comments>https://blog.developpez.com/bdevuyst/p11296/dotnet-net/initialiser-les-donnees-dune-base-de-donnees-avec-entity-framework-5#comments</comments>
		<pubDate>Mon, 10 Sep 2012 18:42:28 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[données]]></category>
		<category><![CDATA[initialisation]]></category>
		<category><![CDATA[seeding]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=44</guid>
		<description><![CDATA[Un tweet ma indiqué ce blog qui traite d&#8217;une fonctionnalité de datant seeding Intéressant ! http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx]]></description>
				<content:encoded><![CDATA[<p>Un tweet ma indiqué ce blog qui traite d&rsquo;une fonctionnalité de datant seeding<br />
Intéressant !<br />
<a href="http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx" title="http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx" target="_blank">http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recherche dans tous les champs d&#8217;une base de données SQL Server</title>
		<link>https://blog.developpez.com/bdevuyst/p11253/sql/sql_server_search_all_fields</link>
		<comments>https://blog.developpez.com/bdevuyst/p11253/sql/sql_server_search_all_fields#comments</comments>
		<pubDate>Tue, 28 Aug 2012 08:34:32 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Petit ticket, rien de nouveau, pas d&#8217;invention, juste un redit sur une procédure stoquée permettant de rechercher une chaine de caractères dans tous les champs de toutes les tables d&#8217;une base de données (de l&#8217;utile pour changer). L&#8217;origine est dans le copyright CREATE PROC [dbo].[SearchAllTables] ( @SearchStr nvarchar(100) ) AS BEGIN -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. -- Purpose: To search all columns of all tables for a given search string [&#8230;]]]></description>
				<content:encoded><![CDATA[<div>
Petit ticket, rien de nouveau, pas d&rsquo;invention, juste un redit sur une procédure stoquée permettant de rechercher une chaine de caractères dans tous les champs de toutes les tables d&rsquo;une base de données (de l&rsquo;utile pour changer).<br />
L&rsquo;origine est dans le copyright <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" />
</div>
<p><!-- HTML generated using hilite.me -->
<div style="background: #ffffff; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #008000; font-weight: bold">CREATE</span> PROC [dbo].[SearchAllTables]
(
    <span style="color: #303030">@</span>SearchStr nvarchar(<span style="color: #0000D0; font-weight: bold">100</span>)
)
<span style="color: #008000; font-weight: bold">AS</span>
<span style="color: #008000; font-weight: bold">BEGIN</span>
    <span style="color: #808080">-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.</span>
    <span style="color: #808080">-- Purpose: To search all columns of all tables for a given search string</span>
    <span style="color: #808080">-- Written by: Narayana Vyas Kondreddi</span>
    <span style="color: #808080">-- Site: http://vyaskn.tripod.com</span>
    <span style="color: #808080">-- Tested on: SQL Server 7.0 and SQL Server 2000</span>
    <span style="color: #808080">-- Date modified: 28th July 2002 22:50 GMT</span>
    <span style="color: #008000; font-weight: bold">CREATE</span> <span style="color: #008000; font-weight: bold">TABLE</span> <span style="color: #303030">#</span>Results (ColumnName nvarchar(<span style="color: #0000D0; font-weight: bold">370</span>), ColumnValue nvarchar(<span style="color: #0000D0; font-weight: bold">3630</span>))

    <span style="color: #008000; font-weight: bold">SET</span> NOCOUNT <span style="color: #008000; font-weight: bold">ON</span>

    <span style="color: #008000; font-weight: bold">DECLARE</span> <span style="color: #303030">@</span>TableName nvarchar(<span style="color: #0000D0; font-weight: bold">256</span>), <span style="color: #303030">@</span>ColumnName nvarchar(<span style="color: #0000D0; font-weight: bold">128</span>), <span style="color: #303030">@</span>SearchStr2 nvarchar(<span style="color: #0000D0; font-weight: bold">110</span>)
    <span style="color: #008000; font-weight: bold">SET</span>  <span style="color: #303030">@</span>TableName <span style="color: #303030">=</span> <span style="background-color: #fff0f0">&#39;&#39;</span>
    <span style="color: #008000; font-weight: bold">SET</span> <span style="color: #303030">@</span>SearchStr2 <span style="color: #303030">=</span> QUOTENAME(<span style="background-color: #fff0f0">&#39;%&#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>SearchStr <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;%&#39;</span>,<span style="background-color: #fff0f0">&#39;&#39;&#39;&#39;</span>)

    WHILE <span style="color: #303030">@</span>TableName <span style="color: #008000; font-weight: bold">IS</span> <span style="color: #008000; font-weight: bold">NOT</span> <span style="color: #008000; font-weight: bold">NULL</span>
    <span style="color: #008000; font-weight: bold">BEGIN</span>
        <span style="color: #008000; font-weight: bold">SET</span> <span style="color: #303030">@</span>ColumnName <span style="color: #303030">=</span> <span style="background-color: #fff0f0">&#39;&#39;</span>
        <span style="color: #008000; font-weight: bold">SET</span> <span style="color: #303030">@</span>TableName <span style="color: #303030">=</span> 
        (
            <span style="color: #008000; font-weight: bold">SELECT</span> <span style="color: #008000; font-weight: bold">MIN</span>(QUOTENAME(TABLE_SCHEMA) <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;.&#39;</span> <span style="color: #303030">+</span> QUOTENAME(<span style="color: #008000; font-weight: bold">TABLE_NAME</span>))
            <span style="color: #008000; font-weight: bold">FROM</span>     INFORMATION_SCHEMA.TABLES
            <span style="color: #008000; font-weight: bold">WHERE</span>         TABLE_TYPE <span style="color: #303030">=</span> <span style="background-color: #fff0f0">&#39;BASE TABLE&#39;</span>
                <span style="color: #008000; font-weight: bold">AND</span>    QUOTENAME(TABLE_SCHEMA) <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;.&#39;</span> <span style="color: #303030">+</span> QUOTENAME(<span style="color: #008000; font-weight: bold">TABLE_NAME</span>) <span style="color: #303030">&gt;</span> <span style="color: #303030">@</span>TableName
                <span style="color: #008000; font-weight: bold">AND</span>    OBJECTPROPERTY(
                        OBJECT_ID(
                            QUOTENAME(TABLE_SCHEMA) <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;.&#39;</span> <span style="color: #303030">+</span> QUOTENAME(<span style="color: #008000; font-weight: bold">TABLE_NAME</span>)
                             ), <span style="background-color: #fff0f0">&#39;IsMSShipped&#39;</span>
                               ) <span style="color: #303030">=</span> <span style="color: #0000D0; font-weight: bold">0</span>
        )

        WHILE (<span style="color: #303030">@</span>TableName <span style="color: #008000; font-weight: bold">IS</span> <span style="color: #008000; font-weight: bold">NOT</span> <span style="color: #008000; font-weight: bold">NULL</span>) <span style="color: #008000; font-weight: bold">AND</span> (<span style="color: #303030">@</span>ColumnName <span style="color: #008000; font-weight: bold">IS</span> <span style="color: #008000; font-weight: bold">NOT</span> <span style="color: #008000; font-weight: bold">NULL</span>)
        <span style="color: #008000; font-weight: bold">BEGIN</span>
            <span style="color: #008000; font-weight: bold">SET</span> <span style="color: #303030">@</span>ColumnName <span style="color: #303030">=</span>
            (
                <span style="color: #008000; font-weight: bold">SELECT</span> <span style="color: #008000; font-weight: bold">MIN</span>(QUOTENAME(<span style="color: #008000; font-weight: bold">COLUMN_NAME</span>))
                <span style="color: #008000; font-weight: bold">FROM</span>     INFORMATION_SCHEMA.COLUMNS
                <span style="color: #008000; font-weight: bold">WHERE</span>         TABLE_SCHEMA    <span style="color: #303030">=</span> PARSENAME(<span style="color: #303030">@</span>TableName, <span style="color: #0000D0; font-weight: bold">2</span>)
                    <span style="color: #008000; font-weight: bold">AND</span>    <span style="color: #008000; font-weight: bold">TABLE_NAME</span>    <span style="color: #303030">=</span> PARSENAME(<span style="color: #303030">@</span>TableName, <span style="color: #0000D0; font-weight: bold">1</span>)
                    <span style="color: #008000; font-weight: bold">AND</span>    DATA_TYPE <span style="color: #008000; font-weight: bold">IN</span> (<span style="background-color: #fff0f0">&#39;char&#39;</span>, <span style="background-color: #fff0f0">&#39;varchar&#39;</span>, <span style="background-color: #fff0f0">&#39;nchar&#39;</span>, <span style="background-color: #fff0f0">&#39;nvarchar&#39;</span>, <span style="background-color: #fff0f0">&#39;int&#39;</span>, <span style="background-color: #fff0f0">&#39;decimal&#39;</span>)
                    <span style="color: #008000; font-weight: bold">AND</span>    QUOTENAME(<span style="color: #008000; font-weight: bold">COLUMN_NAME</span>) <span style="color: #303030">&gt;</span> <span style="color: #303030">@</span>ColumnName
            )
    
            IF <span style="color: #303030">@</span>ColumnName <span style="color: #008000; font-weight: bold">IS</span> <span style="color: #008000; font-weight: bold">NOT</span> <span style="color: #008000; font-weight: bold">NULL</span>
            <span style="color: #008000; font-weight: bold">BEGIN</span>
				print <span style="color: #303030">@</span>TableName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;.&#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>ColumnName
                <span style="color: #008000; font-weight: bold">INSERT</span> <span style="color: #008000; font-weight: bold">INTO</span> <span style="color: #303030">#</span>Results
                <span style="color: #008000; font-weight: bold">EXEC</span>
                (
                    <span style="background-color: #fff0f0">&#39;SELECT &#39;&#39;&#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>TableName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;.&#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>ColumnName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;&#39;&#39;, LEFT(&#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>ColumnName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39;, 3630) </span>
<span style="background-color: #fff0f0">                    FROM &#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>TableName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39; (NOLOCK) &#39;</span> <span style="color: #303030">+</span>
                    <span style="background-color: #fff0f0">&#39; WHERE &#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>ColumnName <span style="color: #303030">+</span> <span style="background-color: #fff0f0">&#39; LIKE &#39;</span> <span style="color: #303030">+</span> <span style="color: #303030">@</span>SearchStr2
                )
            <span style="color: #008000; font-weight: bold">END</span>
        <span style="color: #008000; font-weight: bold">END</span>    
    <span style="color: #008000; font-weight: bold">END</span>

    <span style="color: #008000; font-weight: bold">SELECT</span> ColumnName, ColumnValue <span style="color: #008000; font-weight: bold">FROM</span> <span style="color: #303030">#</span>Results
<span style="color: #008000; font-weight: bold">END</span>
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
