<?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-7520131191484008290</id><updated>2012-01-30T20:09:10.117-08:00</updated><category term='C#'/><category term='Crystal Report'/><category term='javascript'/><category term='CSS'/><category term='cookies'/><category term='SQL Server'/><category term='asp.net'/><category term='Culture'/><category term='Reflexion'/><category term='XML'/><category term='casting'/><category term='RegEx'/><category term='framework'/><category term='code'/><category term='DataBinding'/><category term='VB'/><category term='utils'/><category term='Excel'/><category term='HTTP'/><title type='text'>ASP.NET Garage</title><subtitle type='html'>Tricks &amp; tips from a asp.net developper.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-7778100146076630402</id><published>2009-05-14T08:21:00.000-07:00</published><updated>2009-05-14T08:30:21.745-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Ajax request</title><content type='html'>Simple reusable asynchronous multibrowser ajax function.&lt;br /&gt;&lt;br /&gt;Call a page by javascript and pass the html result to a function when it arrives (.  The url to load by HTTP GET method, and the callback function name are passed as parameters. All the litteral content of the result page is passed as parameter.&lt;br /&gt;&lt;br /&gt;Note: some security features, like in Firefox, can block AJAX request to other domains than the domain of the calling webpage (where the script is executed from).&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;function ajaxRequest(url, callbackFunction)&lt;br /&gt;{&lt;br /&gt;   var xmlhttp=&lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;   &lt;span class="rem"&gt;/*@cc_on @*/&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/*@if (@_jscript_version &amp;gt;= 5)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    // JScript gives us Conditional compilation, we can cope with old IE versions.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    // and security blocked creation of the objects.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     try {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     } catch (e) {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;      try {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;      } catch (E) {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;       xmlhttp = false;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    @end @*/&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;if&lt;/span&gt; (!xmlhttp &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;typeof&lt;/span&gt; XMLHttpRequest!=&lt;span class="str"&gt;'undefined'&lt;/span&gt;)&lt;br /&gt;   {&lt;br /&gt;     xmlhttp = &lt;span class="kwrd"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;br /&gt;   }&lt;br /&gt;    xmlhttp.open(&lt;span class="str"&gt;"GET"&lt;/span&gt;, url,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(callbackFunction != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        xmlhttp.onreadystatechange=function()&lt;br /&gt;        {&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlhttp.readyState  == 4)&lt;br /&gt;               {&lt;br /&gt;                   callbackFunction(xmlhttp.responseText);&lt;br /&gt;               }&lt;br /&gt;       }&lt;br /&gt;      &lt;br /&gt;    }&lt;br /&gt;   xmlhttp.send(&lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;function sampleCallBackFunction(httpResponseText)&lt;br /&gt;{&lt;br /&gt;   alert(httpResponseText);&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// sample calls&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;ajaxRequest(&lt;span class="str"&gt;"http://www.someurl.com"&lt;/span&gt;,sampleCallBackFunction);&lt;br /&gt;ajaxRequest(document.location,sampleCallBackFunction);//show current page source&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-7778100146076630402?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/7778100146076630402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=7778100146076630402' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7778100146076630402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7778100146076630402'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2009/05/ajax-request.html' title='Ajax request'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-635237441474800374</id><published>2009-03-25T05:17:00.000-07:00</published><updated>2009-03-25T05:26:08.741-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RegEx'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Parse HTML Table with RegEx in .NET</title><content type='html'>This is used to parse an html table. Practical to obtain results from a web page, formatted in a table.&lt;br /&gt;&lt;br /&gt;The algorithm requires to know the number of colums to parse. Then, using regex, it loops in all the lines of the tables, and the content of each column of theeese line is inside the m.Groups[index].Value.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ParseHtmlTable(&lt;span class="kwrd"&gt;string&lt;/span&gt; html)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Basic html table pattern&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; columnPattern = &lt;span class="str"&gt;@"\&amp;lt;TD[^\&amp;gt;]*\&amp;gt;([^\&amp;lt;]*)\&amp;lt;\/TD\&amp;gt;"&lt;/span&gt;;&lt;br /&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; betweenColumnsPattern = &lt;span class="str"&gt;@"[^\&amp;lt;]*"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Construct the global pattern for a given nomber of columns&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; nbColums = 11;&lt;br /&gt;&lt;br /&gt; StringBuilder sbPattern = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt; &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; nbColums; i++)&lt;br /&gt; {&lt;br /&gt;     sbPattern.Append(columnPattern);&lt;br /&gt;     sbPattern.Append(betweenColumnsPattern);&lt;br /&gt; }&lt;br /&gt; sbPattern.Append(columnPattern);&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Parse the result&lt;/span&gt; &lt;br /&gt; Regex r = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(sbPattern.ToString(), RegexOptions.IgnoreCase);&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Match m &lt;span class="kwrd"&gt;in&lt;/span&gt; r.Matches(html))&lt;br /&gt; {&lt;br /&gt;     &lt;span class="rem"&gt;// example&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; insideCell1 = m.Groups[0].Value;&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; insideCell2 = m.Groups[2].Value;&lt;br /&gt;&lt;br /&gt;     &lt;span class="rem"&gt;/// do things..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-635237441474800374?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/635237441474800374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=635237441474800374' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/635237441474800374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/635237441474800374'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2009/03/parse-html-table-with-regex.html' title='Parse HTML Table with RegEx in .NET'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-884786437122977714</id><published>2009-03-20T05:42:00.000-07:00</published><updated>2009-03-20T05:46:14.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><title type='text'>Helper library to read CSV file</title><content type='html'>Here is an interesting and very well done library to read CSV files, fast and without problems:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/database/CsvReader.aspx"&gt;http://www.codeproject.com/KB/database/CsvReader.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With this library, excel sheets can be save as CSVs and opened safely by any .NET application without any other dependencies (jet provider, office automation or else).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-884786437122977714?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/884786437122977714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=884786437122977714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/884786437122977714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/884786437122977714'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2009/03/helper-library-to-read-csv-file.html' title='Helper library to read CSV file'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5514341047809477773</id><published>2009-02-13T07:50:00.000-08:00</published><updated>2009-02-13T08:02:19.209-08:00</updated><title type='text'>Delimited string helper class in C#</title><content type='html'>Build delimited strings with less code!&lt;br /&gt;&lt;br /&gt;Having to build a string with elements delimited with special characters for a CSV file, a HTTP GET  request or any other purpose?&lt;br /&gt;How many times did you made a loop to construct the string, having to user a flag to check if the delimiter have to be added, either at the beginning or the end or the string, to make sure chere is not an intrusive delimiter in the result? To make sure the string don't have the delimiter at the beginning or at the end?&lt;br /&gt;&lt;br /&gt;This simple class uses a StringBuilder to construct a key / value string delimited with a given character or string just between elements.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// To construct a string delimited only between elements.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Simple helper class to construct dynamically a delimited string&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// with the delimiter inserted automatically only between elements,&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// not at the beginnig nor at the end of the resulting string.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;///&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Uses a StringBuilder as the inner builder.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Denis Sauvé&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DelimitedStringBuilder&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; delimiter = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(); &lt;br /&gt;&lt;span class="rem"&gt;// inner StringBuilder, as StringBuilder class cannot be inherited&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// New instance of a DelimitedStringBuilder with delimiter between elements&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="delimiter"&amp;gt;delemiter to use (",", "\n", etc)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DelimitedStringBuilder(&lt;span class="kwrd"&gt;string&lt;/span&gt; delimiter)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.delimiter = delimiter;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Append(&lt;span class="kwrd"&gt;string&lt;/span&gt; stringToAppend)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (sb.Length &amp;gt;0)&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (delimiter != &lt;span class="kwrd"&gt;null&lt;/span&gt;) sb.Append(delimiter);&lt;br /&gt;        sb.Append(stringToAppend);        &lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ToString()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; StringBuilder InnerStringBuilder&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.sb;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: you have to make sure the delimiter is not in the keys nor in the values... But tThe Append() method could be modified easilly to check that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5514341047809477773?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5514341047809477773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5514341047809477773' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5514341047809477773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5514341047809477773'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2009/02/delimited-string-helper-class-in-c.html' title='Delimited string helper class in C#'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-3433146376627678443</id><published>2008-11-20T11:51:00.000-08:00</published><updated>2008-11-20T12:40:17.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Simple XML validation helper using XmlReader</title><content type='html'>&lt;div&gt;Purpose: simply validate a xml file against a xsd file, in C#.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I would appreciate a one single line validation method from one of the multiple xml .NET classes, but there seems to be none with the framework. I fouded some examples too complicated for nothing on the web. So I created this helper. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It can be used in two ways:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1- Static single line call:&lt;/div&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; success = XMLValidationHelper.Validate(&lt;span class="str"&gt;"myFile.xml"&lt;/span&gt;, &lt;span class="str"&gt;"mySchema.xsd"&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;2- Using helper object to collect the first error message occured:&lt;/div&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;XMLValidationHelper validator = &lt;span class="kwrd"&gt;new&lt;/span&gt; XMLValidationHelper(&lt;span class="str"&gt;"myFile.xml"&lt;/span&gt;, &lt;span class="str"&gt;"mySchema.xsd"&lt;/span&gt;);&lt;br /&gt;validator.Validate();&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!validator.IsValid)&lt;br /&gt;{&lt;br /&gt; &lt;span class="rem"&gt;// do something...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the class:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Schema;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Helper class to check a XML against a XSD file&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; XMLValidationHelper&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;string&lt;/span&gt; xmlFileName, xsdFileName;&lt;br /&gt;   &lt;span class="kwrd"&gt;string&lt;/span&gt; exceptionMessage;&lt;br /&gt;   &lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ExceptionMessage&lt;br /&gt;   {&lt;br /&gt;       get { &lt;span class="kwrd"&gt;return&lt;/span&gt; exceptionMessage; }&lt;br /&gt;       set { exceptionMessage = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; XMLValidationHelper(&lt;span class="kwrd"&gt;string&lt;/span&gt; xmlFileName, &lt;span class="kwrd"&gt;string&lt;/span&gt; xsdFileName)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.xmlFileName = xmlFileName;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.xsdFileName = xsdFileName;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// Global validation state of the xml against the xsd&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValid&lt;br /&gt;   {&lt;br /&gt;       get { &lt;span class="kwrd"&gt;return&lt;/span&gt; isValid; }&lt;br /&gt;       set { isValid = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// Read the document and collects the validation exceptions if any.&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Validate()&lt;br /&gt;   {&lt;br /&gt;&lt;br /&gt;       XmlReader schemaReader = XmlReader.Create(&lt;span class="kwrd"&gt;this&lt;/span&gt;.xsdFileName);&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;/// validation settings&lt;/span&gt;&lt;br /&gt;       XmlReaderSettings settings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlReaderSettings();&lt;br /&gt;       settings.ValidationType = ValidationType.Schema;&lt;br /&gt;       settings.ValidationFlags =&lt;br /&gt;           System.Xml.Schema.XmlSchemaValidationFlags.ReportValidationWarnings;&lt;br /&gt;       settings.Schemas.Add(&lt;span class="str"&gt;""&lt;/span&gt;, schemaReader);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       XmlReader myReader = XmlReader.Create(&lt;span class="kwrd"&gt;this&lt;/span&gt;.xmlFileName, settings);&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.isValid = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;       &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;while&lt;/span&gt; (!myReader.EOF)&lt;br /&gt;               myReader.Read();&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.Xml.Schema.XmlSchemaException validationException)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.isValid = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.exceptionMessage = validationException.Message;&lt;br /&gt;       }&lt;br /&gt;       &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;br /&gt;       {&lt;br /&gt;           schemaReader.Close();&lt;br /&gt;           myReader.Close();&lt;br /&gt;       }&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.isValid;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Validate(&lt;span class="kwrd"&gt;string&lt;/span&gt; xmlFileName, &lt;span class="kwrd"&gt;string&lt;/span&gt; xsdFileName)&lt;br /&gt;   {&lt;br /&gt;       XMLValidationHelper instantHelper = &lt;span class="kwrd"&gt;new&lt;/span&gt; XMLValidationHelper(xmlFileName, xsdFileName);&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; instantHelper.Validate();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-3433146376627678443?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/3433146376627678443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=3433146376627678443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/3433146376627678443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/3433146376627678443'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2008/11/simple-xml-validation-helper-using.html' title='Simple XML validation helper using XmlReader'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6873181062079374559</id><published>2008-04-17T16:28:00.000-07:00</published><updated>2008-04-17T16:31:36.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='utils'/><title type='text'>Capturing strings between stopwords</title><content type='html'>&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringBetween(&lt;span class="kwrd"&gt;string&lt;/span&gt; beginTag, &lt;span class="kwrd"&gt;string&lt;/span&gt; endTag, &lt;span class="kwrd"&gt;string&lt;/span&gt; texteToParse)&lt;br /&gt;{&lt;br /&gt;    System.Collections.Specialized.StringCollection coll = StringsBetween(beginTag, endTag, texteToParse);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (coll.Count == 0) &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; coll[0];&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; System.Collections.Specialized.StringCollection StringsBetween(&lt;span class="kwrd"&gt;string&lt;/span&gt; beginTag, &lt;span class="kwrd"&gt;string&lt;/span&gt; endTag, &lt;span class="kwrd"&gt;string&lt;/span&gt; texteToParse)&lt;br /&gt;{&lt;br /&gt;    System.Collections.Specialized.StringCollection result = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Collections.Specialized.StringCollection();&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; pos1, pos2;&lt;br /&gt;    pos1 = 0;&lt;br /&gt;    pos2 = -1;&lt;br /&gt;    pos1 = texteToParse.IndexOf(beginTag);&lt;br /&gt;    &lt;span class="kwrd"&gt;while&lt;/span&gt; (pos1 &amp;gt; -1)&lt;br /&gt;    {&lt;br /&gt;        pos2 = texteToParse.IndexOf(endTag, pos1 + beginTag.Length);&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (pos2 &amp;gt; -1)&lt;br /&gt;        {&lt;br /&gt;            result.Add(texteToParse.Substring(pos1 + beginTag.Length, pos2 - (pos1 + beginTag.Length)));&lt;br /&gt;            pos1 = texteToParse.IndexOf(beginTag, pos2 + endTag.Length);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            pos1 = -1;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6873181062079374559?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6873181062079374559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6873181062079374559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6873181062079374559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6873181062079374559'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2008/04/capturing-strings-between-stopwords.html' title='Capturing strings between stopwords'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6107459630446974318</id><published>2008-02-28T12:28:00.000-08:00</published><updated>2008-04-18T07:07:52.229-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Culture'/><title type='text'>Simple way to create a Culture in .NET</title><content type='html'>Here is the simplest way to create a new culture in .NET, from an existing culture.&lt;br /&gt;&lt;br /&gt;I needed a way to have french format dates (YYYY-MM-DD) and dot symbol (.) as decimal separator in an web application. Since javascript only recognize dot as decimal separator, having to use french cultures, either "fr-FR" or "fr-CA", is a pain because the decimal specified in theese is the coma. I wanted everything from the french culture, but a dot as decimal separator, and there is no way to do this without creating a new culture.&lt;br /&gt;&lt;br /&gt;A new culture can be created from scratch. Here is a &lt;a href="http://en.csharp-online.net/Using_Custom_Cultures%E2%80%94Uses_for_Custom_Cultures"&gt;detailed articl&lt;/a&gt;e about this.&lt;br /&gt;&lt;br /&gt;However, the following code simply copy an existing culture, changes it, and &lt;b&gt;register&lt;/b&gt; in with a new name ("fr-CA-QC").&lt;br /&gt;&lt;br /&gt;The process of revistering required administrator privilege on the machine where the code is running. The code below only have to be run once.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Original culture&lt;/span&gt;&lt;br /&gt;CultureInfo cultureInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; CultureInfo(&lt;span class="str"&gt;"fr-CA"&lt;/span&gt;);&lt;br /&gt;RegionInfo regionInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; RegionInfo(cultureInfo.Name);&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// New Culture, with a new name &lt;/span&gt;(&lt;span class="str"&gt;"fr-CA-QC")&lt;br /&gt;&lt;/span&gt;&lt;span class="rem"&gt;/// if culture already exists, we need to unregister it for overwriting:&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// CultureAndRegionInfoBuilder.Unregister("fr-CA-QC");&lt;/span&gt;&lt;br /&gt;CultureAndRegionInfoBuilder builder =&lt;br /&gt;  &lt;span class="kwrd"&gt;new&lt;/span&gt; CultureAndRegionInfoBuilder(&lt;span class="str"&gt;"fr-CA-QC"&lt;/span&gt;,&lt;br /&gt;  CultureAndRegionModifiers.None);&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// load in the data from the original culture and region&lt;/span&gt;&lt;br /&gt;builder.LoadDataFromCultureInfo(cultureInfo);&lt;br /&gt;builder.LoadDataFromRegionInfo(regionInfo);&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// make custom changes to the culture&lt;/span&gt;&lt;br /&gt;builder.NumberFormat.NumberDecimalSeparator = &lt;span class="str"&gt;"."&lt;/span&gt;;&lt;br /&gt;builder.NumberFormat.CurrencyDecimalSeparator = &lt;span class="str"&gt;"."&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Create this culture on this computer (NEED ADMINISTRATOR PRIVILEGES)&lt;/span&gt;&lt;br /&gt;builder.Register();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This can be executed in a simple windows or console application. After that, any application running on the same computer or server can use this new culture with the name defined above.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, I just have to include theese attributes in my web.config files and I will no more have culture problems:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;globalization culture="fr-CA-QC" uiCulture="fr-CA-QC" ... &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6107459630446974318?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6107459630446974318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6107459630446974318' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6107459630446974318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6107459630446974318'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2008/02/simple-way-to-create-culture-in-net.html' title='Simple way to create a Culture in .NET'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5216563248024592634</id><published>2008-02-05T12:08:00.000-08:00</published><updated>2008-04-18T07:08:28.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflexion'/><title type='text'>Object property/fields cloner</title><content type='html'>Here is a class using reflection to transfer property or field values from an object to another, instead of copying values one by one like this:&lt;br /&gt;&lt;br /&gt;b.Address = a.Address&lt;br /&gt;b.Age = a.Age&lt;br /&gt;b.Color = a.Color&lt;br /&gt;b.Surname = a.Surname&lt;br /&gt;b.Boss = a.Boss&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;Instead, this helper method will be used like this:&lt;br /&gt;PropertyCopier.CopyPropertiesToTargetObject(a,b)&lt;br /&gt;&lt;br /&gt;That's it. Object b now have same property values as a.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Reflection&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' Helper class using reflection to copy all fiels and/or properties&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' from a object A to object B&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; PropertyCopier&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' flags to get all instance fields, even privates&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; flags &lt;span class="kwrd"&gt;As&lt;/span&gt; BindingFlags = BindingFlags.NonPublic &lt;span class="kwrd"&gt;Or&lt;/span&gt; BindingFlags.[&lt;span class="kwrd"&gt;Public&lt;/span&gt;] &lt;span class="kwrd"&gt;Or&lt;/span&gt; BindingFlags.Instance&lt;br /&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#Region&lt;/span&gt; &lt;span class="str"&gt;" To copy object property values "&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Copy all property values from sourceObject to targetObject&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Private and public properties values will be cloned from sourceObject to targetObject when property name exists on the two object&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sourceObject"&amp;gt;Oject from which fields values will be copied&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="targetObject"&amp;gt;Object which will have copied property values&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' By default, only properties having same value types are cloneed&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CopyPropertiesToTargetObject(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sourceObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; targetObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;)&lt;br /&gt;        CopyPropertiesToTargetObject(sourceObject, targetObject, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Copy all property values from sourceObject to targetObject&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Private and public properties values will be cloned from sourceObject to targetObject when property name exists on the two object&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sourceObject"&amp;gt;Oject from which fields values will be copied&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="targetObject"&amp;gt;Object which will have copied property values&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sameValueTypesOnly"&amp;gt;If true, only property having the same type of value (ex: String, CustomClassType, etc) will be cloned&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CopyPropertiesToTargetObject(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sourceObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; targetObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Boolean&lt;/span&gt;)&lt;br /&gt;        &lt;span class="rem"&gt;'''' getting all properties from two objects&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sourceFields &lt;span class="kwrd"&gt;As&lt;/span&gt; FieldInfo() = sourceObject.[&lt;span class="kwrd"&gt;GetType&lt;/span&gt;]().GetFields(flags)&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; targetFields &lt;span class="kwrd"&gt;As&lt;/span&gt; FieldInfo() = targetObject.[&lt;span class="kwrd"&gt;GetType&lt;/span&gt;]().GetFields(flags)&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; tempValue &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; sourceField &lt;span class="kwrd"&gt;As&lt;/span&gt; FieldInfo &lt;span class="kwrd"&gt;In&lt;/span&gt; sourceFields&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; targetField &lt;span class="kwrd"&gt;As&lt;/span&gt; FieldInfo &lt;span class="kwrd"&gt;In&lt;/span&gt; targetFields&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; sourceField.Name = targetField.Name &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    &lt;span class="rem"&gt;'' Same property name =&amp;gt; value to copy?&lt;/span&gt;&lt;br /&gt;                    tempValue = sourceField.GetValue(sourceObject)&lt;br /&gt;                    &lt;span class="rem"&gt;' If same value type between object, or not strict copy asked&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; tempValue.&lt;span class="kwrd"&gt;GetType&lt;/span&gt;() &lt;span class="kwrd"&gt;Is&lt;/span&gt; targetField.GetValue(targetObject).&lt;span class="kwrd"&gt;GetType&lt;/span&gt;() &lt;span class="kwrd"&gt;Or&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;                            targetField.SetValue(targetObject, tempValue)&lt;br /&gt;                        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception&lt;br /&gt;                            &lt;span class="kwrd"&gt;If&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="kwrd"&gt;Throw&lt;/span&gt;&lt;br /&gt;                            System.Diagnostics.Debug.WriteLine(ex.ToString())&lt;br /&gt;                        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#End Region&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#Region&lt;/span&gt; &lt;span class="str"&gt;" To copy object fields values "&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Copy all fields values from sourceObject to targetObject&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Private and public field values will be cloned from sourceObject to targetObject when fields name exists on the two object&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sourceObject"&amp;gt;Oject from which fields values will be copied&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="targetObject"&amp;gt;Object which will have copied values&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' By default, only fields having same value types are cloneed&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CopyFieldsToTargetObject(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sourceObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; targetObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;)&lt;br /&gt;        CopyFieldsToTargetObject(sourceObject, targetObject, &lt;span class="kwrd"&gt;False&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Copy all fields values from sourceObject to targetObject&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' Private and public field values will be cloned from sourceObject to targetObject when fields name exists on the two object&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sourceObject"&amp;gt;Oject from which fields values will be copied&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="targetObject"&amp;gt;Object which will have copied values&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;param name="sameValueTypesOnly"&amp;gt;If true, only fields having the same type of value (ex: String, CustomClassType, etc) will be cloned&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CopyFieldsToTargetObject(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sourceObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; targetObject &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Boolean&lt;/span&gt;)&lt;br /&gt;        &lt;span class="rem"&gt;'''' Getting fields from source &amp;amp; target objects&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sourceFields &lt;span class="kwrd"&gt;As&lt;/span&gt; PropertyInfo() = sourceObject.[&lt;span class="kwrd"&gt;GetType&lt;/span&gt;]().GetProperties(flags)&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; targetFields &lt;span class="kwrd"&gt;As&lt;/span&gt; PropertyInfo() = targetObject.[&lt;span class="kwrd"&gt;GetType&lt;/span&gt;]().GetProperties(flags)&lt;br /&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; tempValue &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;'''' Searching match between objects property names&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; sourceField &lt;span class="kwrd"&gt;As&lt;/span&gt; PropertyInfo &lt;span class="kwrd"&gt;In&lt;/span&gt; sourceFields&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; targetField &lt;span class="kwrd"&gt;As&lt;/span&gt; PropertyInfo &lt;span class="kwrd"&gt;In&lt;/span&gt; targetFields&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; sourceField.Name = targetField.Name &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    &lt;span class="rem"&gt;'' Same field name =&amp;gt; value to copy?&lt;/span&gt;&lt;br /&gt;                    tempValue = sourceField.GetValue(sourceObject, &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;                    &lt;span class="rem"&gt;' If same value type between object, or not strict copy asked&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; tempValue.&lt;span class="kwrd"&gt;GetType&lt;/span&gt;() &lt;span class="kwrd"&gt;Is&lt;/span&gt; targetField.GetValue(targetObject, &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;).&lt;span class="kwrd"&gt;GetType&lt;/span&gt;() &lt;span class="kwrd"&gt;Or&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;                            targetField.SetValue(targetObject, tempValue, &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;)&lt;br /&gt;                        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception&lt;br /&gt;                            &lt;span class="kwrd"&gt;If&lt;/span&gt; sameValueTypesOnly &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="kwrd"&gt;Throw&lt;/span&gt;&lt;br /&gt;                            System.Diagnostics.Debug.WriteLine(ex.ToString())&lt;br /&gt;                        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="preproc"&gt;#End Region&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Class&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5216563248024592634?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5216563248024592634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5216563248024592634' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5216563248024592634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5216563248024592634'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2008/02/object-propertyfields-cloner.html' title='Object property/fields cloner'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-1476472934161747710</id><published>2008-01-25T10:38:00.000-08:00</published><updated>2008-01-25T10:52:55.687-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL transaction &amp; error handling template</title><content type='html'>&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;Here is a small template to execute a SQL statement in a transaction scope, with a rollback if an error occured.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt; &lt;span class="kwrd"&gt;TRAN&lt;/span&gt;&lt;br /&gt;/*&lt;br /&gt;( SQL CODE TO EXECUTE HERE)&lt;br /&gt;*/&lt;br /&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;IF&lt;/span&gt; (@@ERROR = 0)&lt;br /&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;COMMIT&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'EXECUTION COMPLETED WITH SUCCESS'&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;ELSE&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;ROLLBACK&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'ERROR HAS OCCURED'&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;END&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-1476472934161747710?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/1476472934161747710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=1476472934161747710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1476472934161747710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1476472934161747710'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2008/01/sql-transaction-error-handling-template.html' title='SQL transaction &amp; error handling template'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-1674070677314114042</id><published>2007-11-29T09:31:00.000-08:00</published><updated>2007-11-29T09:49:04.859-08:00</updated><title type='text'>Some tools</title><content type='html'>Here are somme useful tools I use:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pure text (copy-paste in windows)&lt;br /&gt;magic iso (virtual drive like)&lt;br /&gt;win diff (file &amp;amp; folder comparer, comes with VS)&lt;br /&gt;ndepend (profiler .net?)&lt;br /&gt;web development helper&lt;br /&gt;&lt;br /&gt;Expresso (regular expression ide)&lt;br /&gt;Notepad ++&lt;br /&gt;SQL Prompt (Intellisense in sql editors)&lt;br /&gt;slick run&lt;br /&gt;Gadwin System Print Screen (free &amp;amp; easy screen shot tool)&lt;br /&gt;&lt;br /&gt;VS Plug-in:&lt;br /&gt;Smart Paster (paste as comment, as stringbuilder, etc)&lt;br /&gt;Resharper&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-1674070677314114042?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/1674070677314114042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=1674070677314114042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1674070677314114042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1674070677314114042'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/11/some-tools.html' title='Some tools'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-8415747156222660398</id><published>2007-09-04T11:45:00.001-07:00</published><updated>2007-09-05T05:44:24.885-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='DataBinding'/><title type='text'>Binding a Windows form to a TableAdapter through a Web Service</title><content type='html'>How can I use a TableAdapter object in a Windows Form aplication, when this TableAdapter object is returned from a Web Service? It's simple, but...&lt;br /&gt;&lt;br /&gt;I wanted a simple thing:&lt;br /&gt;1- define a TableAdapter in a Web Service project, to get a typed DataSet from the BD&lt;br /&gt;2- return this TableAdater in a WebMethod&lt;br /&gt;3- use the TableAdapter returned by the web service from a DataGridView in a Windows form application (referencing the web service, of course).&lt;br /&gt;&lt;br /&gt;I tried many combinations before getting this worked, playing with objects and properties, and googling, and playing again...  There is finally a recipe that works:&lt;br /&gt;&lt;br /&gt;On the web service side:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a TableAdapter (by dragging adatabase table from the werver explorer and settinga  select method). This create a DataSet (name of the *.xsd file), a DataTable (name in the top of the box) and a TableAdapter (with a "TableAdapter" suffix after the DataTable name).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a web method returning an instance of the new DataTable.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;On the windows application side:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In the Windows client project, add a Web Reference to the class of the web service (like the default name "Service1").&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next, go on the design view of the web form. On the toolbox pane, some items are automatically added. There should be an item with the DataSet used in the web service; the name will be the "*.xsd" file name, not the DataTable or the TableAdapter name (default will be "DataSet1"). This should be in a section of the toolbox labeled with the web service namespace ("MyWebService components"). Drag this component on the web form. A DataSet object will be created.&lt;/li&gt;&lt;li&gt;Drag a BindingSource on the web form&lt;/li&gt;&lt;li&gt;In the properties of the new BindingSource object, set the datasource to the new DataSet objet. In the DataMember drop down list, you can now choose the name of the DataTable (similar to the TableAdapter name) within the DataSet.&lt;/li&gt;&lt;li&gt;In the DataGridView control properties, set the DataSource to the new DataBindingSource object.&lt;/li&gt;&lt;li&gt;All properties shoud now be ok.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;To get the data populating the DataGridView on load, there is a line to write.In the Load() event of the form, add something like&lt;br /&gt;Me.BindingSource1.DataSource = New [WebReferenceAliasName].[ServiceName]().[WebMethodName]()&lt;br /&gt;&lt;br /&gt;It works fine this way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-8415747156222660398?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/8415747156222660398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=8415747156222660398' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/8415747156222660398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/8415747156222660398'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/09/binding-windows-form-to-tableadapter.html' title='Binding a Windows form to a TableAdapter through a Web Service'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-1992944509749812163</id><published>2007-08-31T08:01:00.000-07:00</published><updated>2007-08-31T09:26:05.224-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='casting'/><title type='text'>Upcasting an object "for real"</title><content type='html'>This week, I had a problem with serialization in a web service. Theorically, any serializable object or object collection can be send or received by a web service. The problem occured when the web service's tried to send a object collection including objects of type A and objects of type B inherited from A. While it tried to serialize the collection (an array or a typed list) as a collection of type A, the runtime throwed this exception:&lt;br /&gt;&lt;br /&gt;System.InvalidOperationException: The type [inheritedType] was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.&lt;br /&gt;&lt;br /&gt;Here is what happened (as I undersand): The SOAP protocol defines a strict serialisation format constructed with the declared type in the [WebMethod] functions, and this format is in the web service's contract. That's why the formatter refuses to serialise inherited types. For example, if type A have a Name and a Id attributes, the web service returning a A object defines theese two attributes it it's SOAP contract. But if the service tries to send a B object, inherited from A but having a added Employer attribute, the formatter will normally want to serialize it with this Employer attribute, whitch is not in the SOAP contract. That is why the exception is throwned.&lt;br /&gt;&lt;br /&gt;Normally, upcasting objects is about upcasting reference, not instances. In other words, the program can use an object of type B as if it was an object of type A, but the .net runtime kows it is a object of type B. If you observe an upcasted or downcasted object with the compiler, you will see that the runtime can tell the original type.&lt;br /&gt;&lt;br /&gt;Thas is why a object of type B can be upcasted to its parent class type A, then downcasted to type B and still preserve it's properties restricted to class B.&lt;br /&gt;&lt;br /&gt;Now, how can I face my web service serialization problem without touching the serialisation process itself ? The serialization can be customized, but that's not what I wanted. I needed a process to handle this particular casting problem in a generic way. That's why I made a class to transform an object of type b in a new object of it's parent type and still preserve it's values. The class uses generic and reflection to convert an object B to a new object A having it's original field values. Note that by reflection, we can access objects private fields and set their values.&lt;br /&gt;&lt;br /&gt;Here is the class:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Helper class to Upcast an object to it's parent type in a definitive way.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// To get an objet with a runtime type of the target parent type.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// By reflection, it gets child instance fields values (event privates) &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// and assign them to a new instance of the given parent class.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;typeparam name="ParentClass"&amp;gt;Class to upcast object to&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; InstanceUpCaster&amp;lt;ParentType&amp;gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;where&lt;/span&gt; ParentType : &lt;span class="kwrd"&gt;new&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;/// parent class fields&lt;/span&gt;&lt;br /&gt;    FieldInfo[] fParents;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// flags to get all instance fields, even privates&lt;/span&gt;&lt;br /&gt;    BindingFlags flags = BindingFlags.NonPublic |&lt;br /&gt;            BindingFlags.Public | BindingFlags.Instance;&lt;br /&gt;  &lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Getting target class fields&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; InstanceUpCaster()&lt;br /&gt;    {            &lt;br /&gt;         fParents = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ParentType).GetFields(flags);           &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Convert the object to a new object of the parent class.&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Assign field values of the child instance to the new instance, &lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// if theese fiels exists in the parent type.&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// (public and private fields can be set by reflection)&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="instance"&amp;gt;Object to upcast to ParentType&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;New object with same values (where possible in this type)&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ParentType ToParentClassInstance(ParentType childTypeObject)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;/// Object already of the wright type (not derived) ?&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (childTypeObject.GetType() == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ParentType)) &lt;span class="kwrd"&gt;return&lt;/span&gt; childTypeObject;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// No -&amp;gt; new object to upcast to&lt;/span&gt;&lt;br /&gt;        ParentType newObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; ParentType();                       &lt;br /&gt;        &lt;br /&gt;        &lt;span class="rem"&gt;/// transfering child field values to new object&lt;/span&gt;&lt;br /&gt;        FieldInfo[] fChilds = childTypeObject.GetType().GetFields(flags);&lt;br /&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; tempValue;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FieldInfo fParent &lt;span class="kwrd"&gt;in&lt;/span&gt; fParents)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FieldInfo fChild &lt;span class="kwrd"&gt;in&lt;/span&gt; fChilds)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (fParent.Name == fChild.Name)&lt;br /&gt;                {&lt;br /&gt;                    tempValue = fChild.GetValue(childTypeObject);&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (tempValue != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;                        fParent.SetValue(newObject, tempValue);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; newObject;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-1992944509749812163?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/1992944509749812163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=1992944509749812163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1992944509749812163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1992944509749812163'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/08/upcast-object-to-runtype-type-of-its.html' title='Upcasting an object &quot;for real&quot;'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5826333673638836004</id><published>2007-07-04T10:52:00.000-07:00</published><updated>2007-08-31T09:22:52.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Creating a HTTP POST from in C#</title><content type='html'>&lt;pre class="csharpcode"&gt;Here is a way to make a HTTP request to a web page with the POST method.&lt;br /&gt;Use this method with parameters formatted like in GET method.&lt;br /&gt;&lt;br /&gt;Example : result = PostPage("www.mypage.aspx", "id=2&amp;name=Paul&amp;amp;amp;age=33");&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PostPage(&lt;span class="kwrd"&gt;string&lt;/span&gt; url, &lt;span class="kwrd"&gt;string&lt;/span&gt; params)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] dataToPost = &lt;span class="kwrd"&gt;new&lt;/span&gt; ASCIIEncoding().GetBytes(params);&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;          HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;          myRequest.Method = &lt;span class="str"&gt;"POST"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//Request properties &lt;/span&gt;&lt;br /&gt;          myRequest.ContentType = &lt;span class="str"&gt;"application/x-www-form-urlencoded"&lt;/span&gt;;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;          myRequest.ContentLength = dataToPost.Length;&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//Writing data in stream&lt;/span&gt;&lt;br /&gt;          Stream myStream = myRequest.GetRequestStream();&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;          myStream.Write(dataToPost, 0, dataToPost.Length);&lt;br /&gt;          myStream.Close();&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//Getting response &lt;/span&gt;&lt;br /&gt;          WebResponse myResponse = myRequest.GetResponse();&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//Reading it&lt;/span&gt;&lt;br /&gt;          Stream responseStream = myResponse.GetResponseStream();&lt;span class="rem"&gt;                &lt;/span&gt;&lt;br /&gt;          StreamReader streamReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(responseStream);&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;string&lt;/span&gt; result = streamReader.ReadToEnd();&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//closing all&lt;/span&gt;&lt;br /&gt;          streamReader.Close();&lt;br /&gt;          responseStream.Close();&lt;br /&gt;          myResponse.Close();&lt;br /&gt;          myStream.Close();&lt;br /&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;br /&gt;      }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5826333673638836004?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5826333673638836004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5826333673638836004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5826333673638836004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5826333673638836004'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/07/creating-http-post-from-in-c.html' title='Creating a HTTP POST from in C#'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6544714341781745620</id><published>2007-07-04T10:45:00.000-07:00</published><updated>2007-08-31T09:23:12.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Simple HTTP request and response</title><content type='html'>For getting programmatically the HTML content of a web page:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;        &lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetPage(&lt;span class="kwrd"&gt;string&lt;/span&gt; pageToGet)&lt;br /&gt;        {&lt;br /&gt;            HttpWebRequest request= (HttpWebRequest)HttpWebRequest.Create(pageToGet);            &lt;br /&gt;            HttpWebResponse response = (HttpWebResponse)request.GetResponse();&lt;br /&gt;&lt;br /&gt;            return &lt;span class="kwrd"&gt;new&lt;/span&gt; streamReader(response.GetResponseStream()).ReadToEnd();&lt;br /&gt;            &lt;br /&gt;        }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6544714341781745620?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6544714341781745620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6544714341781745620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6544714341781745620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6544714341781745620'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/07/simple-http-request-and-response.html' title='Simple HTTP request and response'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6113163945547219944</id><published>2007-07-04T10:21:00.001-07:00</published><updated>2007-07-04T10:51:52.363-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><title type='text'>Class for storing  QUERY STRING  in XML files and manage query parameters collection</title><content type='html'>I recently needed to reuse HTTP query for a web robot, and I did'nt want to use a complex string like this one: "title=Using%20the%20Web%20Client%20Software%20Development%20Package&amp;referringTitle=Getting%20Started"&lt;br /&gt;&lt;br /&gt;I wanted to use a readable and reusable representation of a HTTP query that could be easilly serializable in files, easy to generate from a query string, easy to change in code or in files.&lt;br /&gt;&lt;br /&gt;A simple StringDictionary would have been perfect, but unfortunately, dictionary collections are not serializable in .NET. I made a class that extends StringDictionary whitch write itself in simple XML format. The format is like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;MyQueryName&amp;gt;&lt;br /&gt;&amp;lt;myfirsparamname&amp;gt;myFirsParamValue&amp;lt;/myfirsparamname&amp;gt;&lt;br /&gt;&amp;lt;postid&amp;gt;33&amp;lt;/postid&amp;gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Two methods helps work with GET queries: ones (LoadValuesFromQueryString) loads the inner collection with name-values parameters frow a standard query string, and the other one, ToQueryString(), converts the object to a standard query string representation.&lt;br /&gt;&lt;br /&gt;This class can be use to reuse, save, adapt and modify query strings.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note: comments are in french, but method names are in english and should be self-describing enough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Objet représentant les champs d'un formulaire html (pour POST ou GET)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// qui contient essentiellement une collection de clés/valeurs&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// À utiliser pour représenter, sauvegarder et produire des requêtes HTTP.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// On peut ainsi sauvegarder les requêtes HTTP en fichier xml, les modifier, puis les réutiliser.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Des méthodes de sauvegarde en fichier en format XML ont été mise pour contourner&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// le manque de possibilité de sérialiser les collections telle que le StringDictionary&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; FormDefinition : System.Collections.Specialized.StringDictionary&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; _nom = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; FormDefinition(&lt;span class="kwrd"&gt;string&lt;/span&gt; nom)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;._nom = nom;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Convertit la collection de paramètres/valeurs en query string normal&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ToQueryString()&lt;br /&gt;    {&lt;br /&gt;        StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; k &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Keys)&lt;br /&gt;        {&lt;br /&gt;            sb.Append(k + &lt;span class="str"&gt;"="&lt;/span&gt; + System.Web.HttpUtility.UrlEncode(&lt;span class="kwrd"&gt;this&lt;/span&gt;[k]) + &lt;span class="str"&gt;"&amp;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Initialise la collection de paramètres/valeurs à partir d'un query string&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="query"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadValuesFromQueryString(&lt;span class="kwrd"&gt;string&lt;/span&gt; query)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (query.IndexOf(&lt;span class="str"&gt;"?"&lt;/span&gt;) &amp;gt; -1)&lt;br /&gt;            query = query.Substring(query.IndexOf(&lt;span class="str"&gt;"?"&lt;/span&gt;));&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt;[] queryParams = query.Split(&lt;span class="str"&gt;'&amp;'&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt;[] cleValeur;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; parmametre &lt;span class="kwrd"&gt;in&lt;/span&gt; queryParams)&lt;br /&gt;        {&lt;br /&gt;            cleValeur = parmametre.Split(&lt;span class="str"&gt;'='&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Add(cleValeur[0], System.Web.HttpUtility.UrlDecode(cleValeur[1]));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Charge un objet FormDefinition à partir de sa représentation XML en fichier&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="nomFichier"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; FormDefinition LoadFromFile(&lt;span class="kwrd"&gt;string&lt;/span&gt; nomFichier)&lt;br /&gt;    {&lt;br /&gt;        FormDefinition formulaire;&lt;br /&gt;        XmlDocument doc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;br /&gt;&lt;br /&gt;        doc.Load(nomFichier);&lt;br /&gt;        formulaire = FormDefinition.FromXmlDocument(doc);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; formulaire;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Sauvegarde l'objet dans un fichier en représentation XML&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="nomFichier"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveToFile(&lt;span class="kwrd"&gt;string&lt;/span&gt; nomFichier)&lt;br /&gt;    {&lt;br /&gt;        XmlDocument doc = &lt;span class="kwrd"&gt;this&lt;/span&gt;.ToXmlDocument();&lt;br /&gt;        doc.Save(nomFichier);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Formatte l'objet (le StringDictionnary) en xml &lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;xml avec balises nommées d'après les paramètres, contenant les valeurs&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; XmlDocument ToXmlDocument()&lt;br /&gt;    {&lt;br /&gt;        XmlDocument doc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;br /&gt;        XmlElement root = doc.CreateElement(&lt;span class="kwrd"&gt;this&lt;/span&gt;._nom);&lt;br /&gt;        doc.AppendChild(root);&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; k &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Keys)&lt;br /&gt;        {&lt;br /&gt;            XmlElement nod = doc.CreateElement(k);&lt;br /&gt;            nod.InnerText = &lt;span class="kwrd"&gt;this&lt;/span&gt;[k];&lt;br /&gt;            root.AppendChild(nod);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; doc;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Construit l'objet à partir de la représentation xml&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="doc"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Objet initialisé&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; FormDefinition FromXmlDocument(XmlDocument doc)&lt;br /&gt;    {&lt;br /&gt;        FormDefinition formulaire = &lt;span class="kwrd"&gt;new&lt;/span&gt; FormDefinition(doc.FirstChild.Name);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (XmlNode enfant &lt;span class="kwrd"&gt;in&lt;/span&gt; doc.FirstChild.ChildNodes)&lt;br /&gt;        {&lt;br /&gt;            formulaire.Add(enfant.Name, enfant.InnerText);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; formulaire;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6113163945547219944?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6113163945547219944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6113163945547219944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6113163945547219944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6113163945547219944'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/07/i-recently-needed-to-reuse-http-query.html' title='Class for storing  QUERY STRING  in XML files and manage query parameters collection'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-7853931993541066826</id><published>2007-05-29T12:02:00.000-07:00</published><updated>2007-05-29T12:07:53.085-07:00</updated><title type='text'>Unable to start debugging on the Web server</title><content type='html'>Got this message?&lt;br /&gt;&lt;br /&gt;Here is a complete troubleshooting page from MDSN:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vsdebug.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vsdebug.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you use the framework 1.1 , you may have to reinstall asp.net:&lt;br /&gt;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis -i&lt;br /&gt;&lt;br /&gt;If the probleme persist, you may have to reinstall Visual Studio, or even the framework... &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-7853931993541066826?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/7853931993541066826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=7853931993541066826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7853931993541066826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7853931993541066826'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/05/unable-to-start-debugging-on-web-server.html' title='Unable to start debugging on the Web server'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6304972499335100222</id><published>2007-03-26T12:22:00.000-07:00</published><updated>2008-04-18T07:06:28.180-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='utils'/><title type='text'>Reading an Excel file as a DataTable</title><content type='html'>This method open a Excel file and retun it as a datatable.&lt;br /&gt;It uses oleDB, wich is very powerful.&lt;br /&gt;&lt;br /&gt;If your columns contains headers, they will be read as datacolumn names. This way, you can access datarows with theese names as indexers, ex: value = myRow("myColumnName").&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Protected&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetDatatableFromExcel(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; fileName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sheetName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable&lt;br /&gt;  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; conn &lt;span class="kwrd"&gt;As&lt;/span&gt; System.data.oledb.OleDbConnection&lt;br /&gt;  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dataResult &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable&lt;br /&gt;  &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;  conn = &lt;span class="kwrd"&gt;New&lt;/span&gt; OleDbConnection(&lt;span class="str"&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&lt;/span&gt; _&lt;br /&gt;  + fileName + &lt;span class="str"&gt;";Extended Properties=Excel 8.0;"&lt;/span&gt;)&lt;br /&gt;  conn.Open()&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; command &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Data.OleDb.OleDbCommand(&lt;span class="str"&gt;" SELECT * FROM ["&lt;/span&gt; + sheetName + &lt;span class="str"&gt;"$]"&lt;/span&gt;)&lt;br /&gt;  command.Connection = conn&lt;br /&gt;  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; adaperForExcelBook &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; OleDbDataAdapter&lt;br /&gt;  adaperForExcelBook.SelectCommand = command&lt;br /&gt;  adaperForExcelBook.Fill(dataResult)&lt;br /&gt;  conn.Close()&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;Catch&lt;/span&gt; err &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception&lt;br /&gt;  &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(&lt;span class="str"&gt;"Error reading file: "&lt;/span&gt; + fileName)&lt;br /&gt;  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;Return&lt;/span&gt; dataResult&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6304972499335100222?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6304972499335100222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6304972499335100222' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6304972499335100222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6304972499335100222'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/03/reading-excel-file-as-datatable.html' title='Reading an Excel file as a DataTable'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-4764280578281682879</id><published>2007-03-26T11:58:00.000-07:00</published><updated>2007-03-26T12:00:17.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><title type='text'>Converting a DataRow to a string</title><content type='html'>This can help to show a datarow content. Il shows the column name and values for all the column in the row in this format:&lt;br /&gt; ColumnName=value; ColumnName2=value2; &lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Protected&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; DataRowToString(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; dr &lt;span class="kwrd"&gt;As&lt;/span&gt; DataRow) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''''&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' For debugging purpose, per example : convert a datarow to a string &lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;''' represantation with all columns contents&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; result &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;    result += Environment.NewLine&lt;br /&gt;    &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; col &lt;span class="kwrd"&gt;As&lt;/span&gt; DataColumn &lt;span class="kwrd"&gt;In&lt;/span&gt; dr.Table.Columns&lt;br /&gt;    result += col.ColumnName + &lt;span class="str"&gt;"="&lt;/span&gt; + dr(col.ColumnName).ToString() + &lt;span class="str"&gt;" ;"&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Return&lt;/span&gt; result&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-4764280578281682879?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/4764280578281682879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=4764280578281682879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/4764280578281682879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/4764280578281682879'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/03/converting-datarow-to-string.html' title='Converting a DataRow to a string'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5032126673976520424</id><published>2007-03-23T08:47:00.001-07:00</published><updated>2007-03-23T10:10:31.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Checking if a column is a foreing key with system tables in SQL</title><content type='html'>With this request, we can see if a column of a given table is a foreign key. If it is the case, we get the parent table and the primary key associated with this column.&lt;br /&gt;&lt;br /&gt;Replace MY_COLUMN_NAME and MY_TABLE_NAME with the real table and column values.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;     dbo.sysobjects.name &lt;span class="kwrd"&gt;as&lt;/span&gt; CHILD_TABLE,&lt;br /&gt;     dbo.syscolumns.name &lt;span class="kwrd"&gt;AS&lt;/span&gt; CHILD_COLUMN,&lt;br /&gt;        sysobjects_1.name &lt;span class="kwrd"&gt;AS&lt;/span&gt; PARENT_TABLE,&lt;br /&gt;     syscolumns_1.name &lt;span class="kwrd"&gt;AS&lt;/span&gt; PARENT_COLUMN&lt;br /&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;         dbo.syscolumns syscolumns_1 &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;br /&gt;           dbo.syscolumns&lt;br /&gt;     &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;br /&gt;           dbo.sysobjects&lt;br /&gt;     &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;br /&gt;           dbo.sysforeignkeys&lt;br /&gt;     &lt;span class="kwrd"&gt;ON&lt;/span&gt; dbo.sysobjects.id = dbo.sysforeignkeys.fkeyid&lt;br /&gt;     &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;br /&gt;           dbo.sysobjects sysobjects_1&lt;br /&gt;     &lt;span class="kwrd"&gt;ON&lt;/span&gt; dbo.sysforeignkeys.rkeyid = sysobjects_1.id&lt;br /&gt;     &lt;span class="kwrd"&gt;ON&lt;/span&gt; dbo.syscolumns.id = dbo.sysforeignkeys.fkeyid &lt;span class="kwrd"&gt;AND&lt;/span&gt;&lt;br /&gt;            dbo.syscolumns.colid = dbo.sysforeignkeys.fkey&lt;br /&gt;     &lt;span class="kwrd"&gt;ON&lt;/span&gt; syscolumns_1.id = dbo.sysforeignkeys.rkeyid &lt;span class="kwrd"&gt;AND&lt;/span&gt;&lt;br /&gt;           syscolumns_1.colid = dbo.sysforeignkeys.rkey&lt;br /&gt;     &lt;span class="kwrd"&gt;where&lt;/span&gt; dbo.sysobjects.name = &lt;span class="str"&gt;'&lt;span style="font-weight: bold;"&gt;MY_COLUMN_NAME&lt;/span&gt;'&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;and&lt;/span&gt; dbo.syscolumns.name = &lt;span class="str"&gt;'&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="str"&gt;MY_TABLE_NAME&lt;/span&gt;&lt;/span&gt;&lt;span class="str"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Works with SQL Server 2000&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5032126673976520424?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5032126673976520424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5032126673976520424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5032126673976520424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5032126673976520424'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/03/checking-if-column-is-foreing-key-with.html' title='Checking if a column is a foreing key with system tables in SQL'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-2925597043593810977</id><published>2007-03-22T13:56:00.000-07:00</published><updated>2007-03-23T10:16:58.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Checking if a culomn is a primary key with System Tables</title><content type='html'>&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;This will return 1 if the column specified is a primary key. Works with SQL Server 2000.&lt;br /&gt;&lt;br /&gt;You just have to replace MY_TABLE_NAME and CULOMN_NAME in whe query&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;count&lt;/span&gt;(*)&lt;br /&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt; sysindexes ind,&lt;br /&gt;    sysindexkeys indkey,&lt;br /&gt;    sysobjects obj,&lt;br /&gt;    sysobjects obj2,&lt;br /&gt;    syscolumns col&lt;br /&gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; indkey.id + indkey.indid = ind.id + ind.indid &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       ind.name = obj.name &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       ind.id = obj.parent_obj &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       col.id = indkey.id &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       obj.parent_obj = col.id &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       obj.parent_obj = obj2.id &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       col.colid = indkey.colid &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       obj.xtype = &lt;span class="str"&gt;'PK'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       obj2.name = &lt;span class="str"&gt;'&lt;span style="font-weight: bold;"&gt;MY_TABLE_NAME&lt;/span&gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt;&lt;br /&gt;       col.name = &lt;span class="str"&gt;'&lt;span style="font-weight: bold;"&gt;CULOMN_NAME&lt;/span&gt;'&lt;/span&gt;   &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-2925597043593810977?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/2925597043593810977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=2925597043593810977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/2925597043593810977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/2925597043593810977'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/03/checking-if-culomn-is-primary-key-with.html' title='Checking if a culomn is a primary key with System Tables'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-7425234127408205768</id><published>2007-02-16T04:17:00.000-08:00</published><updated>2007-03-23T10:18:55.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Free stylesheets from W3C</title><content type='html'>We can find here a web public free stylewheets from the W3C consortium.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.w3.org/StyleSheets/Core/"&gt;http://www.w3.org/StyleSheets/Core/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-7425234127408205768?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/7425234127408205768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=7425234127408205768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7425234127408205768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7425234127408205768'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/02/free-stylesheets-from-w3c.html' title='Free stylesheets from W3C'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5240710936980668707</id><published>2007-01-19T09:14:00.000-08:00</published><updated>2007-01-19T09:16:44.715-08:00</updated><title type='text'>MCTS Links</title><content type='html'>Here are some links for Microsoft Certified Technology Specialist certification.&lt;br /&gt;&lt;br /&gt;Microsoft Preparation Guide&lt;br /&gt;&lt;a href="http://www.microsoft.com/learning/exams/70-536.asp"&gt;http://www.microsoft.com/learning/exams/70-536.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Microsoft free Skills Assessments&lt;br /&gt;&lt;a href="http://assessment.learning.microsoft.com/test/home.asp"&gt;http://assessment.learning.microsoft.com/test/home.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Measure UP&lt;br /&gt;&lt;a href="http://www.measureup.com/Site/display_article.aspx?id=955"&gt;http://www.measureup.com/Site/display_article.aspx?id=955&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SelfTest Software&lt;br /&gt;&lt;a href="http://www.selftestsoftware.com/dept.aspx?dept_id=1000"&gt;http://www.selftestsoftware.com/dept.aspx?dept_id=1000&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Transcender&lt;br /&gt;&lt;a href="http://www.transcender.com/gen.aspx?pf=page&amp;sn=TraNewEngine"&gt;http://www.transcender.com/gen.aspx?pf=page&amp;amp;sn=TraNewEngine&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5240710936980668707?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5240710936980668707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5240710936980668707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5240710936980668707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5240710936980668707'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2007/01/mcts-linkx.html' title='MCTS Links'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5280236837201801506</id><published>2006-11-30T10:46:00.000-08:00</published><updated>2006-12-13T13:00:00.906-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Report'/><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><title type='text'>Passing parameter to Crystal  Report in VB.NET</title><content type='html'>Here is how to pass a parameter value to a Crystal Report objet at runtime. There are two methods, depending if the report is to be exported as a file or opened with a viewer.&lt;br /&gt;Required namespace:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; CrystalDecisions.CrystalReports.Engine&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; CrystalDecisions.Shared&lt;/pre&gt;&lt;br /&gt;EXAMPLE 1: parameter to a report exported as a file&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;'loading the report with dynamic data &lt;/span&gt;&lt;br /&gt;myCrystalReport.Load()&lt;br /&gt;myCrystalReport.SetDataSource(myDataSet)&lt;br /&gt;myCrystalReport.Refresh()&lt;br /&gt;&lt;span class="rem"&gt;'Passing the parameter&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; param &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; ParameterDiscreteValue&lt;br /&gt;param.Value = &lt;span class="str"&gt;"my value"&lt;/span&gt;&lt;br /&gt;myCrystalReport.ParameterFields(&lt;span class="str"&gt;"parameterName"&lt;/span&gt;).CurrentValues.Add(param)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'exporting as .PDF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;myCrystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, strFileName)&lt;/pre&gt;&lt;br /&gt;EXAMPLE 2 : parameter to a report opened with a crystal viewer:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="rem"&gt;'Loading the report with dynamic data &lt;/span&gt;&lt;br /&gt; myCrystalReport.SetDataSource(myDataSet)&lt;br /&gt; myCrystalReport.Refresh()&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;'Creating and binding the report viewer&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; frmViewer &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; CrystalDecisions.Windows.Forms.CrystalReportViewer()&lt;br /&gt; frmViewer.ReportSource = myCrystalReport&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;'Passing the parameter&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; oField &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; ParameterField()&lt;br /&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; oVal &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; ParameterDiscreteValue()&lt;br /&gt; oField.ParameterFieldName = &lt;span class="str"&gt;"parameterName"&lt;/span&gt;&lt;br /&gt; oVal.Value = &lt;span class="str"&gt;" my parameter value "&lt;/span&gt;&lt;br /&gt; oField.CurrentValues.Add(oVal)&lt;br /&gt; frmViewer.ParameterFieldInfo.Add(oField)&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;'Showing the viewer&lt;/span&gt;&lt;br /&gt; frmViewer.Show()&lt;/pre&gt;&lt;br /&gt;It works with Crystal Report 10.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5280236837201801506?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5280236837201801506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5280236837201801506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5280236837201801506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5280236837201801506'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/11/passing-parameter-to-crystal-report-in.html' title='Passing parameter to Crystal  Report in VB.NET'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6975895166022711982</id><published>2006-11-22T11:11:00.000-08:00</published><updated>2008-04-23T07:52:33.337-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Simple function for converting a .NET DataTable to CSV format.</title><content type='html'>Need to convert a datatable directly to CSV string, write the datatable in a CSV file, or export it in a Excel compatible format?&lt;br /&gt;&lt;br /&gt;This method can be used for creating a .csv string or file that can be opened with Excel.&lt;br /&gt;Excel can import CSV, Excel parses automatically CSV data when the CSV file have a ".xls" extension.&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' Exporting a datatable to an Excel file&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; WriteDataTableToCsvFile(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; dtTowrite &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; strFileName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; sw &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.IO.StreamWriter(strFileName, &lt;span class="kwrd"&gt;False&lt;/span&gt;, System.Text.Encoding.&lt;span class="kwrd"&gt;Unicode&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;' see function below&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;dim&lt;/span&gt; strContent &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; = ConvertDataTableToCSV(dtTowrite, ControlChars.Tab)&lt;br /&gt;sw.Write(strContent)&lt;br /&gt;sw.Close()&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;'''  Converting a datatable to as comma separated value string format, compatible for Excel.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' This method dynamically create columns headers.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' The method ensures thant the separator value will be removed from &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;''' the datatable fields if it is already there, for consistency purpose.&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ConvertDataTableToCSV(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; dtTowrite &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable, _&lt;br /&gt; &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; strColSeparator &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;' Line breaks are reserved for separating rows&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt; (strColSeparator = Environment.NewLine) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt; Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(&lt;span class="str"&gt;"A new line cannot be used for a csv columns separator."&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sb &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Text.StringBuilder&lt;br /&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; intNbCols &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt; = dtTowrite.Columns.Count&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;'Write headers&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;For&lt;/span&gt; i &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt; = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; intNbCols - 1&lt;br /&gt;     sb.Append(dtTowrite.Columns(i).ColumnName.Replace(strColSeparator, &lt;span class="str"&gt;" "&lt;/span&gt;) _&lt;br /&gt;     + strColSeparator)&lt;br /&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt; sb.Append(Environment.NewLine)&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;'write data&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; line &lt;span class="kwrd"&gt;As&lt;/span&gt; DataRow &lt;span class="kwrd"&gt;In&lt;/span&gt; dtTowrite.Rows&lt;br /&gt;     &lt;span class="kwrd"&gt;For&lt;/span&gt; i &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt; = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; intNbCols - 1&lt;br /&gt;         sb.Append(line(i).ToString().Replace(strColSeparator, &lt;span class="str"&gt;" "&lt;/span&gt;) + _&lt;br /&gt;         strColSeparator)&lt;br /&gt;     &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;     sb.Append(Environment.NewLine)&lt;br /&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Return&lt;/span&gt; sb.ToString()&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;&lt;br /&gt;That's all. It can be tested with the following code:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; dt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable()&lt;br /&gt;dt.Columns.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; DataColumn(&lt;span class="str"&gt;"date"&lt;/span&gt;, &lt;span class="kwrd"&gt;GetType&lt;/span&gt;(System.DateTime)))&lt;br /&gt;&lt;span class="kwrd"&gt;GetType&lt;/span&gt;(System.DateTime)))&lt;br /&gt;dt.Columns.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; DataColumn(&lt;span class="str"&gt;"name"&lt;/span&gt;, &lt;span class="kwrd"&gt;GetType&lt;/span&gt;(System.&lt;span class="kwrd"&gt;String&lt;/span&gt;)))&lt;br /&gt;dt.Columns.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; DataColumn(&lt;span class="str"&gt;"id"&lt;/span&gt;, &lt;span class="kwrd"&gt;GetType&lt;/span&gt;(System.Int32)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; line &lt;span class="kwrd"&gt;As&lt;/span&gt; DataRow = dt.NewRow()&lt;br /&gt;line(&lt;span class="str"&gt;"date"&lt;/span&gt;) = Now()&lt;br /&gt;line(&lt;span class="str"&gt;"name"&lt;/span&gt;) = &lt;span class="str"&gt;"Albert Einstein"&lt;/span&gt;&lt;br /&gt;line(&lt;span class="str"&gt;"id"&lt;/span&gt;) = 28847&lt;br /&gt;line(&lt;span class="str"&gt;"test"&lt;/span&gt;) = &lt;span class="str"&gt;"sdfiom "&lt;/span&gt; + ControlChars.Tab + &lt;span class="str"&gt;" pok po"&lt;/span&gt;&lt;br /&gt;dt.Rows.Add(line)&lt;br /&gt;&lt;br /&gt;line = dt.NewRow()&lt;br /&gt;line(&lt;span class="str"&gt;"date"&lt;/span&gt;) = Now().AddYears(99)&lt;br /&gt;line(&lt;span class="str"&gt;"name"&lt;/span&gt;) = &lt;span class="str"&gt;"Charles Darwin"&lt;/span&gt;&lt;br /&gt;line(&lt;span class="str"&gt;"id"&lt;/span&gt;) = 28847&lt;br /&gt;line(&lt;span class="str"&gt;"test"&lt;/span&gt;) = &lt;span class="str"&gt;"sdfsdfsdfsdfsdf"&lt;/span&gt;&lt;br /&gt;dt.Rows.Add(line)&lt;br /&gt;&lt;br /&gt;line = dt.NewRow()&lt;br /&gt;line(&lt;span class="str"&gt;"date"&lt;/span&gt;) = Now().AddDays(2)&lt;br /&gt;line(&lt;span class="str"&gt;"name"&lt;/span&gt;) = &lt;span class="str"&gt;"Sigmund Freud"&lt;/span&gt;&lt;br /&gt;line(&lt;span class="str"&gt;"id"&lt;/span&gt;) = 23423423&lt;br /&gt;&lt;span class="rem"&gt;' ligne("test") = EMPTY ROW&lt;/span&gt;&lt;br /&gt;dt.Rows.Add(line)&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strTest &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = ConvertDataTableToCSV(dt, ControlChars.Tab)&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; sw &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.IO.StreamWriter(&lt;span class="str"&gt;"C:\Test.xls"&lt;/span&gt;)&lt;br /&gt;sw.Write(strTest)&lt;br /&gt;sw.Close()&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6975895166022711982?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6975895166022711982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6975895166022711982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6975895166022711982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6975895166022711982'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/11/simple-function-for-converting.html' title='Simple function for converting a .NET DataTable to CSV format.'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-5888203686992798682</id><published>2006-11-02T06:24:00.000-08:00</published><updated>2006-11-02T06:26:42.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>sql server french format date</title><content type='html'>Here is how we can get a YYYY-MM-DD date format, without the hours and minutes.&lt;br /&gt;&lt;br /&gt;select CONVERT(VARCHAR(10), GetDate(), 120) as [myFrenchDate]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-5888203686992798682?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/5888203686992798682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=5888203686992798682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5888203686992798682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/5888203686992798682'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/11/sql-server-french-format-date.html' title='sql server french format date'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-1432629371374442064</id><published>2006-10-20T09:39:00.000-07:00</published><updated>2006-12-13T12:59:33.587-08:00</updated><title type='text'>Great free addIn for Visual Studio 2005</title><content type='html'>&lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/tags/Smart%20Paster%20Add-In/default.aspx"&gt;Smart Paster&lt;/a&gt;&lt;br /&gt;The most practical addin: enabled multiple line pasting of string into Visual Studio from other applications. I use smart paster to paste SQL strings without headaches!&lt;br /&gt;You can paste text as comment,  string,  stringbuilder or region. To be used with the right mouse button.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/gmilano/archive/2006/02/27/439208.aspx"&gt;Cool command &lt;/a&gt;&lt;br /&gt;Interresting contextual menu addin for project: collapse all, open container folder, reference manager&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.red-gate.com/products/SQL_Prompt/index.htm"&gt;Dev Express SQL prompt &lt;/a&gt;&lt;br /&gt;Enable intellisense style edition  in SQL Query Analyzer and SQL Server Management Studio.&lt;br /&gt;You just have to register to use it freely.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codekeep.net"&gt;CokeKeep&lt;/a&gt;&lt;br /&gt;Code snippet storing and sharing website. Can be used with a Visual Studio addin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REFERENCES&lt;br /&gt;&lt;a href="http://asp-net-whidbey.blogspot.com/2006/02/ten-essential-visual-studio-2005-tools.html"&gt;Ten tools for VS 2005&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Listing of 10  smart plug-ins.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://visualstudiohacks.com"&gt;Visual studio Hacks&lt;/a&gt;&lt;br /&gt;By the author of the book "Visual Studio Hacks"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-1432629371374442064?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/1432629371374442064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=1432629371374442064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1432629371374442064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1432629371374442064'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/then-tools-for-vs-2005.html' title='Great free addIn for Visual Studio 2005'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-4652132817519612288</id><published>2006-10-19T13:35:00.000-07:00</published><updated>2007-02-02T06:35:55.576-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><title type='text'>.NET assembly binding order</title><content type='html'>Excellent article explainig how referenced assemblies are loaded from the IDE (visual studio) or at runtime.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plans.thefrankes.com/tutorials/Assemblies/"&gt;http://plans.thefrankes.com/tutorials/Assemblies/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-4652132817519612288?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/4652132817519612288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=4652132817519612288' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/4652132817519612288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/4652132817519612288'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/net-assembly-binding-order.html' title='.NET assembly binding order'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-8394460686868571382</id><published>2006-10-17T08:07:00.000-07:00</published><updated>2006-11-28T06:09:16.832-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Sql Server add culumn if not exist</title><content type='html'>Generic script for adding a column if not already existing in database.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; ( &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;br /&gt;  &lt;span class="kwrd"&gt;FROM&lt;/span&gt; [dbo].syscolumns &lt;br /&gt;   ID = OBJECT_ID(N&lt;span class="str"&gt;'[dbo].tableName'&lt;/span&gt;) &lt;br /&gt;    &lt;span class="kwrd"&gt;AND&lt;/span&gt;   NAME = N&lt;span class="str"&gt;'culumnName'&lt;/span&gt;) &lt;br /&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.tableName&lt;br /&gt;  &lt;span class="kwrd"&gt;ADD&lt;/span&gt; &lt;br /&gt; culumnName &lt;span class="kwrd"&gt;decimal&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;END&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-8394460686868571382?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/8394460686868571382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=8394460686868571382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/8394460686868571382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/8394460686868571382'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/sql-server-add-culumn-if-not-exist.html' title='Sql Server add culumn if not exist'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-7732250473233740509</id><published>2006-10-11T13:52:00.000-07:00</published><updated>2006-10-11T13:53:52.200-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Changing cursor (mouse pointer) in javascript</title><content type='html'>// for a hourglass cursor&lt;br /&gt;window.document.body.style.cursor = "wait";&lt;br /&gt;&lt;br /&gt;// for a normal cursor&lt;br /&gt;window.document.body.style.cursor = "default";&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-7732250473233740509?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/7732250473233740509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=7732250473233740509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7732250473233740509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/7732250473233740509'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/changing-cursor-mouse-pointer-in.html' title='Changing cursor (mouse pointer) in javascript'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-6579928992508647540</id><published>2006-10-11T13:46:00.000-07:00</published><updated>2006-10-12T08:43:30.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Adding global validation before submit (javascript)</title><content type='html'>Context: need for validation or special javascript behaviour before POST.&lt;br /&gt;&lt;br /&gt;Since the asp.net postback mecanism occurs with html POST method, it is possible to add an javascript event that replace the normal post event to force a special behaviour or validation.&lt;br /&gt;&lt;br /&gt;This function define a pointer to the normal post event of the form, than it define a behaviour that will occur when the post event will fire. This behaviour  decides if the form will really submit (ie firing a asp.net postback event).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// setting the handler of the main form:&lt;br /&gt;SetSubmitHandler(document.forms[0]);&lt;br /&gt;&lt;br /&gt;// handler definition to personalize&lt;br /&gt;function SetSubmitHandler(form)&lt;br /&gt;{&lt;br /&gt; // setting a pointer to the original submit function&lt;br /&gt; // to really post the form to the server&lt;br /&gt; form.orginalSubmit = form.submit;&lt;br /&gt; &lt;br /&gt; // function that replaces the normal post function&lt;br /&gt; form.newSubmit = function()&lt;br /&gt; {&lt;br /&gt;  // special behaviour&lt;br /&gt;  // .....  &lt;br /&gt;  if (1==1)// validation goes here..&lt;br /&gt;  {&lt;br /&gt;  // validation is ok --&gt; post to the server&lt;br /&gt;   form.orginalSubmit();&lt;br /&gt;  }    &lt;br /&gt; }&lt;br /&gt; // replacing the standard handler (posting to the server)&lt;br /&gt; // with the new handler&lt;br /&gt; form.submit = form.newSubmit;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-6579928992508647540?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/6579928992508647540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=6579928992508647540' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6579928992508647540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/6579928992508647540'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/adding-global-validation-before-submit.html' title='Adding global validation before submit (javascript)'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-1899255078294494339</id><published>2006-10-10T13:23:00.000-07:00</published><updated>2006-10-11T06:02:26.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Changing url between frames in a frameset</title><content type='html'>Need a javascript than can, from a frame, relaod another frame with a new url -- or a url with new parameters? &lt;br /&gt;&lt;br /&gt;// by frame id (in the parent frameset)&lt;br /&gt;parent.frames["OtherFrameId"].window.location = "http://...."&lt;br /&gt;&lt;br /&gt;// or by index&lt;br /&gt;parent.frames[2].window.location = "http://..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-1899255078294494339?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/1899255078294494339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=1899255078294494339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1899255078294494339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/1899255078294494339'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/changing-another-frames-url-within.html' title='Changing url between frames in a frameset'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-953085900356232613</id><published>2006-10-10T13:16:00.000-07:00</published><updated>2007-03-23T10:10:19.776-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Cursor in SQL Server</title><content type='html'>Example of a simple cursor, SQL Server.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DECLARE @id integer&lt;br /&gt;DECLARE @name  varchar(500)&lt;br /&gt;&lt;br /&gt;    DECLARE myCursor CURSOR FOR&lt;br /&gt;    SELECT   cursomerId, [name]&lt;br /&gt;    FROM   CUSTOMER&lt;br /&gt;&lt;br /&gt;    OPEN myCursor&lt;br /&gt;&lt;br /&gt;    FETCH NEXT FROM myCursor&lt;br /&gt;    INTO @id, @name&lt;br /&gt;&lt;br /&gt;    WHILE @@FETCH_STATUS = 0&lt;br /&gt;    BEGIN&lt;br /&gt;    -- do something (updates, insert into other tables, etc)&lt;br /&gt;    print @name&lt;br /&gt;&lt;br /&gt;        FETCH NEXT FROM myCursor&lt;br /&gt;        INTO @id, @name&lt;br /&gt;&lt;br /&gt;    END&lt;br /&gt;&lt;br /&gt;CLOSE myCursor&lt;br /&gt;DEALLOCATE myCursor&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-953085900356232613?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/953085900356232613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=953085900356232613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/953085900356232613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/953085900356232613'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/cursor-in-sql-server.html' title='Cursor in SQL Server'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-3976037679380630582</id><published>2006-10-06T09:25:00.000-07:00</published><updated>2006-10-11T06:03:55.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='cookies'/><title type='text'>Setting and retrieving cookies in javascript</title><content type='html'>Here are two function to use cookies directly from javascript. The firt one stock a pair of key/value in the cookie collection. The second one retrieve the value for a key.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function setCookie(idCookie,value)&lt;br /&gt;{&lt;br /&gt;  var cookie_date = new Date ();  // current date &amp; time&lt;br /&gt;  var milli = cookie_date.getMilliseconds()+5*60*1000; // == cokie valid for 5 minutes&lt;br /&gt;  cookie_date.setMilliseconds(milli);&lt;br /&gt;  cookie_date.setTime ( cookie_date.getTime());&lt;br /&gt;  document.cookie = idCookie += "=" + value +"; expires=" + cookie_date.toGMTString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getCookie ( idCookie )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;var results = document.cookie.match ( idCookie + '=(.*?)(;|$)' );&lt;br /&gt;&lt;br /&gt;if ( results )&lt;br /&gt;   return ( unescape ( results[1] ) );&lt;br /&gt;else&lt;br /&gt;   return null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-3976037679380630582?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/3976037679380630582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=3976037679380630582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/3976037679380630582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/3976037679380630582'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/setting-and-retrievint-cookies-in.html' title='Setting and retrieving cookies in javascript'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7520131191484008290.post-85501578525748590</id><published>2006-10-04T08:05:00.000-07:00</published><updated>2006-12-13T12:24:18.708-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Loading class by name from another asp.net application</title><content type='html'>What if you need to load a class, a webcontrol or a user control that is not in the current web application and the .dll of the other application is not  used in the current application?&lt;br /&gt;&lt;br /&gt;Remoting can help to do that. The control to load will be created with remoting using the class name given as string.&lt;br /&gt;&lt;br /&gt;'Vb example, loading a web control from another application&lt;br /&gt;&lt;br /&gt;Dim dllPhysicalPath as String = "C:\...\...\myOtherApplication.dll"&lt;br /&gt;Dim ClassName as String = "MyNamespace.MyClassName"&lt;br /&gt;Dim controlHandle As Runtime.Remoting.ObjectHandle&lt;br /&gt;controlHandle = Activator.CreateInstanceFrom(dllPath , ClassName )&lt;br /&gt;' converting to webcontrol&lt;br /&gt;dim myCtr as WebControl = CType(controlHandle .Unwrap, WebControl)&lt;br /&gt;Page.Controls.Add(myCtr )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7520131191484008290-85501578525748590?l=aspnetgarage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspnetgarage.blogspot.com/feeds/85501578525748590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7520131191484008290&amp;postID=85501578525748590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/85501578525748590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7520131191484008290/posts/default/85501578525748590'/><link rel='alternate' type='text/html' href='http://aspnetgarage.blogspot.com/2006/10/loading-class-by-name-from-another.html' title='Loading class by name from another asp.net application'/><author><name>Denis Sauve</name><uri>http://www.blogger.com/profile/06617476369749935545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
