<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7058247137761535314</id><updated>2011-04-21T18:37:37.371-07:00</updated><category term='Bases de données'/><title type='text'>.NET for Vikings</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-5901884908006938429</id><published>2009-05-23T06:56:00.001-07:00</published><updated>2009-05-24T06:33:12.270-07:00</updated><title type='text'>Windows 7 : Windows XP Mode</title><content type='html'>&lt;blockquote&gt;   &lt;p&gt;&amp;#160; Une autre grande nouveauté de Windows Seven vient de l’intégration directe d’une machine virtuelle Windows XP.&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; En effet, il vous suffira de télécharger la version &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=65E1C5EB-DF9B-415F-B2D6-27F6EF5DCEB9&amp;amp;displaylang=fr" target="_blank"&gt;Beta de Virtual PC 2007&lt;/a&gt; ainsi que le &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=0E8FA9B3-C236-4B77-BE26-173F032F5159&amp;amp;displaylang=fr" target="_blank"&gt;Windows XP mode Beta&lt;/a&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Une fois les deux packages installés, Windows configure automatiquement la machine virtuelle, vous pourrez sauvegarder automatiquement les login et password à utiliser avec votre vm XP pour accélérer son démarrage. Ensuite, il ne vous reste plus qu’à installer les applications que vous souhaitez utiliser dans la machine XP, et de créer les raccourcis à la racine du menu Démarrer. les raccourcis ajoutés ainsi deviennent automatiquement visibles dans le menu de la machine hôte (comptez quand même une bonne dizaine de secondes avant que le raccourci apparaisse) . &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_eKxbMzGjkoE/ShgAcR4LWNI/AAAAAAAAADo/9vBhGc0Dyb8/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_eKxbMzGjkoE/ShgAdK11U6I/AAAAAAAAADs/gitKUwEWaU0/image_thumb%5B5%5D.png?imgmax=800" width="667" height="183" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_eKxbMzGjkoE/ShgAdfuoPJI/AAAAAAAAADw/Vfj77BnT9MI/s1600-h/image%5B14%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_eKxbMzGjkoE/ShgAd3yzmyI/AAAAAAAAAD0/B24XGP9ErC0/image_thumb%5B6%5D.png?imgmax=800" width="244" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lorsque vous lancez l’application, la fenêtre de votre logiciel apparaît avec le style windows XP directement dans votre environnement Seven :&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_eKxbMzGjkoE/ShgAhUV3yUI/AAAAAAAAAD4/N_U73wr9oeQ/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_eKxbMzGjkoE/ShgAjISTR9I/AAAAAAAAAD8/Urs7ndb6KWw/image_thumb%5B9%5D.png?imgmax=800" width="657" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-5901884908006938429?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/5901884908006938429/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=5901884908006938429' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/5901884908006938429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/5901884908006938429'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/windows-7-windows-xp-mode.html' title='Windows 7 : Windows XP Mode'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_eKxbMzGjkoE/ShgAdK11U6I/AAAAAAAAADs/gitKUwEWaU0/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-3272359326843122436</id><published>2009-05-21T12:58:00.001-07:00</published><updated>2009-05-21T15:23:54.951-07:00</updated><title type='text'>Visual Studio 2010 Beta 1 accessible au grand public</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; ça y est c’est parti, la toute dernière version de Visual Studio 2010 est accessible en libre téléchargement pour le grand public :&lt;/p&gt;  &lt;p&gt;2 versions sont accessibles : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=75cbcbcd-b0e8-40ea-adae-85714e8984e3&amp;amp;displaylang=en" target="_blank"&gt;Visual studio 2010 Professionnel&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=85520793-68fc-4361-a8b6-dc2cff49c8d2&amp;amp;displaylang=en" target="_blank"&gt;Visual studio 2010 Team System&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;les principales nouveautés introduites&amp;#160; consistent en une refonte de l’interface utilisateur de Visual Studio (recodée en WPF), La version bêta du Framework .NET 4.0, des facilités de développement sur la plateforme Azure de Microsoft, et bien d’autres choses encore ! (plus d’infos &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx" target="_blank"&gt;ici&lt;/a&gt; et &lt;a href="http://msdn.microsoft.com/fr-fr/vstudio/dd441784(en-us).aspx" target="_blank"&gt;là&lt;/a&gt;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-3272359326843122436?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/3272359326843122436/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=3272359326843122436' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/3272359326843122436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/3272359326843122436'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/visual-studio-2010-beta-1-accessible-au.html' title='Visual Studio 2010 Beta 1 accessible au grand public'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-2577959481288265900</id><published>2009-05-18T03:29:00.001-07:00</published><updated>2009-05-21T06:41:11.147-07:00</updated><title type='text'>Lire les fichiers de configuration (.INI) en C#</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Les fichiers .INI sont des fichiers texte classiques, structurés de la façon suivante : &lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 108px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[SECTION]&lt;br /&gt;Key0 = value_for_this_key&lt;br /&gt;Key1 = value_for_this_key&lt;br /&gt;&lt;br /&gt;[SECTION2]&lt;br /&gt;Key0 = value_for_this_key&lt;br /&gt;&lt;br /&gt;[....]&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Pour les lire, nous pouvons simplement faire appel aux API standards de Windows contenues dans la DLL Kernel32 :&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[DllImport(&lt;span style="color: #006080"&gt;&amp;quot;kernel32&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; WritePrivateProfileString(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; section,&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; val, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath);&lt;br /&gt;[DllImport(&lt;span style="color: #006080"&gt;&amp;quot;kernel32&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetPrivateProfileString(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; section,&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; def, StringBuilder retVal,&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; size, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; L’utilisation de ces méthodes est très intuitive.&amp;#160; Prenons comme exemple les fichiers favoris d’Internet Explorer.&amp;#160; Ces fichiers ont une extension .URL, mais leur structure est celle d’un fichier de configuration classique. considérons le fichier suivant :&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 167px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[&lt;span style="color: #0000ff"&gt;DEFAULT&lt;/span&gt;]&lt;br /&gt;BASEURL=http://thoums.blogspot.com/&lt;br /&gt;[{000214A0-0000-0000-C000-000000000046}]&lt;br /&gt;Prop3=19,2&lt;br /&gt;[InternetShortcut]&lt;br /&gt;URL=http://thoums.blogspot.com/&lt;br /&gt;IDList=&lt;br /&gt;IconFile=http://thoums.blogspot.com/favicon.ico&lt;br /&gt;IconIndex=1&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160; Pour lire le champ BASEURL il suffit d’écrire :&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;StringBuilder valeur = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuilder(32768);&lt;br /&gt;GetPrivateProfileString(&lt;span style="color: #006080"&gt;&amp;quot;DEFAUT&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;BASEURL&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, valeur, valeur.MaxCapacity, &lt;span style="color: #006080"&gt;@&amp;quot;C:\MyFavorite.URL&amp;quot;&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(valeur.ToString());&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; L’écriture se fait de la même manière. Notez que si la section dans laquelle vous souhaitez ajouter une clé n’existe pas, elle sera crée, de même que la clé. Par ailleurs si vous tentez d’écrire dans un fichier qui n’existe pas, il sera également créé. Cette méthode n’est pas liée à l’extension du fichier, tout fichier texte ayant une structure [Section] clé=valeur,&amp;#160; pourra être traité de cette façon.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-2577959481288265900?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/2577959481288265900/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=2577959481288265900' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/2577959481288265900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/2577959481288265900'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/lire-les-fichiers-ini-en-c.html' title='Lire les fichiers de configuration (.INI) en C#'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-6036533041202638755</id><published>2009-05-17T12:15:00.001-07:00</published><updated>2009-05-17T23:57:33.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bases de données'/><title type='text'>“Le fournisseur de données .Net Framework demandé est introuvable. Il n'est peut-être pas installé.”</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; J’ai eu cette erreur en travaillant sur une base de donnée Oracle avec le client &lt;a href="http://www.oracle.com/technology/software/tech/windows/odpnet/index.html" target="_blank"&gt;Oracle 11g ODAC 11.1.0.6.21&lt;/a&gt;. Pour une raison que j’ignore encore, le provider Oracle pour ADO .NET ne s’était pas inscrit dans mon fichier machine.config. N’ayant pas trop envie de modifier ce fichier sans connaître les répercutions précises que ça pourrait avoir, la solution intermédiaire que j’ai trouvée est de rajouter l’enregistrement suivant dans le fichier App.Config de mon application : &lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 242px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Oracle Data Provider for .NET Version 11.1.0.6.0&amp;quot;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #ff0000"&gt;invariant&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Oracle.DataAccess.Client&amp;quot;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Oracle Data Provider for .NET Version 11.1.0.6.0&amp;quot;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess,&lt;br /&gt;           Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;et là, miracle, tout marche nickel.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a07d12e0-b4bc-480e-816d-e3a0831ac314" class="wlWriterEditableSmartContent"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/Oracle" rel="tag"&gt;Oracle&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ODP+.NET" rel="tag"&gt;ODP .NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ArgumentException" rel="tag"&gt;ArgumentException&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DbProviderFactory" rel="tag"&gt;DbProviderFactory&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-6036533041202638755?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/6036533041202638755/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=6036533041202638755' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/6036533041202638755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/6036533041202638755'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/le-fournisseur-de-donnees-net-framework.html' title='“Le fournisseur de données .Net Framework demandé est introuvable. Il n&amp;#39;est peut-être pas installé.”'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-6714692294579970322</id><published>2009-05-17T09:40:00.000-07:00</published><updated>2009-05-18T00:01:53.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bases de données'/><title type='text'>Tutoriel ADO .NET : utilisation des DbProviderFactories</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;(Ce billet fait suite à l’article : &lt;a href="http://thoums.blogspot.com/2009/05/abstraction-des-acces-bdd-dans-une.html" target="_blank"&gt;Abstraction des Accès BDD dans une Factory&lt;/a&gt; )&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Entrons un peu plus dans le détail maintenant que nous avons une vue générale de ce que Microsoft à mis à notre disposition. nous allons donc réaliser une Classe nommée ConnectDb&amp;#160; encapsulant l’utilisation des types vus précédemment :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_eKxbMzGjkoE/ShApDRW3EtI/AAAAAAAAABE/T-nSZK_MH9I/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh4.ggpht.com/_eKxbMzGjkoE/ShApD0xYOvI/AAAAAAAAABI/gZ8ITEV5yVA/image_thumb4.png?imgmax=800" width="177" height="240" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; La classe ConnectDb contient un ensemble de méthodes statiques qui couvrent les opérations de base pour accéder à une base de données.&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Personnellement j’ai choisi de la définir en &lt;em&gt;abstract&lt;/em&gt; puisque toutes ses méthodes sont statiques et qu’elle n’a pas vocation à être instanciée. On aurait pu mettre le constructeur par défaut en privé, le résultat serait le même, je pense que c’est surtout une question de goût…&lt;/p&gt;  &lt;p&gt;Voyons en détail l’implémentation de cette classe.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Implémentation&lt;/h3&gt;  &lt;h4&gt;Gestion des paramètres de connexion&lt;/h4&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Pour ma part j’ai choisi de stocker la chaîne de connexion, ainsi que le provider choisi dans un fichier de configuration (Pour savoir comment créer votre propre fichier de configuration,vous pouvez consulter &lt;a href="http://thoums.blogspot.com/2009/05/net-c-enregistrer-une-connectionstring.html" target="_blank"&gt;ce billet&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Voici à quoi ressemble mon fichier App.config :&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MyDefaultConnectionString&amp;quot;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Data Source=MYSERVER\SQLEXPRESS;Initial Catalog=MyDataBase;Integrated Security=True;Pooling=False&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MyDefaultProvider&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Pour mon exemple j’ai choisi d’utiliser une base de données SQL Server et le provider correspondant : Sytem.Data.SqlClient . Bien entendu, la suite du code fonctionnera avec n’importe quel provider implémentant les Types abstraits du namespace &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.aspx" target="_blank"&gt;System.Data.Common&lt;/a&gt;.&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; String _connectionString;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; String _provider;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ConnectDb()&lt;br /&gt;{&lt;br /&gt;    _connectionString = ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080"&gt;&amp;quot;MyDefaultConnectionString&amp;quot;&lt;/span&gt;].ConnectionString;&lt;br /&gt;    _provider = ConfigurationManager.AppSettings[&lt;span style="color: #006080"&gt;&amp;quot;MyDefaultProvider&amp;quot;&lt;/span&gt;].ToString();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; J’ai défini un constructeur statique pour récupérer les valeurs de la chaîne de connexion et le provider choisi depuis le fichier de configuration. Un constructeur static est appelé automatiquement à la première référence du type. Il ne nécessite donc pas d’instanciation explicite .&lt;/p&gt;

&lt;h3&gt;Utilisation de la factory&lt;/h3&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; La récupération de la factory pour un provider spécifique se fait à l’aide de la classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactories.aspx" target="_blank"&gt;DbProviderFactories&lt;/a&gt;. Pour ma part j’ai choisi de l’encapsuler dans une Propriété “Factory” :&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DbProviderFactory Factory&lt;br /&gt;{   get&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; DbProviderFactories.GetFactory(_provider);&lt;br /&gt;    }&lt;br /&gt;}     &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; A ce stade nous disposons donc d’une instance d’un type implémentant DbProviderFactory, spécifique au provider que nous avons choisi. (dans mon cas il s’agit en interne d’une instance de&amp;#160; System.Data.SqlClient.SqlClientFactory).&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Parmi l’ensemble&amp;#160; des méthodes que nous propose l’objet &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactory.aspx" target="_blank"&gt;DbProviderFactory&lt;/a&gt; , nous n’en utiliserons que deux dans le cadre de cet article : &lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;//Crée une instance d'un objet de type DbCommand&lt;/span&gt;&lt;br /&gt;Factory.CreateCommand();&lt;br /&gt;&lt;span style="color: #008000"&gt;//Crée une instance d'un objet de type DbConnection&lt;/span&gt;&lt;br /&gt;Factory.CreateConnection();&lt;br /&gt;            &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160; voyons comment les utiliser :&lt;/p&gt;

&lt;h3&gt;Connexion à la Base de données&lt;/h3&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Rien de bien compliqué ici, on appelle la méthode CreateConnection() de la factory, puis on affecte la Chaîne de connection à l’objet &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.aspx" target="_blank"&gt;DbConnection&lt;/a&gt; que l’on a récupéré.&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DbConnection GetConnection()&lt;br /&gt;{&lt;br /&gt;    DbConnection conn = Factory.CreateConnection();&lt;br /&gt;    conn.ConnectionString = ConnectionString;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; conn;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Attention, l’objet connexion retourné est FERME. la connexion à la base n’est donc pas active. J’ai choisit de ne pas retourné d’objet systématiquement ouvert pour ne pas risquer d’oublier de le refermer. Cela permet donc de garder le contrôle sur le pool de connexion ouvertes.&lt;/p&gt;

&lt;h3&gt;Manipulation des objets &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbcommand.aspx" target="_blank"&gt;DbCommand&lt;/a&gt;&lt;/h3&gt;

&lt;h4&gt;&amp;#160;&amp;#160;&amp;#160; Création&lt;/h4&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Une fois la connexion à la base de donnée gérée, il ne reste plus qu’à envoyer les requêtes. C’est là que l’objet DbCommand entre en jeu. Il y a 2 façons de créer un objet commande: en utilisant la factory, ou en passant par un objet DbConnection : &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Solution 1 &lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DbCommand CreateCommand()&lt;br /&gt;{&lt;br /&gt;    DbCommand cmd = Factory.CreateCommand();            &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; cmd;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Solution 2 &lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DbCommand CreateCommand()&lt;br /&gt;{&lt;br /&gt;    DbConnection conn = GetConnection();&lt;br /&gt;    DbCommand cmd = conn.CreateCommand();&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; cmd;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Pour ma part je préfère la première version. C’est encore une fois assez discutable, la raison est que je préfère garder mes objets indépendants les uns des autres le plus longtemps possible. &lt;/p&gt;

&lt;h4&gt;Envoi d’une requête&lt;/h4&gt;

&lt;p&gt;&amp;#160;&amp;#160; Une fois notre Objet DbCommand créé nous pouvons lui affecter une requête simple à l’aide de la propriété CommandText (nous verrons par la suite comment faire pour créer des commandes paramétrées&amp;quot;) :&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;DbCommand cmd = ConnectDb.CreateCommand();&lt;br /&gt;cmd.CommandText = &lt;span style="color: #006080"&gt;&amp;quot;SELECT Champ1, Champ2 FROM MATABLE WHERE Champ3='toto'&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160; &lt;u&gt;Attention&lt;/u&gt; : La syntaxe des requêtes SQL peut différer d’un SGBD à l’autre, c’est pourquoi, si l’on veut conserver la souplesse de notre factory, l’affectation d’une requête SQL à une DbCommand doit être effectuée EN DEHORS de la classe ConnectDb, par exemple dans une classe de DAO classique.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nous pouvons regrouper les différents types de requête en 3 catégories :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Les requêtes de Sélection&lt;/strong&gt; qui renvoient un ensemble de données (SELECT .. FROM… JOIN.. WHERE) &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Les ordres DDL&lt;/strong&gt; qui renverront la plupart du temps un nombre d’enregistrements affectés (Update, Delete,Insert…) &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Les requêtes Scalaires&lt;/strong&gt; qui retournent un champ unique dans un enregistrement unique (ex : “SELECT Count(*) FROM matable”, “SELECT ORACLE_SEQUENCE.NEXTVAL FROM dual”) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Typiquement nous pouvons donc créer 3 méthodes de requêtage pour gérer les différents cas. Le code de ces méthodes diffère assez peu, dans tous les cas, il nous faut récupérer un objet DbConnection, l’ouvrir et l’affecter à l’objet DbCommand contenant la requête.&lt;/p&gt;

&lt;p&gt;Comme un exemple vaut mieux qu’un long discours, voici l’implémentation de ces fonctions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;ExecuteQuery&lt;/strong&gt; (requêtes de Sélection)&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DbDataReader ExecuteQuery(DbCommand cmd)&lt;br /&gt;{&lt;br /&gt;    DbDataReader ret;&lt;br /&gt;    DbConnection conn = GetConnection();&lt;br /&gt;        conn.Open();&lt;br /&gt;        cmd.Connection = conn;&lt;br /&gt;    cmd.cr&lt;br /&gt;        ret = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ret;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; L’objet &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbdatareader.aspx" target="_blank"&gt;DbDataReader&lt;/a&gt; est un Curseur sur un ensemble d’enregistrement en provenance de la base de donnée en mode connecté, un peu à la manière des vieux recordset. c’est donc dans cet objet que sont renvoyés les enregistrements sélectionnés par la commande. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Le paramètre passé à la méthodes ExecuteReader() de l’objet DbCommand est une énumération qui&amp;#160; permet de s’assurer que la connexion sera fermée en même temps que le DataReader. En effet, pour que ce dernier fonctionne correctement, la connexion sur laquelle il repose doit rester ouverte jusqu’au dernier moment. On ne peut donc pas fermer la connexion immediatement après la création du DataReader.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;ExecuteNonQuery &lt;/strong&gt;(ordres DDL)&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ExecuteNonQuery(DbCommand cmd)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ret;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbConnection conn = GetConnection())&lt;br /&gt;            {&lt;br /&gt;                conn.Open();&lt;br /&gt;                cmd.Connection = conn;&lt;br /&gt;                ret = cmd.ExecuteNonQuery();&lt;br /&gt;                conn.Close();&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ret;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ici le code est assez similaire à la méthode précédente, on notera cette fois la présence du bloc using autour de l’objet DbConnection. En effet Microsoft à eu la bonne idée d’implémenter IDisposable sur ces objets. Ainsi, dans le cas de l’objet DbConnection, on est sûr que quoiqu’il arrive, la méthode Dispose() sera appelée, et que la connexion à la base, fermée. &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;ExecuteScalar &lt;/strong&gt;(requêtes Scalaires)&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; ExecuteScalar(DbCommand cmd)&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; ret;&lt;br /&gt;           &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbConnection conn = GetConnection())&lt;br /&gt;           {&lt;br /&gt;               conn.Open();&lt;br /&gt;               cmd.Connection = conn;&lt;br /&gt;               ret = cmd.ExecuteScalar();&lt;br /&gt;               conn.Close();&lt;br /&gt;               &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ret;&lt;br /&gt;           }&lt;br /&gt;       }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Encore une fois, le code ne diffère pas énormément de la méthode ExecuteQuery(), la seule chose à noter est que le type de retour de la méthode est de type object. il vous faudra donc penser lors de l’utilisation, à effectuer un cast sur la valeur retournée en fonction du type que vous attendez. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Maintenant que nous avons nos 3 méthodes, l’exécution d’une requête est simplissime :&lt;/p&gt;

&lt;p&gt;ex:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;//requête simple&lt;/span&gt;&lt;br /&gt;DbCommand cmd = ConnectDb.CreateCommand();&lt;br /&gt;cmd.CommandText = &lt;span style="color: #006080"&gt;&amp;quot;SELECT * FROM Personne where prenom = ‘toto’&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;DbDataReader reader = ConnectDb.ExecuteQuery(cmd);&lt;br /&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (reader.Read())&lt;br /&gt;{&lt;br /&gt;    System.Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Nom : {0} ,Prenom : {1} , mail : {2}&amp;quot;&lt;/span&gt;,reader[&lt;span style="color: #006080"&gt;&amp;quot;nom&amp;quot;&lt;/span&gt;],reader[&lt;span style="color: #006080"&gt;&amp;quot;prenom&amp;quot;&lt;/span&gt;],reader[&lt;span style="color: #006080"&gt;&amp;quot;mail&amp;quot;&lt;/span&gt;]);&lt;br /&gt;}&lt;br /&gt;reader.Close();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Le parcours d’un objet DbDataReader se fait grâce à la méthode booléenne Read(). A la construction de l’objet le curseur pointe AVANT le tout premier enregistrement. A chaque appel de Read(), le curseur passe à l’enregistrement suivant, si l’on est arrivé à la fin du DataReader ou si la requête n’a aucun résultat , Read() renvoi False.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Pour accéder aux champs des enregistrement, vous pouvez soit utiliser la méthode “tableaux” à l’aide de crochets : reader[“nomColonne”] ou reader[NumColonne&amp;quot;], sans oublier de caster correctement les valeurs de retour. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Ou bien encore utiliser toute les méthodes reader.GetXXXX() pour récupérer directement une valeur typée.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous avons vu qu’il était très simple d’envoyer une requête à la base de données, cependant il peut parfois être utile de paramétrer une requête, c’est à dire, dissocier les valeurs des champs. Cela permet un traitement plus automatisé, plus optimisé et plus sûr des requêtes, notamment au niveau des attaques par injection de code SQL. Voyons ensemble comment écrire de telles requêtes.&lt;/p&gt;

&lt;h3&gt;Création d’une requête paramétrée&lt;/h3&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Créer une requête paramétrée n’est pas bien plus difficile que de créer une requête sans paramètre : reprenons un objet DbCommand, et voyons quelles autres méthodes s’offrent à nous : &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous avons une Méthode CreateParameter() et une propriété Parameters qui contient la liste de tous les paramètres associés à cette commande.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Avant d’associer des paramètres à une DbCommand, il faut tout d’abord référencer ces paramètres dans la requête elle même. cela se fait grâce à un mot clé choisi par vous-même, précédé d’un symbole qui indiquera au provider que la chaîne de caractère suivante est un paramètre. Ce symbole varie d’un provider à l’autre, voici un tableau récapitulant ceux que je connais :&lt;/p&gt;

&lt;div&gt;
  &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="200"&gt;Oracle&lt;/td&gt;

        &lt;td valign="top" width="200"&gt;‘:’ + NomParametre&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="200"&gt;SqlServer&lt;/td&gt;

        &lt;td valign="top" width="200"&gt;‘@’+ NomParametre&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="200"&gt;Access&lt;/td&gt;

        &lt;td valign="top" width="200"&gt;‘?’+ NomParametre&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Il nous faut ensuite créer les paramètres à proprement parler et leur donner leur valeur. rien de plus simple, on crée un objet DbParameter à l’aide de la méthode CreateParameter de la DbCommand et on affecte les propriétés suivantes : &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;ParameterName&lt;/strong&gt; : chaîne de caractères correspondant au paramètre dans la requête (sans le symbole)&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;Value&lt;/strong&gt; : valeur à affecter au paramètre&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;DbType&lt;/strong&gt; (facultatif) : Type à affecter au paramètre&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puis on ajoute le paramètre créé à la Liste des paramètres de la commande. A partir de là la commande s’exécute exactement comme une commande normale, à l’aide des 3 méthodes que nous avons définies plus haut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt; &lt;strong&gt;d’une requête d’insertion&lt;/strong&gt;: on suppose que l’on dispose d’une table personne dans notre base de données : &lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_eKxbMzGjkoE/ShBYWMj-9II/AAAAAAAAABs/lWS2whDvS40/s1600-h/image1%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_eKxbMzGjkoE/ShEHciPBFfI/AAAAAAAAADY/0eL-KoPZy44/image1_thumb.png?imgmax=800" width="211" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 350px; max-height: 500px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; height: 194px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;p&gt;&lt;span style="color: #008000"&gt;//requête Parametrée&lt;/span&gt;&lt;br /&gt;DbCommand cmd2 = ConnectDb.CreateCommand();&lt;br /&gt;cmd2.CommandText = &lt;span style="color: #006080"&gt;&amp;quot;INSERT INTO Personne (mail,nom,prenom)VALUES (@mail,@nom,@prenom)&amp;quot;&lt;/span&gt;;&lt;br /&gt;DbParameter mailParam = cmd2.CreateParameter();&lt;br /&gt;mailParam.ParameterName = &lt;span style="color: #006080"&gt;&amp;quot;mail&amp;quot;&lt;/span&gt;;&lt;br /&gt;mailParam.Value = &lt;span style="color: #006080"&gt;&amp;quot;uneadressemail@kkpart.com&amp;quot;&lt;/span&gt;;&lt;br /&gt;cmd2.Parameters.Add(mailParam);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DbParameter nomParam = cmd2.CreateParameter();&lt;br /&gt;nomParam.ParameterName = &lt;span style="color: #006080"&gt;&amp;quot;nom&amp;quot;&lt;/span&gt;;&lt;br /&gt;nomParam.Value = &lt;span style="color: #006080"&gt;&amp;quot;COVILLE&amp;quot;&lt;/span&gt;;&lt;br /&gt;cmd2.Parameters.Add(nomParam);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;DbParameter prenomParam = cmd2.CreateParameter();&lt;br /&gt;prenomParam.ParameterName = &lt;span style="color: #006080"&gt;&amp;quot;prenom&amp;quot;&lt;/span&gt;;&lt;br /&gt;prenomParam.Value = &lt;span style="color: #006080"&gt;&amp;quot;Thomas&amp;quot;&lt;/span&gt;;&lt;br /&gt;cmd2.Parameters.Add(prenomParam);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;ConnectDb.ExecuteNonQuery(cmd2);&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Et voilà, vous disposez désormais d’une classe complète permettant de gérer tout vos accès base en mode connecté, de façon totalement indépendante du SGBD choisi !&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Nous pouvons cependant aller encore plus loin grâce à la généricité. En effet pourquoi se contenter d’utiliser un DbDataReader, quand on peut facilement disposer d’une Liste d’objets directement prêts à l’usage ? C’est ce que nous allons faire de suite :&lt;/p&gt;

&lt;h3&gt;La Methode Find&amp;lt;T&amp;gt;(…)&lt;/h3&gt;

&lt;h4&gt;Implémentation&lt;/h4&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; L’objectif de cette méthode, est d’obtenir, en se basant sur une DbCommand on ne peut plus classique, une liste d’objets de type T&amp;#160; (générique donc). &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Pour ce Faire nous allons utiliser la notion de delegate et plus particulièrement le Type Func&amp;lt;Targ0, TResult&amp;gt; ajouté dans le framework 3.5 . Grosso modo, c’est une référence vers une fonction qui prendrait un paramètre de type Targ0 et renverrait un objet de type TResult. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; L’intérêt pour nous, c’est que nous allons donc pouvoir ajouter en paramètre de notre méthode Find, un delegate qui prendrait en Parametre un DbDataReader et renverrait un objet de Type T&amp;#160; remplit avec les données du DbDataReader. Pour faire simple, le delegate serait un “traducteur” pour passer d’un DbDataReader, vers une List&amp;lt;T&amp;gt;.&lt;/p&gt;

&lt;p&gt;Voici donc à quoi ressemble notre Méthode Find :&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; List&amp;lt;T&amp;gt; Find&amp;lt;T&amp;gt;(DbCommand cmd, Func&amp;lt;DbDataReader, T&amp;gt; ParseObject)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbDataReader rs = ExecuteQuery(cmd))&lt;br /&gt;    {&lt;br /&gt;        List&amp;lt;T&amp;gt; retList = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (rs.Read())&lt;br /&gt;        {&lt;br /&gt;            T oRow = ParseObject(rs);&lt;br /&gt;            retList.Add(oRow);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; retList;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160; Tout comme le type DbConnection,&amp;#160; le type DbDataReader implémente IDisposable. On ne se privera donc pas de l’entourer d’une directive using, pour s’assurer que les connections à la base seront correctement fermées. A l’aide de la méthode ExecuteQuery() que nous avons codée précédemment, nous récupérons le DbDataReader correspondant à notre DbCommand.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160; Puis, pour chaque Enregistrement du DataReader, nous appelons le delegate passé en paramètre à notre méthode find&amp;#160; (Parseobject()). Il ne nous reste plus qu’à ajouter l’objet de Type T à la List&amp;lt;T&amp;gt; et à retourner cette liste une fois le reader entièrement parcouru. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160; Très bien me direz vous, mais comment ça s’utilise ce machin ? démonstration :&lt;/p&gt;

&lt;h4&gt;Utilisation &lt;/h4&gt;

&lt;p&gt;&amp;#160;&amp;#160; Considérons tout d’abord que dans notre Base de données, nous avons une table Personne contenant les champs suivants : &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160; Reprenons l’exemple de notre table Personne : &lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_eKxbMzGjkoE/ShEHciPBFfI/AAAAAAAAADg/ZmF6eLC_t7s/image11.png?imgmax=800" width="211" height="142" /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous réalisons une classe Personne dans notre programme pour la manipulation des données :&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Personne&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; String NomPrenom&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; String Mail;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; J’ai fait exprès de Concaténer dans ma Classe les champs Nom et Prenom et d’omettre le champ Age,&amp;#160; pour bien montrer que les structure des classes du programme peuvent être différente de celles des tables de la base.&lt;/p&gt;

&lt;p&gt;nous créons notre requête de sélection :&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 66px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;DbCommand cmd = ConnectDb.CreateCommand();&lt;br /&gt;cmd.CommandText = &lt;span style="color: #006080"&gt;&amp;quot;SELECT * FROM Personne&amp;quot;&lt;/span&gt;;&lt;br /&gt;           &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Il ne reste plus qu’à appeler notre fameuse méthode Find() . Avant cela je dois introduire la notion d’Anonymous Delegate. Grâce à ce concept nous allons pouvoir passer directement à notre Func&amp;lt;DbDataReader,T&amp;gt;, un bloc de code qui sera interprété comme une fonction :&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;List&amp;lt;Personne&amp;gt; personnes = ConnectDb.Find(cmd, &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;(DbDataReader rs)&lt;br /&gt;    {&lt;br /&gt;        Personne p = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Personne();&lt;br /&gt;        p.mail = rs[&lt;span style="color: #006080"&gt;&amp;quot;mail&amp;quot;&lt;/span&gt;].ToString();&lt;br /&gt;        p.NomPrenom = rs[&lt;span style="color: #006080"&gt;&amp;quot;Nom&amp;quot;&lt;/span&gt;].ToString() + rs[&lt;span style="color: #006080"&gt;&amp;quot;prenom&amp;quot;&lt;/span&gt;].ToString();&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; p;&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Le code est donc dérisoirement simple, on passe donc en paramètre au find notre delegate et directement à la ligne, grâce au délégué anonyme nous mettons notre bloc de traitement. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Remarquez une chose assez intéressante, je n’ai pas spécifié le type générique utilisé pour la méthode Find. Alors que pourtant, le prototype de la fonction est bien Find&amp;lt;T&amp;gt;(…). En fait, le compilateur C# est “intelligent”, et déduit du code, le type générique utilisé et est capable de déterminer si il est correct ou non. Ce mécanisme s’appelle Inférence de Type. &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160; Rentrons maintenant dans une amélioration introduite par le framework 3.5, et que permet d’utiliser Func&amp;lt;Targ,TResult&amp;gt; : Les lambda Expressions. L’explication détaillée des lambda expressions n’entre pas dans le cadre de cet article, je me permet juste de vous montrer comment aurait pu s’écrire l’appel à la méthode Find en utilisant ce mécanisme, libre à vous d’approfondir vos recherches sur ce sujet :&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;List&amp;lt;Personne&amp;gt; personnesLambda = ConnectDb.Find(cmd, rs =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Personne()&lt;br /&gt;{               &lt;br /&gt;    mail = rs[&lt;span style="color: #006080"&gt;&amp;quot;mail&amp;quot;&lt;/span&gt;].ToString(),&lt;br /&gt;    NomPrenom = rs[&lt;span style="color: #006080"&gt;&amp;quot;Nom&amp;quot;&lt;/span&gt;].ToString() + rs[&lt;span style="color: #006080"&gt;&amp;quot;prenom&amp;quot;&lt;/span&gt;].ToString()                &lt;br /&gt;});&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Les lambda expressions reposent en grande partie sur l’Inférence de type dont je vous parlais plus haut.&amp;#160; Décomposons les grandes lignes de ce code :&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Tout d’abord le &lt;font face="Courier New"&gt;rs =&amp;gt; new Personne(). J&lt;/font&gt;’ai volontairement conservé les nom des variables pour que l’exemple soit plus clair:&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Par inférence de type, le compilateur déduit que la variable rs doit être de type DbDataReader. la flèche (=&amp;gt;) introduit ensuite une ligne de code, devant nécessairement retourner dans notre cas, un objet de Type Personne (toujours par inférence de type). Je n’ai donc qu’à instancier mon objet personne et à initialiser ses membres publics.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ceci n’est qu’un exemple extrêmement simpliste de ce qu’il est possible de faire à l’aide des lambda Expressions, si vous souhaitez approfondir cette voie, je vous conseille d’effectuer des recherches sur LINQ introduit également au framework 3.5, au sujet duquel j’écrirais sans doute un article sous peu.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Nous avons donc désormais entre les mains, une classe permettant d’abstraire tous les accès à une base de données, assez souple pour interagir avec n’importe quel provider .NET implémentant les classes du namespace System.Data.Common.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160; Pour conclure, je joint à cet article le &lt;a href="http://thoums.free.fr/SOURCES/DbFactorySample.zip" target="_blank"&gt;code source&lt;/a&gt; (librement utilisable, distribuable, commercialisable, etc) complet de cette classe avec les exemples que nous avons vu, et reste à votre entière disposition si vous avez des questions, ou simplement envie de débattre d’une autre méthode d’implémentation. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;#160; Notez bien que tout le code que nous avons écrit ne manipule QUE les objets &lt;u&gt;abstraits&lt;/u&gt; du namespace System.Data.Common. &lt;u&gt;EN AUCUN CAS&lt;/u&gt; la classe ConnectDb ne doit contenir de référence à un provider spécifique. Nous perdrions d’emblée tout l’intérêt de l’utilisation d’une factory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7c57ac2f-b65d-4551-bb82-fc09bb3d2d29" class="wlWriterEditableSmartContent"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DbProviderFactory" rel="tag"&gt;DbProviderFactory&lt;/a&gt;,&lt;a href="http://technorati.com/tags/System.Data.Common" rel="tag"&gt;System.Data.Common&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/base+de+donn%c3%a9es" rel="tag"&gt;base de donn&amp;#233;es&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-6714692294579970322?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/6714692294579970322/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=6714692294579970322' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/6714692294579970322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/6714692294579970322'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/net-c-35-utilisation-de.html' title='Tutoriel ADO .NET : utilisation des DbProviderFactories'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_eKxbMzGjkoE/ShApD0xYOvI/AAAAAAAAABI/gZ8ITEV5yVA/s72-c/image_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-7979254379430526644</id><published>2009-05-17T08:59:00.001-07:00</published><updated>2009-05-17T12:51:19.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bases de données'/><title type='text'>Enregistrer une ConnectionString dans un fichier de configuration</title><content type='html'>&lt;p&gt;Pour stocker une chaîne de connexion à une base de donnée en dehors de l’application, la solution la plus simple est l’utilisation d’un fichier de configuration. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_eKxbMzGjkoE/ShA0TcqIlwI/AAAAAAAAABc/lREyQjbrank/s1600-h/image%5B1%5D.png" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p  ="&amp;lt;p"&gt;&lt;em&gt;Ajouter un nouvel élément à votre projet, de type “Application configuration File”. Visual studio vous ajoute alors un fichier de configuration vide.&lt;/em&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_eKxbMzGjkoE/ShA0TcqIlwI/AAAAAAAAABc/lREyQjbrank/s1600-h/image%5B1%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_eKxbMzGjkoE/ShA0TyzH6GI/AAAAAAAAABk/UAPllm3IxRM/image_thumb.png?imgmax=800" width="296" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Entre les balises &lt;font color="#ff0000"&gt;&amp;lt;configuration&amp;gt;&lt;/font&gt; et &lt;font color="#ff0000"&gt;&amp;lt;/configuration&amp;gt;&lt;/font&gt;, ajoutez un élément &lt;font color="#ff0000"&gt;&amp;lt;connectionString&amp;gt;&lt;/font&gt; ajoutez un élément &lt;font color="#ff0000"&gt;&amp;lt;add /&amp;gt;&lt;/font&gt; l’Intellisense vous propose une liste d’attributs, les plus important sont &lt;font color="#ff0000"&gt;Name &lt;/font&gt;&lt;font color="#000000"&gt;et &lt;font color="#ff0000"&gt;ConnectionString&lt;/font&gt; . Voici un exemple pour une chaîne de connexion à SQL Server :&lt;/font&gt;&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MyConnectionString&amp;quot;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Data Source=MYSERVER\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False&amp;quot;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Si vous ne savez pas quelle est la chaîne de connexion correspondant à votre base de donnée, consultez cet excellent site : &lt;a title="http://www.connectionstrings.com/" href="http://www.connectionstrings.com/"&gt;http://www.connectionstrings.com/&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Utilisation dans le code &lt;/h4&gt;

&lt;p&gt;Une fois votre fichier de configuration constitué, vous pouvez très simplement récupérer les valeurs saisies depuis votre code, à l’aide de la classe &lt;a href="http://msdn.microsoft.com/en-us/library/ms134260(VS.90)" target="_blank"&gt;ConfigurationManager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ajoutez une référence vers l’assembly System.configuration, vous pourrez ensuite récupérer la chaîne à l’aide de la ligne suivante : &lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 53px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;String connectionString = ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080"&gt;&amp;quot;MyDefaultConnectionString&amp;quot;&lt;/span&gt;].ConnectionString;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Et voilà, connectionString contient désormais la chaîne de connexion à votre base.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;u&gt;Note&lt;/u&gt; : Si votre solution comporte plusieurs projets, le fichier de configuration doit être placé dans le projet qui contient le point d’entrée de votre application.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;u&gt;Note 2&lt;/u&gt; : Gardez bien à l’esprit que le fichier de configuration n’est pas chiffré par défaut ! Si vous décidez de stocker vos mots de passe en clair dans le fichier, ceux-ci pourront être visible à l’aide d’un simple éditeur de texte.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-7979254379430526644?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/7979254379430526644/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=7979254379430526644' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/7979254379430526644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/7979254379430526644'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/net-c-enregistrer-une-connectionstring.html' title='Enregistrer une ConnectionString dans un fichier de configuration'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_eKxbMzGjkoE/ShA0TyzH6GI/AAAAAAAAABk/UAPllm3IxRM/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7058247137761535314.post-1210163989648154844</id><published>2009-05-17T08:30:00.000-07:00</published><updated>2009-05-17T23:59:29.009-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bases de données'/><title type='text'>Abstraction des Accès BDD dans une Factory en ADO .NET</title><content type='html'>&lt;p align="justify"&gt;Dans le cadre du développement d’une application reposant sur l’utilisation d’une base de données, il est important de penser à la réutilisabilité de son code. Il n’est pas question de réécrire toute une application à chaque changement de moteur de BDD. Une des solution est donc de rajouter une couche intermédiaire entre la partie business et la base de donnée. Dans le pire des cas, seule cette couche est à réécrire. &lt;/p&gt;  &lt;p align="justify"&gt;En allant plus loin, il est possible d’intégrer les accès base dans une fabrique abstraite (factory). Microsoft nous a mâché le travail, depuis le framework .Net 2.0 le namespace &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.aspx" target="_blank"&gt;System.Data.Common&lt;/a&gt; contient tout ce qu’il nous faut pour le faire facilement. Voici rapidement les types les plus important contenus dans ce namespace:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;table border="1" cellspacing="0" cellpadding="2" width="463"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="184"&gt;           &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactories.aspx" target="_blank"&gt;DbProviderFactories&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="277"&gt;           &lt;p align="left"&gt;Conteneur de Factory. C’est à travers ce type, que l’on va pouvoir binder notre architecture abstraite à un provider spécifique.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="188"&gt;           &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactory.aspx" target="_blank"&gt;DbProviderFactory&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="277"&gt;           &lt;p align="left"&gt;Type implémenté pour chaque provider, c’est à travers un objet de ce type que l’on pourra instancier tous les types du provider choisi.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="191"&gt;           &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.aspx" target="_blank"&gt;DbConnection&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="277"&gt;           &lt;p align="left"&gt;Type gérant la connexion à la base.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="194"&gt;           &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbcommand.aspx" target="_blank"&gt;DbCommand&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="277"&gt;           &lt;p align="left"&gt;Type permettant d’envoyer des commandes (paramétrées ou nom) dans une DbConnection.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="196"&gt;           &lt;p align="left"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbdatareader.aspx" target="_blank"&gt;DbDataReader&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="277"&gt;           &lt;p align="left"&gt;Retour de l’exécution d’une DbCommand (un peu l’équivalent des bons vieux recordsets d’antan…)&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;h4&gt;Providers&lt;/h4&gt;  &lt;div align="justify"&gt;Microsoft a déjà intégré un certain nombre de providers se conformant à cette architecture :&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;System.Data.SqlClient (SQL Server) &lt;/li&gt;    &lt;li&gt;System.Data.OleDb (MS Access) &lt;/li&gt;    &lt;li&gt;System.Data.OracleClient (Oracle DataBase) &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;D’autre providers sont disponibles sur internet, pour connaître ceux dont vous disposez sur votre machine vous pouvez soit jeter un oeil dans le fichier machine.config du framework à la section &amp;lt;DbProviderFactories&amp;gt;. Soit appeler la Méthode static&amp;#160; GetFactoryClasses() du type DbConnectionFactory :&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 144px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; height: 123px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;DataTable tab =  DbProviderFactories.GetFactoryClasses();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (DataRow row &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; tab.Rows)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (DataColumn col &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; tab.Columns)&lt;br /&gt;    {&lt;br /&gt;        System.Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;{0} = {1} ;&amp;quot;&lt;/span&gt;, col.ColumnName, row[col]);&lt;br /&gt;    }&lt;br /&gt;    Console.WriteLine(Environment.NewLine);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:50c065c2-eeb6-42e8-9d6d-6b27d245cbf6" class="wlWriterEditableSmartContent"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BDD" rel="tag"&gt;BDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ADO+.NET" rel="tag"&gt;ADO .NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Factory" rel="tag"&gt;Factory&lt;/a&gt;,&lt;a href="http://technorati.com/tags/System.Data.Common" rel="tag"&gt;System.Data.Common&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7058247137761535314-1210163989648154844?l=thoums.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoums.blogspot.com/feeds/1210163989648154844/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7058247137761535314&amp;postID=1210163989648154844' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/1210163989648154844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7058247137761535314/posts/default/1210163989648154844'/><link rel='alternate' type='text/html' href='http://thoums.blogspot.com/2009/05/abstraction-des-acces-bdd-dans-une.html' title='Abstraction des Accès BDD dans une Factory en ADO .NET'/><author><name>Thomas COVILLE</name><uri>http://www.blogger.com/profile/06321391603909773838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_eKxbMzGjkoE/SJGOGp8S3mI/AAAAAAAAAAM/EYM1F1CW6as/S220/thoums%40msn.com_957316bb.jpg'/></author><thr:total>0</thr:total></entry></feed>
