<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUMFRHw4fCp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943</id><updated>2011-11-28T01:43:35.234+02:00</updated><category term="mobile" /><category term="validate video" /><category term="validate picture" /><category term="Reflection" /><category term="DataGridView" /><category term="merge replication" /><category term="c# extension methods" /><category term="sql merge" /><category term="IDictionary" /><category term="validate image" /><category term="c# extensions" /><category term="Enum" /><category term="file" /><category term="c# stream" /><category term="sql server" /><category term="Extension methods" /><title>Out of memory</title><subtitle type="html">This is no blog. This is a place for some useful code that I may forget in near future.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://mynkow.blogspot.com/" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/uMfBx" /><feedburner:info uri="blogspot/umfbx" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUUDQno4fCp7ImA9WxFQFks.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-8707774494608379334</id><published>2010-05-12T13:29:00.006+03:00</published><updated>2010-05-12T14:21:13.434+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-12T14:21:13.434+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c# extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="c# extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="Enum" /><title>.NET C# Extension Methods - Enum</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;&lt;strong&gt;Other extension methods:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html"&gt;DataGridView&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html"&gt;Dictionary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html"&gt;Enum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html"&gt;Reflection&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;---------------------------&lt;/p&gt;&lt;p&gt;These two extension methods for enum are useful when you want to get the enum name or the enum value as a string. To get the value as a string you have to first cast it to an object and then to int type.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Enum extension methods.&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    public static class EnumExtensionMethods&lt;br /&gt;    {&lt;br /&gt;        public static string ValueToString( this Enum self )&lt;br /&gt;        {&lt;br /&gt;            return ( ( int )(object)self ).ToString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string NameToString( this Enum self )&lt;br /&gt;        {&lt;br /&gt;            return self.ToString();&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-8707774494608379334?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_7IwO_kE_-CVKesIwf4xVQUyVJ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_7IwO_kE_-CVKesIwf4xVQUyVJ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_7IwO_kE_-CVKesIwf4xVQUyVJ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_7IwO_kE_-CVKesIwf4xVQUyVJ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/lI-OsYaeUb8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/8707774494608379334/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/8707774494608379334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/8707774494608379334?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/lI-OsYaeUb8/net-c-extension-methods-enum.html" title=".NET C# Extension Methods - Enum" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcEQH8yfSp7ImA9WxFRGUU.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-7151065489064250497</id><published>2010-05-04T16:55:00.005+03:00</published><updated>2010-05-04T17:06:41.195+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-04T17:06:41.195+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="validate video" /><category scheme="http://www.blogger.com/atom/ns#" term="validate picture" /><category scheme="http://www.blogger.com/atom/ns#" term="file" /><category scheme="http://www.blogger.com/atom/ns#" term="validate image" /><category scheme="http://www.blogger.com/atom/ns#" term="c# stream" /><title>How to validate video file</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;In my previous post I showed you &lt;a href="http://mynkow.blogspot.com/2010/04/validate-image.html"&gt;how to validate an image/picture file&lt;/a&gt;. Today I will add a video support to this validation and I will refactor the class a bit. Just know that video validation use exactly the same logic.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;    public enum FileType&lt;br /&gt;    {&lt;br /&gt;        Picture,&lt;br /&gt;        Audio,&lt;br /&gt;        Video,&lt;br /&gt;        Text,&lt;br /&gt;        Other,&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static class FileValidator&lt;br /&gt;    {&lt;br /&gt;        private static Dictionary&amp;lt;FileType, byte[][]&amp;gt; _definedHeaders = new Dictionary&amp;lt;FileType, byte[][]&amp;gt;( 2 );&lt;br /&gt;&lt;br /&gt;        //  Defined video headers.&lt;br /&gt;        private static byte[][] _videoHeaders = new byte[][]&lt;br /&gt;        {&lt;br /&gt;            new byte[]{ 0x41, 0x56, 0x49, 0x20 },                                                               //  .avi&lt;br /&gt;            new byte[]{ 0x52, 0x49, 0x46, 0x46 },                                                               //  .avi&lt;br /&gt;            new byte[]{ 0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62 },   //  .asf, .wmv&lt;br /&gt;            new byte[]{ 0x00, 0x00, 0x01, 0xB3 },                                                               //  .mpg&lt;br /&gt;            new byte[]{ 0x46, 0x4C, 0x56 }                                                                     //  .flv&lt;br /&gt;&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        //  Defined image headers.&lt;br /&gt;        private static byte[][] _imageHeaders = new byte[][]&lt;br /&gt;        {&lt;br /&gt;            new byte[]{ 0xFF, 0xD8 },                                       //  .jpg, .jpeg, .jpe, .jfif, .jif&lt;br /&gt;            new byte[]{ 0x42, 0x4D},                                        //  .bmp&lt;br /&gt;            new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A },   //  .png&lt;br /&gt;            new byte[]{ 0x47, 0x49, 0x46 }                                  //  .gif&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        static FileValidator()&lt;br /&gt;        {&lt;br /&gt;            RegisterHeaders();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void RegisterHeaders()&lt;br /&gt;        {&lt;br /&gt;            _definedHeaders.Add( FileType.Picture, _imageHeaders );&lt;br /&gt;            _definedHeaders.Add( FileType.Video, _videoHeaders );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Validate that the stream is of an expected type.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;remarks&amp;gt;&lt;br /&gt;        /// IMPORTANT: The calling code is responsible for creating and disposing the stream.&lt;br /&gt;        /// &amp;lt;/remarks&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;theStream&amp;quot;&amp;gt;The stream of a file.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;exception cref=&amp;quot;Exception&amp;quot;&amp;gt;Throws if the stream is of invalid file.&amp;lt;/exception&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        public static bool IsValidFile( Stream theStream, FileType ofTFileype )&lt;br /&gt;        {&lt;br /&gt;            if( theStream.Length &amp;gt; 0 )&lt;br /&gt;            {&lt;br /&gt;                byte[] header = new byte[ 8 ]; // Change size if needed.&lt;br /&gt;                theStream.Read( header, 0, header.Length );&lt;br /&gt;&lt;br /&gt;                bool hasHeader = _definedHeaders[ ofTFileype ].Count( magic =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    int i = 0;&lt;br /&gt;                    if( magic.Length &amp;gt; header.Length )&lt;br /&gt;                        return false;&lt;br /&gt;                    return magic.Count( b =&amp;gt; { return b == header[ i++ ]; } ) == magic.Length;&lt;br /&gt;                } ) &amp;gt; 0;&lt;br /&gt;&lt;br /&gt;                return hasHeader;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static bool IsValidFile( FileInfo fileInfo, FileType ofFileType )&lt;br /&gt;        {&lt;br /&gt;            bool result = fileInfo.Exists;&lt;br /&gt;&lt;br /&gt;            if( IsFileTypeRegistered( ofFileType ) )&lt;br /&gt;            {&lt;br /&gt;                using( Stream stream = fileInfo.OpenRead() )&lt;br /&gt;                {&lt;br /&gt;                    result = result ? FileValidator.IsValidFile( stream, ofFileType ) : false;&lt;br /&gt;&lt;br /&gt;                    if( !result )&lt;br /&gt;                        throw new Exception( string.Format( &amp;quot;Invalid {0} file. {1}&amp;quot;, ofFileType.NameToString(), fileInfo.FullName ) );&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static bool IsFileTypeRegistered( FileType fileType )&lt;br /&gt;        {&lt;br /&gt;            return _definedHeaders.ContainsKey( fileType );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static bool IsValidFile( string file, FileType ofFileType )&lt;br /&gt;        {&lt;br /&gt;            return IsValidFile( new FileInfo( file ), ofFileType );&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-7151065489064250497?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I91Yak2BwmlglKoSDOe-iaxqDBo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I91Yak2BwmlglKoSDOe-iaxqDBo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I91Yak2BwmlglKoSDOe-iaxqDBo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I91Yak2BwmlglKoSDOe-iaxqDBo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/MGIK8HBuTFo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/7151065489064250497/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2010/05/how-to-validate-video-file.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/7151065489064250497?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/7151065489064250497?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/MGIK8HBuTFo/how-to-validate-video-file.html" title="How to validate video file" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2010/05/how-to-validate-video-file.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cHRHw4eip7ImA9WxFRFUg.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-114855020074676635</id><published>2010-04-29T17:03:00.003+03:00</published><updated>2010-04-29T17:23:55.232+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-29T17:23:55.232+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="validate picture" /><category scheme="http://www.blogger.com/atom/ns#" term="validate image" /><category scheme="http://www.blogger.com/atom/ns#" term="c# stream" /><title>Validate image</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;When we work with files we use stream. The problem is that you expect a stream of an image/picture but actually you get something else - probably a stream of a renamed 500GB iso file. So it is a good practice to validate and be sure that the file is actually an image/picture before reading the whole file. This is a simple task because each image/picture type has a header with unique value at the beginning if the file. So we will get the first few bytes from our file and compare them with statically defined headers for each image/picture type. These statically defined headers can be googled easily.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        //  Defined image headers.&lt;br /&gt;        private static byte[][] _imageHeaders = new byte[][]&lt;br /&gt;        {&lt;br /&gt;            new byte[]{ 0xFF, 0xD8 },                                       //  .jpg, .jpeg, .jpe, .jfif, .jif&lt;br /&gt;            new byte[]{ 0x42, 0x4D},                                        //  .bmp&lt;br /&gt;            new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A },   //  .png&lt;br /&gt;            new byte[]{ 0x47, 0x49, 0x46 }                                  //  .gif&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Validate that the stream is of an image file.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;remarks&amp;gt;&lt;br /&gt;        /// IMPORTANT: The calling code is responsible for creating and disposing the image stream.&lt;br /&gt;        /// Supported file types: .JPEG .BMP .GIF .PNG&lt;br /&gt;        /// &amp;lt;/remarks&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;imageStream&amp;quot;&amp;gt;The stream of a picture file.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;exception cref=&amp;quot;Exception&amp;quot;&amp;gt;Throws if the stream is of invalid image.&amp;lt;/exception&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        public static bool IsValidImage( Stream imageStream )&lt;br /&gt;        {&lt;br /&gt;            if( imageStream.Length &amp;gt; 0 )&lt;br /&gt;            {&lt;br /&gt;                byte[] header = new byte[ 8 ]; // Change size if needed.&lt;br /&gt;                imageStream.Read( header, 0, header.Length );&lt;br /&gt;&lt;br /&gt;                bool hasImageHeader = _imageHeaders.Count( magic =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    int i = 0;&lt;br /&gt;                    if( magic.Length &amp;gt; header.Length )&lt;br /&gt;                        return false;&lt;br /&gt;                    return magic.Count( b =&amp;gt; { return b == header[ i++ ]; } ) == magic.Length;&lt;br /&gt;                } ) &amp;gt; 0;&lt;br /&gt;&lt;br /&gt;                return hasImageHeader;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-114855020074676635?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gomfsuzkBFciSdJugMIMEbzr910/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gomfsuzkBFciSdJugMIMEbzr910/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gomfsuzkBFciSdJugMIMEbzr910/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gomfsuzkBFciSdJugMIMEbzr910/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/EaEfD7iTCFk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/114855020074676635/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2010/04/validate-image.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/114855020074676635?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/114855020074676635?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/EaEfD7iTCFk/validate-image.html" title="Validate image" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2010/04/validate-image.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYDSXo_fCp7ImA9WxFQFks.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-4214757392036440182</id><published>2009-11-22T22:44:00.016+02:00</published><updated>2010-05-12T14:19:38.444+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-12T14:19:38.444+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c# extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="c# extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="Reflection" /><title>.NET C# Extension Methods - Reflection</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;&lt;strong&gt;Other extension methods:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html"&gt;DataGridView&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html"&gt;Dictionary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html"&gt;Enum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html"&gt;Reflection&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;---------------------------&lt;/p&gt;&lt;p&gt;I was wondering how to get the name of a property via reflection. So I searched the Internet and I found &lt;a href="http://code.google.com/p/gim-projects/source/browse/presentations/CantDanceTheLambda/src/MemberNameParser.cs" target="_blank"&gt;this&lt;/a&gt; on &lt;a href="http://code.google.com/" target="_blank"&gt;Google code&lt;/a&gt;. It is better because it uses linq instead of reflection. After all the code was not good enough though. I was not able to get a string name from level 3 (i.e: User.Name.First). I did a small modifications and ended with this class that works perfect.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// An extentension method on an actual object to get its member names&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    public static class ReflectionExtensions&lt;br /&gt;    {&lt;br /&gt;        public static string MemberName&amp;lt;T, R&amp;gt;( this T obj, Expression&amp;lt;Func&amp;lt;T, R&amp;gt;&amp;gt; expr )&lt;br /&gt;        {&lt;br /&gt;            var node = expr.Body as MemberExpression;&lt;br /&gt;            if( object.ReferenceEquals( null, node ) )&lt;br /&gt;                throw new InvalidOperationException( &amp;quot;Expression must be of member access&amp;quot; );&lt;br /&gt;            return node.Member.Name;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// If we don&amp;#39;t have an actual object we can still refer to its type with this generic static class&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    public static class MembersOf&amp;lt;T&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        public static string GetName&amp;lt;R&amp;gt;( Expression&amp;lt;Func&amp;lt;T, R&amp;gt;&amp;gt; expr )&lt;br /&gt;        {&lt;br /&gt;            var node = expr.Body as MemberExpression;&lt;br /&gt;            if( object.ReferenceEquals( null, node ) )&lt;br /&gt;                throw new InvalidOperationException( &amp;quot;Expression must be of member access&amp;quot; );&lt;br /&gt;&lt;br /&gt;            string result = BuildName( node, sb );&lt;br /&gt;&lt;br /&gt;            sb.Remove( 0, sb.Length );&lt;br /&gt;            temp.Remove( 0, temp.Length );&lt;br /&gt;&lt;br /&gt;            return result.Remove( result.Length-1 );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static StringBuilder sb = new StringBuilder();&lt;br /&gt;        private static StringBuilder temp = new StringBuilder();&lt;br /&gt;        private static string BuildName( MemberExpression expr, StringBuilder sb )&lt;br /&gt;        {&lt;br /&gt;            if( expr.IsNotNull() )&lt;br /&gt;            {&lt;br /&gt;                temp.Append( expr.Member.Name );&lt;br /&gt;                temp.Append(&amp;quot;.&amp;quot;);&lt;br /&gt;&lt;br /&gt;                sb.Insert( 0, temp.ToString() );&lt;br /&gt;&lt;br /&gt;                int i = 0;&lt;br /&gt;                i++;&lt;br /&gt;&lt;br /&gt;                temp.Remove( 0, temp.Length );&lt;br /&gt;&lt;br /&gt;                BuildName( expr.Expression as MemberExpression, sb );&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return sb.ToString();           &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Now the question is where this code can be handy? I use this when I want to build NHibernate Criteria or DetachedCriteria. When you create a Criteria you use a code like this one:&lt;/p&gt;&lt;pre name="code" class="c#"&gt;&lt;br /&gt;ICriteria crit = session.CreateCriteria(typeof(Customer));&lt;br /&gt;crit.Add(Expression.Eq(&amp;quot;Customer.Name.First&amp;quot;, someValue));&lt;/pre&gt;&lt;p&gt;Here the Name property is a NHibernate component. The problem is that if you change the property Name to FirstName you will not get a compile error but you will get runtime error when the query is executed against the database. Also you can use some refactoring tool like RefactorPro! and the changes in the component will be applied also in the criteria. Nice, ahh?!? And the code above will be:&lt;/p&gt;&lt;pre name="code" class="c#"&gt;&lt;br /&gt;ICriteria crit = session.CreateCriteria(typeof(Customer));&lt;br /&gt;crit.Add(Expression.Eq(MembersOf&amp;lt;Customer&amp;gt;.GetName(x=&amp;gt;x.Name.First), someValue));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-4214757392036440182?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OgKEEUZJcnSIanQtQq0mgRehTSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OgKEEUZJcnSIanQtQq0mgRehTSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OgKEEUZJcnSIanQtQq0mgRehTSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OgKEEUZJcnSIanQtQq0mgRehTSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/IQ2eA8eTFfY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/4214757392036440182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/4214757392036440182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/4214757392036440182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/IQ2eA8eTFfY/net-c-extension-methods-reflection.html" title=".NET C# Extension Methods - Reflection" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUHRnkzfyp7ImA9WxFQFks.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-8633752660728223626</id><published>2009-11-19T11:14:00.008+02:00</published><updated>2010-05-12T14:20:37.787+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-12T14:20:37.787+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c# extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="IDictionary" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="c# extension methods" /><title>.NET C# Extension Methods - IDictionary</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;&lt;strong&gt;Other extension methods:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html"&gt;DataGridView&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html"&gt;Dictionary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html"&gt;Enum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html"&gt;Reflection&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;---------------------------&lt;/p&gt;&lt;p&gt;Extension method for IDictionary. Returns the values associated with the key specified by parameter &lt;span style="font-style: italic;"&gt;key&lt;/span&gt;.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Gets the value of an element within a dictionary object.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;TValue&amp;quot;&amp;gt;The type of the value.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;bag&amp;quot;&amp;gt;The actual dictionary.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The key that will be searched for within the dictionary object.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;defaultValue&amp;quot;&amp;gt;Returns default value if the specified key was not found.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;Specific value within dictionary object.&amp;lt;/returns&amp;gt;&lt;br /&gt;        public static TValue GetValue&amp;lt;TValue&amp;gt;( this IDictionary bag, string key, TValue defaultValue )&lt;br /&gt;        {&lt;br /&gt;            object value = bag[ key ];&lt;br /&gt;&lt;br /&gt;            if( value == null )&lt;br /&gt;            {&lt;br /&gt;                value = defaultValue;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return defaultValue;&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Extension method for IDictionary. Adds a key-value pair.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Adds a (key,value) pair in a dictionary object.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;TKey&amp;quot;&amp;gt;The type of keys in the dictionary.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;TValue&amp;quot;&amp;gt;The type of values in the dictionary.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;bag&amp;quot;&amp;gt;The actual dictionary.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The name of the key used for easy navigation in a dictionary object.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;The value assoiciated with the key.&amp;lt;/param&amp;gt;&lt;br /&gt;        public static void SetValue&amp;lt;TKey, TValue&amp;gt;( this IDictionary&amp;lt;TKey,TValue&amp;gt; bag, TKey key, TValue value )&lt;br /&gt;        {&lt;br /&gt;            if( bag.ContainsKey( key ) )&lt;br /&gt;            {&lt;br /&gt;                bag[ key ] = value;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                bag.Add( key, value );&lt;br /&gt;            }&lt;br /&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-8633752660728223626?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_U3yBnpyXHSq0DVtAZrg4lWP-3A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_U3yBnpyXHSq0DVtAZrg4lWP-3A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_U3yBnpyXHSq0DVtAZrg4lWP-3A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_U3yBnpyXHSq0DVtAZrg4lWP-3A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/c_R-U9BwLfM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/8633752660728223626/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/8633752660728223626?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/8633752660728223626?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/c_R-U9BwLfM/net-c-extension-methods-idictionary.html" title=".NET C# Extension Methods - IDictionary" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCQn06fip7ImA9WxFQFks.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-6247338169578932720</id><published>2009-11-19T09:35:00.018+02:00</published><updated>2010-05-12T14:21:03.316+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-12T14:21:03.316+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c# extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="c# extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="DataGridView" /><title>.NET C# Extension Methods - DataGridView</title><content type="html">&lt;div id="content"&gt;&lt;p&gt;&lt;strong&gt;Other extension methods:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html"&gt;DataGridView&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-idictionary.html"&gt;Dictionary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2010/05/net-c-extension-methods-enum.html"&gt;Enum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods-reflection.html"&gt;Reflection&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;---------------------------&lt;/p&gt;&lt;p&gt;Extension method for DataGridView. Returns IDictionary with values of all selected rows and columns that are specified by parameter &lt;span style="font-style: italic;"&gt;columnName&lt;/span&gt;.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Gets values from selected rows and specified columns.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;grid&amp;quot;&amp;gt;The grid.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;columnName&amp;quot;&amp;gt;Name of the column/s.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        public static IList&amp;lt;IDictionary&amp;lt;string, object&amp;gt;&amp;gt; GetSelectedValuesFrom( this DataGridView grid, params string[] columnName )&lt;br /&gt;        {&lt;br /&gt;            IList&amp;lt;IDictionary&amp;lt;string,object&amp;gt;&amp;gt; results = new List&amp;lt;IDictionary&amp;lt;string, object&amp;gt;&amp;gt;( grid.SelectedRows.Count );&lt;br /&gt;&lt;br /&gt;            foreach( DataGridViewRow row in grid.SelectedRows )&lt;br /&gt;            {&lt;br /&gt;                IDictionary&amp;lt;string,object&amp;gt; rowResult = new Dictionary&amp;lt;string, object&amp;gt;( columnName.Length );&lt;br /&gt;&lt;br /&gt;                foreach( string column in columnName )&lt;br /&gt;                {&lt;br /&gt;                    rowResult.Add( column, row.Cells[ column ] );&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                results.Add( rowResult );&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return results;&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Extension method for DataGridView. Returns a list with values of all selected rows in the columns specified by parameter &lt;span style="font-style: italic;"&gt;columnName&lt;/span&gt;.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        public static IList&amp;lt;T&amp;gt; GetSelectedValuesFrom&amp;lt;T&amp;gt;( this DataGridView grid, string columnName )&lt;br /&gt;       {&lt;br /&gt;           IList&amp;lt;T&amp;gt; results = new List&amp;lt;T&amp;gt;( grid.SelectedRows.Count );&lt;br /&gt;&lt;br /&gt;           foreach( DataGridViewRow row in grid.SelectedRows )&lt;br /&gt;               results.Add( GetCurrentValueFrom&amp;lt;T&amp;gt;( grid, columnName ) );&lt;br /&gt;&lt;br /&gt;           return results;&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Extension method for DataGridView. Returns a single value of selected row in the columns specified by parameter &lt;span style="font-style: italic;"&gt;columnName&lt;/span&gt;.&lt;/p&gt;&lt;pre name="code" class="c#"&gt;        public static T GetCurrentValueFrom&amp;lt;T&amp;gt;( this DataGridView grid, string columnName )&lt;br /&gt;        {&lt;br /&gt;            if (grid.CurrentRow != null)&lt;br /&gt;            {&lt;br /&gt;                return (T)Convert.ChangeType(grid.CurrentRow.Cells[columnName].Value, typeof(T));&lt;br /&gt;            }&lt;br /&gt;            return (T) Convert.ChangeType(- 1,typeof(T));&lt;br /&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-6247338169578932720?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o569nw2ZsmGAmnykqCWZoT5ZTuU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o569nw2ZsmGAmnykqCWZoT5ZTuU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o569nw2ZsmGAmnykqCWZoT5ZTuU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o569nw2ZsmGAmnykqCWZoT5ZTuU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/MyaH7fmZjR4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/6247338169578932720/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/6247338169578932720?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/6247338169578932720?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/MyaH7fmZjR4/net-c-extension-methods.html" title=".NET C# Extension Methods - DataGridView" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2009/11/net-c-extension-methods.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8BQHs_eyp7ImA9WxJbF0U.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-2270229754057415104</id><published>2009-07-10T22:48:00.008+03:00</published><updated>2009-07-28T16:14:11.543+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T16:14:11.543+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql merge" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="sql server" /><category scheme="http://www.blogger.com/atom/ns#" term="merge replication" /><title>How to create a merge replication between MS SQL Server 2005 and MS SQL Server compact databases? Step2: Configure distributor and publications</title><content type="html">&lt;div id="content"&gt;&lt;h2&gt;CONTENT&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/05/stepbystep-how-to-create-merge.html"&gt;Step1: Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Step2: Configure distributor and publications &lt;span class="i"&gt;(you are here)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;INTRODUCTION&lt;/h2&gt;&lt;p&gt;If you are not familiar with &lt;a href="http://msdn.microsoft.com/en-us/library/ms151329(SQL.90).aspx" target="_blank"&gt;how merge replication works&lt;/a&gt; I strongly recommend you to go quickly trough the Microsoft's articles. To keep this tutorial as simple as possible the distributor and the publications will be on a single machine. The subscriber will use windows authentication as a security method to login to the publications.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-2270229754057415104?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tcxfdboyl6yRUeYAsfBDDZGzUZs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tcxfdboyl6yRUeYAsfBDDZGzUZs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tcxfdboyl6yRUeYAsfBDDZGzUZs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tcxfdboyl6yRUeYAsfBDDZGzUZs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/cKaJ1i2SApE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/2270229754057415104/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2009/07/how-to-create-merge-replication-between.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/2270229754057415104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/2270229754057415104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/cKaJ1i2SApE/how-to-create-merge-replication-between.html" title="How to create a merge replication between MS SQL Server 2005 and MS SQL Server compact databases? Step2: Configure distributor and publications" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2009/07/how-to-create-merge-replication-between.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cFQ3s6eCp7ImA9WxJbF0U.&quot;"><id>tag:blogger.com,1999:blog-8776240752751469943.post-4674327895570727479</id><published>2009-05-19T20:42:00.046+03:00</published><updated>2009-07-28T15:43:32.510+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T15:43:32.510+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql merge" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="sql server" /><category scheme="http://www.blogger.com/atom/ns#" term="merge replication" /><title>How to create a merge replication between MS SQL Server 2005 and MS SQL Server compact databases? Step1: Overview</title><content type="html">&lt;div id="content"&gt;&lt;h2&gt;CONTENT&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Step1: Overview &lt;span class="i"&gt;(you are here)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mynkow.blogspot.com/2009/07/how-to-create-merge-replication-between.html"&gt;Step2: Configure distributor and publications&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;PURPOSE&lt;/h2&gt;&lt;p&gt;In a real situation there will be for example one desktop application which gets and sets data to a database. If a part of this application contains module/domain for a warehouse then a mobile device with a bar code scanner is the perfect choice. The idea is to connect the mobile device to the database server via wireless connection and get some data.&lt;/p&gt;&lt;h2&gt;ENVIRONMENT&lt;/h2&gt;&lt;p&gt;Let's think about the whole picture. We must have a server station which holds our MS SQL 2005 server database. There I will create our first merge replication with configured &lt;span class="i"&gt;distributor&lt;/span&gt; and &lt;span class="i"&gt;publications&lt;/span&gt;. The MS SQL database will be on a virtual machine so we can simulate a real environment. Second is the mobile device so we need another separate computer/device (for this "how to" I will use mobile device emulator) and this will be our developer workstation. Our mobile device will be the &lt;span class="i"&gt;subscriber&lt;/span&gt; to the publications exposed by the distributor. The subscriptions will be created dynamically and programmed with C# code.  &lt;br /&gt;&lt;br /&gt;&lt;span class="b"&gt;Server station (virtual machine)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Windows Server 2003 R2&lt;/li&gt;&lt;li&gt;MSSQL Server 2005 Developer Edition&lt;/li&gt;&lt;/ul&gt;&lt;span class="b"&gt;Developer station (the mobile device)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows XP&lt;/li&gt;&lt;li&gt;Visual Studio 2008 SP1 with .NET Framework 3.5 SP1&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06111A3A-A651-4745-88EF-3D48091A390B&amp;amp;displaylang=en" target="_blank"&gt;Windows Mobile 6 Professional and SDK Kits Refresh&lt;/a&gt; - VS2008 comes with WM5. I will take advantage of the 6th version. The keywords here are &lt;span class="i"&gt;Professional&lt;/span&gt; and &lt;span class="i"&gt;Refresh.&lt;/span&gt; If you are interested in the different versions I can post some additional details.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8776240752751469943-4674327895570727479?l=mynkow.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ytupCUj40E1GmjTitS4mph_Q8zw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ytupCUj40E1GmjTitS4mph_Q8zw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ytupCUj40E1GmjTitS4mph_Q8zw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ytupCUj40E1GmjTitS4mph_Q8zw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/uMfBx/~4/y-U7ON0fgj4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mynkow.blogspot.com/feeds/4674327895570727479/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://mynkow.blogspot.com/2009/05/stepbystep-how-to-create-merge.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/4674327895570727479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8776240752751469943/posts/default/4674327895570727479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/uMfBx/~3/y-U7ON0fgj4/stepbystep-how-to-create-merge.html" title="How to create a merge replication between MS SQL Server 2005 and MS SQL Server compact databases? Step1: Overview" /><author><name>mynkow</name><uri>http://www.blogger.com/profile/17286274614098994349</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><feedburner:origLink>http://mynkow.blogspot.com/2009/05/stepbystep-how-to-create-merge.html</feedburner:origLink></entry></feed>

