<?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-4773008052255971421</id><updated>2012-02-16T16:13:16.670+08:00</updated><category term='C#'/><category term='PerfectApp'/><category term='MVC'/><category term='Internet'/><category term='Rants'/><category term='SQL'/><category term='WCF'/><category term='PDC'/><category term='Index'/><category term='SilverLight'/><category term='DB'/><category term='OZ'/><category term='TFS'/><category term='Linking'/><category term='design'/><category term='Surface'/><category term='event'/><category term='CV'/><category term='WPF'/><category term='Junction'/><category term='VS2008'/><category term='Pattern'/><category term='WM'/><title type='text'>The Developing Developer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-6296644197693404211</id><published>2010-09-20T09:37:00.002+08:00</published><updated>2010-09-20T09:40:44.357+08:00</updated><title type='text'>Important: ASP.NET Security Vulnerability</title><content type='html'>A few hours ago we released a &lt;a href="http://www.microsoft.com/technet/security/advisory/2416728.mspx"&gt;Microsoft Security Advisory&lt;/a&gt; about a security vulnerability in ASP.NET. This vulnerability exists in all versions of ASP.NET.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-6296644197693404211?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/6296644197693404211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=6296644197693404211' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/6296644197693404211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/6296644197693404211'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2010/09/important-aspnet-security-vulnerability.html' title='Important: ASP.NET Security Vulnerability'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4668933643219701153</id><published>2010-07-12T10:51:00.002+08:00</published><updated>2010-07-12T10:55:48.934+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SilverLight'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2008'/><title type='text'>Silverlight - The project type is not supported by this installation.</title><content type='html'>Launch a command window, navigate to "C:\Program Files\Microsoft visual Studio x\Common7\IDE"&lt;i&gt; (where x is the version number. i.e. 8, 9.0, 10.0)&lt;/i&gt; and run:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'lucida grande';"&gt;devenv /setup&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/4773008052255971421-4668933643219701153?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4668933643219701153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4668933643219701153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4668933643219701153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4668933643219701153'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2010/07/silverlight-project-type-is-not.html' title='Silverlight - The project type is not supported by this installation.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-1542941893521334774</id><published>2010-04-06T10:52:00.002+08:00</published><updated>2010-04-06T10:57:22.212+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL Optimization</title><content type='html'>I recently had to do some serious optimization to our SQL servers as load testing revealed that they would not cope under load. I found this article by &lt;a href="http://www.simple-talk.com/author/grant-fritchey/"&gt;Grant Fritchey&lt;/a&gt;, that was very helpful and I thought I'd share.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.simple-talk.com/sql/performance/controlling-execution-plans-with-hints/?utm_source=simpletalk&amp;amp;utm_medium=email&amp;amp;utm_content=ControllingHints20091116&amp;amp;utm_campaign=SQL"&gt;Controlling Execution Plans with Hints&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-1542941893521334774?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/1542941893521334774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=1542941893521334774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1542941893521334774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1542941893521334774'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2010/04/sql-optimization.html' title='SQL Optimization'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4633760247996690456</id><published>2009-12-18T10:46:00.006+08:00</published><updated>2009-12-18T11:03:29.189+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Index'/><title type='text'>SQL Server Index Basics</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_JHcNniNYPXo/SyrvXXSLeTI/AAAAAAAAAFk/6fhsyqew0ms/s1600-h/120.gif"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 65px; FLOAT: left; HEIGHT: 85px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416404686532737330" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/SyrvXXSLeTI/AAAAAAAAAFk/6fhsyqew0ms/s400/120.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;SQL Server Index Basics &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;25 November 2008&lt;br /&gt;by &lt;a href="http://www.simple-talk.com/author/robert-sheldon/"&gt;Robert Sheldon&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;Given the fundamental importance of indexes in databases, it always comes as a surprise how often the proper design of indexes is neglected. It often turns out that the programmer understands detail, but not the broad picture of what indexes do. Bob Sheldon comes to the rescue with a simple guide that serves either to remind or educate us all!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;O&lt;/span&gt;&lt;/strong&gt;ne of the most important routes to high performance in a SQL Server database is the index. Indexes speed up the querying process by providing swift access to rows in the data tables, similarly to the way a book’s index helps you find information quickly within that book. In this article, I provide an overview of SQL Server indexes and explain how they’re defined within a database and how they can make the querying process faster. Most of this information applies to indexes in both SQL Server 2005 and 2008; the basic structure has changed little from one version to the next. In fact, much of the information also applies to SQL Server 2000. This does not mean there haven’t been changes. New functionality has been added with each successive version; however, the underlying structures have remained relatively the same. So for the sake of brevity, I stick with 2005 and 2008 and point out where there are differences in those two versions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Index Structures&lt;/strong&gt;&lt;br /&gt;Indexes are created on columns in tables or views. The index provides a fast way to look up data based on the values within those columns. For example, if you create an index on the primary key and then search for a row of data based on one of the primary key values, SQL Server first finds that value in the index, and then uses the index to quickly locate the entire row of data. Without the index, a table scan would have to be performed in order to locate the row, which can have a significant effect on performance.&lt;br /&gt;&lt;br /&gt;You can create indexes on most columns in a table or a view. The exceptions are primarily those columns configured with large object (LOB) data types, such as image, text, and varchar(max). You can also create indexes on XML columns, but those indexes are slightly different from the basic index and are beyond the scope of this article. Instead, I'll focus on those indexes that are implemented most commonly in a SQL Server database.&lt;br /&gt;&lt;br /&gt;An index is made up of a set of pages (index nodes) that are organized in a B-tree structure. This structure is hierarchical in nature, with the root node at the top of the hierarchy and the leaf nodes at the bottom, as shown in Figure 1.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_JHcNniNYPXo/Syrtwqpe5wI/AAAAAAAAAFc/8ZDoPg_Ja6o/s1600-h/610-image002.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416402922204227330" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/Syrtwqpe5wI/AAAAAAAAAFc/8ZDoPg_Ja6o/s400/610-image002.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Figure 1: B-tree structure of a SQL Server index&lt;br /&gt;&lt;br /&gt;When a query is issued against an indexed column, the query engine starts at the root node and navigates down through the intermediate nodes, with each layer of the intermediate level more granular than the one above. The query engine continues down through the index nodes until it reaches the leaf node. For example, if you’re searching for the value 123 in an indexed column, the query engine would first look in the root level to determine which page to reference in the top intermediate level. In this example, the first page points the values 1-100, and the second page, the values 101-200, so the query engine would go to the second page on that level. The query engine would then determine that it must go to the third page at the next intermediate level. From there, the query engine would navigate to the leaf node for value 123. The leaf node will contain either the entire row of data or a pointer to that row, depending on whether the index is clustered or nonclustered.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Clustered Indexes&lt;/strong&gt;&lt;br /&gt;A clustered index stores the actual data rows at the leaf level of the index. Returning to the example above, that would mean that the entire row of data associated with the primary key value of 123 would be stored in that leaf node. An important characteristic of the clustered index is that the indexed values are sorted in either ascending or descending order. As a result, there can be only one clustered index on a table or view. In addition, data in a table is sorted only if a clustered index has been defined on a table.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Note:&lt;/strong&gt; A table that has a clustered index is referred to as a clustered table. A table that has no clustered index is referred to as a heap.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nonclustered Indexes&lt;/strong&gt;&lt;br /&gt;Unlike a clustered indexed, the leaf nodes of a nonclustered index contain only the values from the indexed columns and row locators that point to the actual data rows, rather than contain the data rows themselves. This means that the query engine must take an additional step in order to locate the actual data.&lt;br /&gt;&lt;br /&gt;A row locator’s structure depends on whether it points to a clustered table or to a heap. If referencing a clustered table, the row locator points to the clustered index, using the value from the clustered index to navigate to the correct data row. If referencing a heap, the row locator points to the actual data row.&lt;br /&gt;&lt;br /&gt;Nonclustered indexes cannot be sorted like clustered indexes; however, you can create more than one nonclustered index per table or view. SQL Server 2005 supports up to 249 nonclustered indexes, and SQL Server 2008 support up to 999. This certainly doesn’t mean you should create that many indexes. Indexes can both help and hinder performance, as I explain later in the article.&lt;br /&gt;&lt;br /&gt;In addition to being able to create multiple nonclustered indexes on a table or view, you can also add included columns to your index. This means that you can store at the leaf level not only the values from the indexed column, but also the values from non-indexed columns. This strategy allows you to get around some of the limitations on indexes. For example, you can include non-indexed columns in order to exceed the size limit of indexed columns (900 bytes in most cases).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Index Types &lt;/strong&gt;&lt;br /&gt;In addition to an index being clustered or nonclustered, it can be configured in other ways:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Composite index: An index that contains more than one column. In both SQL Server 2005 and 2008, you can include up to 16 columns in an index, as long as the index doesn’t exceed the 900-byte limit. Both clustered and nonclustered indexes can be composite indexes.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Unique Index: An index that ensures the uniqueness of each value in the indexed column. If the index is a composite, the uniqueness is enforced across the columns as a whole, not on the individual columns. For example, if you were to create an index on the FirstName and LastName columns in a table, the names together must be unique, but the individual names can be duplicated. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p align="justify"&gt;A unique index is automatically created when you define a primary key or unique constraint:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Primary key: When you define a primary key constraint on one or more columns, SQL Server automatically creates a unique, clustered index if a clustered index does not already exist on the table or view. However, you can override the default behavior and define a unique, nonclustered index on the primary key. &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Unique: When you define a unique constraint, SQL Server automatically creates a unique, nonclustered index. You can specify that a unique clustered index be created if a clustered index does not already exist on the table. &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Covering index: A type of index that includes all the columns that are needed to process a particular query. For example, your query might retrieve the FirstName and LastName columns from a table, based on a value in the ContactID column. You can create a covering index that includes all three columns.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;strong&gt;Index Design&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A&lt;/span&gt;&lt;/strong&gt;s beneficial as indexes can be, they must be designed carefully. Because they can take up significant disk space, you don’t want to implement more indexes than necessary. In addition, indexes are automatically updated when the data rows themselves are updated, which can lead to additional overhead and can affect performance. As a result, index design should take into account a number of considerations.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;br /&gt;As mentioned above, indexes can enhance performance because they can provide a quick way for the query engine to find data. However, you must also take into account whether and how much you’re going to be inserting, updating, and deleting data. When you modify data, the indexes must also be modified to reflect the changed data, which can significantly affect performance. You should consider the following guidelines when planning your indexing strategy:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;For tables that are heavily updated, use as few columns as possible in the index, and don’t over-index the tables.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;If a table contains a lot of data but data modifications are low, use as many indexes as necessary to improve query performance. However, use indexes judiciously on small tables because the query engine might take longer to navigate the index than to perform a table scan.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;For clustered indexes, try to keep the length of the indexed columns as short as possible. Ideally, try to implement your clustered indexes on unique columns that do not permit null values. This is why the primary key is often used for the table’s clustered index, although query considerations should also be taken into account when determining which columns should participate in the clustered index.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;The uniqueness of values in a column affects index performance. In general, the more duplicate values you have in a column, the more poorly the index performs. On the other hand, the more unique each value, the better the performance. When possible, implement unique indexes.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;For composite indexes, take into consideration the order of the columns in the index definition. Columns that will be used in comparison expressions in the WHERE clause (such as WHERE FirstName = 'Charlie') should be listed first. Subsequent columns should be listed based on the uniqueness of their values, with the most unique listed first.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;You can also index computed columns if they meet certain requirements. For example, the expression used to generate the values must be deterministic (which means it always returns the same result for a specified set of inputs). For more details about indexing computed columns, see the topic “&lt;a href="http://msdn.microsoft.com/en-us/library/ms189292.aspx"&gt;Creating Indexes on Computed Columns&lt;/a&gt;” in SQL Server Books Online.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;strong&gt;Queries &lt;/strong&gt;&lt;br /&gt;Another consideration when setting up indexes is how the database will be queried. As mentioned above, you must take into account the frequency of data modifications. In addition, you should consider the following guidelines:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Try to insert or modify as many rows as possible in a single statement, rather than using multiple queries.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Create nonclustered indexes on columns used frequently in your statement’s predicates and join conditions.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Consider indexing columns used in exact-match queries.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;strong&gt;Index Basics&lt;br /&gt;&lt;/strong&gt;In this article, I’ve tried to give you a basic overview of indexing in SQL Server and provide some of the guidelines that should be considered when implementing indexes. This by no means is a complete picture of SQL Server indexing. The design and implementation of indexes are an important component of any SQL Server database design, not only in terms of what should be indexed, but where those indexes should be stored, how they should be partitioned, how data will be queried, and other important considerations. In addition, there are index types that I have not discussed, such as XML indexes as well as the filtered and spatial indexes supported in SQL Server 2008. This article, then, should be seen as a starting point, a way to familiarize yourself with the fundamental concepts of indexing. In the meantime, be sure to check out SQL Server Books Online for more information about the indexes described here as well as the other types of indexes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Author profile:&lt;/strong&gt; &lt;a href="http://www.simple-talk.com/author/robert-sheldon/"&gt;Robert Sheldon&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_JHcNniNYPXo/SyrtUw0L_eI/AAAAAAAAAFU/JMuNupO9xMM/s1600-h/120.gif"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 65px; FLOAT: left; HEIGHT: 85px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5416402442823400930" border="0" alt="" src="http://3.bp.blogspot.com/_JHcNniNYPXo/SyrtUw0L_eI/AAAAAAAAAFU/JMuNupO9xMM/s400/120.gif" /&gt;&lt;/a&gt;After being dropped 35 feet from a helicopter and spending the next year recovering, Robert Sheldon left the Colorado Rockies and emergency rescue work to pursue safer and less painful interests—thus his entry into the world of technology. He is now a technical consultant and the author of numerous books, articles, and training material related to Microsoft Windows, various relational database management systems, and business intelligence design and implementation. He has also written news stories, feature articles, restaurant reviews, legal summaries, and the novel 'Dancing the River Lightly'. You can find more information at &lt;a href="http://www.rhsheldon.com/"&gt;http://www.rhsheldon.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.simple-talk.com/author/robert-sheldon/"&gt;Search for other articles by Robert Sheldon &lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4633760247996690456?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4633760247996690456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4633760247996690456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4633760247996690456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4633760247996690456'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/12/sql-server-index-basics.html' title='SQL Server Index Basics'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JHcNniNYPXo/SyrvXXSLeTI/AAAAAAAAAFk/6fhsyqew0ms/s72-c/120.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-2277478461727582099</id><published>2009-12-01T07:51:00.002+08:00</published><updated>2009-12-01T07:56:27.928+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SilverLight'/><category scheme='http://www.blogger.com/atom/ns#' term='PDC'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Microsoft PDC 09</title><content type='html'>If like me, life got in the way of you being at the 2009 PDC and you getting your free ACER laptop/tablet, there is some hope. Microsoft have graciously, as usual, posted the videos on the PDC website for the rest of us to enjoy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://microsoftpdc.com/"&gt;http://microsoftpdc.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://microsoftpdc.com/Videos"&gt;http://microsoftpdc.com/Videos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe next year, right?&lt;br /&gt;:(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-2277478461727582099?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/2277478461727582099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=2277478461727582099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2277478461727582099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2277478461727582099'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/12/microsoft-pdc-09.html' title='Microsoft PDC 09'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-3382589726825797293</id><published>2009-11-26T11:27:00.013+08:00</published><updated>2009-11-26T11:53:04.029+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Using the using statement with WCF proxy.</title><content type='html'>There are many post on the net telling you not to use the using statement with WCF proxies. Now while the intent is good, I feel that is a good code practice to use the using statement where appropriate to automatically dispose of your objects.&lt;br /&gt;&lt;br /&gt;This is obviously a controversial statement as using the using statement with a WCF proxy can throw unwanted error(s) when trying to call the close method on a service that is in a faulted state.&lt;br /&gt;&lt;br /&gt;I have reasently been privileged enough to go on a WCF Workshop presented by Mahesh Krishnan from Readify, where he showed me the right way to do this.&lt;br /&gt;&lt;br /&gt;When the using statement is exited, it calls the dispose method on the proxy class. So it is simple. Overload the Dispose method, checking the state of the service. If faulted then call the abort method, if not call close. Simple and elegant.&lt;br /&gt;&lt;br /&gt;For those of you who have generated proxy classes, remember that the generated proxy class is a partial class... So you can create another partial class with the same name and do your overload there.&lt;br /&gt;&lt;br /&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;&lt;br /&gt;try&lt;br /&gt;{       &lt;br /&gt;  if(this.State == CommunicationState.Faulted)&lt;br /&gt;  {&lt;br /&gt;    this.Abort();&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;    this.Close();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;catch (Exception)&lt;br /&gt;{&lt;br /&gt;  this.Abort();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Never compromise on code quality!&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-3382589726825797293?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/3382589726825797293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=3382589726825797293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/3382589726825797293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/3382589726825797293'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/11/using-using-statement-with-wcf-proxy.html' title='Using the using statement with WCF proxy.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4539975188249977628</id><published>2009-06-30T10:05:00.010+08:00</published><updated>2009-06-30T11:45:22.068+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Event Extensions: Methods for firing events and managing event listeners</title><content type='html'>In most modern C# applications, generous usage of events have become the norm. Gone are the days where we were afraid to use them because of the "black magic" code that they seemed to execute.&lt;p&gt;Today, perhaps the opposite is true, and they are used too lightly, with disregard for the memory leeches they are (those small, black  slimly kind that you're never aware of what damage they're doing until it's too late).&lt;/p&gt;&lt;p&gt;Here's some code to make usage of the leeches a little easier :).&lt;/p&gt;&lt;p&gt;The typical firing of an event from C# code looks something like this:&lt;/p&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;if (MyEvent1 != null)&lt;br /&gt;{&lt;br /&gt; MyEvent1(this, EventArgs.Empty);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are 2 essential problems with this code:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;It's too many lines of code for something so mundane. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;What happens if there are more than 1 listeners listening to the event, and one of them throws an exception? Normal .NET behaviour dictates that the other listeners never get to hear about the event, but what if it's important that all listeners know about the event before application execution is halted?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Solution to problem #1: wrap the logic in an extension method&lt;/p&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;MyEvent1.Raise(this, EventArgs.Empty);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;there - isn't that better? Here's sample of the implementation:&lt;/p&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;public static void Raise(this EventHandler handler, object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt; if (handler != null)&lt;br /&gt; {&lt;br /&gt;   handler(sender, e);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Solution to problem #2: expand on the extension method (now that all the logic is conveniently in one place)&lt;/p&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;MyEvent1.Raise(this, EventArgs.Empty, true);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;...where the boolean parameter tells the extension method to make sure that all the event listeners get to hear about the event before throwing an exception. The exception that is then thrown, is an EventListenerException, which is just basically a wrapper for all exceptions that occurred on the event listener's event handling code.&lt;br /&gt;&lt;br /&gt;sample implementation: (called from the event extension method)&lt;/p&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;private static void ManageEventListeners(IEnumerable&lt;delegate&gt; delegates, object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;EventListenerException eventListenerException = null;&lt;br /&gt;foreach (Delegate listner in delegates)&lt;br /&gt;{&lt;br /&gt;//the listner could throw an unhandled exception in the handler method&lt;br /&gt;//make sure that the other listners still handle event if this is the case&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt; listner.DynamicInvoke(new[] {sender, e});&lt;br /&gt;}&lt;br /&gt;catch (TargetInvocationException ex)&lt;br /&gt;{&lt;br /&gt; //add a new event listner&lt;br /&gt; EventListener eventListener = new EventListener&lt;br /&gt;                                   {&lt;br /&gt;                                     Listener = listner,&lt;br /&gt;                                     ListenerException = ex.InnerException&lt;br /&gt;                                   };&lt;br /&gt;&lt;br /&gt; //NOTE: The exception which occurs is "TargetInvokationException", but the&lt;br /&gt; //actual exception which occurs in the listner is contained in the innerException&lt;br /&gt;&lt;br /&gt; //add listner to eventListnerException&lt;br /&gt; if (eventListenerException == null)&lt;br /&gt; {&lt;br /&gt;   eventListenerException = new EventListenerException();&lt;br /&gt; }&lt;br /&gt; eventListenerException.EventListenerCol.Add(eventListener);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//if an exception was thrown by one of the listner's event handlers&lt;br /&gt;if (eventListenerException != null)&lt;br /&gt;{&lt;br /&gt; throw eventListenerException;&lt;br /&gt; //then re-throw the exception that thrown in the handler&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/delegate&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here's some sample code with unit tests included in case you need to play with the code (NUnit 2.4.7 &amp;amp; VS 2008)&lt;/p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-5fadc16984914668.skydrive.live.com/embedrowdetail.aspx/BlogCode/EventExtensions.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;PS: It's Silverlight compatible (of course :) )&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="  color: rgb(102, 102, 102); line-height: 16px; font-family:Verdana, Arial, sans-serif;font-size:11px;"&gt;Original post by: JAX&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4539975188249977628?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4539975188249977628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4539975188249977628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4539975188249977628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4539975188249977628'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/06/event-extensions-methods-for-firing.html' title='Event Extensions: Methods for firing events and managing event listeners'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-7144919596027650070</id><published>2009-06-18T15:04:00.004+08:00</published><updated>2009-06-18T15:12:09.217+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>TFS Baseless Merges</title><content type='html'>The branch command creates a relationship between two folders which you can leverage to perform merges of code between the branches. The relationship is bi-directional so code can be merged both ways but Team Foundation Server currently doesn’t facilitate merging between child branches. To begin to understand baseless merges, let’s consider the following structure:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_JHcNniNYPXo/SjnnVvpEEQI/AAAAAAAAAFE/Y2pZGZUeQvQ/s400/BaselessMerges.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;In the scenario above, we have well-defined code promotion path between:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$/MyProduct/MAIN &lt;=&gt; $/MyProduct/PRODUCTION/Release1.0&lt;br /&gt;$/MyProduct/MAIN &lt;=&gt; $/MyProduct/PRODUCTION/Release2.0&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;These code promotion paths exist because both Release1.0 and Release2.0 under production are children of MAIN. Unfortunately, there is no direct relationship between the child branches - Release1.0 and Release2.0, which makes it difficult for us to merge, for example, a hotfix from Release1.0 into Release2.0 without having to traverse through $/MyProduct/MAIN.&lt;br /&gt;&lt;br /&gt;If we followed the merge path established by the branch command, a fix from Release1.0 will need to be merged in the following sequence for it to be available in the Release2.0 branch:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$/MyProduct/PRODUCTION/Release1.0 =&gt; $/MyProduct/MAIN =&gt; $/MyProduct/PRODUCTION/Release2.0&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In some cases it may not be feasible to traverse through MAIN because MAIN could potentially have moved far ahead of the source code versions in both Release1.0 and Release2.0, and it would take a significant amount of work to merge, build, and test the hotfix in MAIN. Here is where &lt;b&gt;baseless merges&lt;/b&gt; become necessary. The following diagram explores the existing relationship and baseless merges.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_JHcNniNYPXo/Sjnno9KpbpI/AAAAAAAAAFM/0-BuuC7XHDY/s400/BaselessMerges2.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;MSDN defines a baseless merge as “a merge (performed) without a basis version.” That is, it allows the user to merge files and folders that do not have a branch/merge relationship. After a baseless merge, a merge relationship exists and future merges do not have to be baseless.&lt;br /&gt;&lt;br /&gt;While baseless merges are a powerful feature that Team Foundation Server provides (only via the command line; see: &lt;a href="http://msdn.microsoft.com/en-us/library/bb668976.aspx"&gt;How To: Perform a Baseless Merge in Visual Studio Team  Foundation Server&lt;/a&gt;)  we recommend that you use this feature &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;sparingly and only under very exceptional circumstances&lt;/span&gt;&lt;/b&gt;. In most cases, a well-defined code promotion model should provide you with a good way to merge changes without have to resort to baseless merges.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 11px; color: rgb(102, 102, 102); line-height: 16px; "&gt;Original post by: grahamba&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-7144919596027650070?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/7144919596027650070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=7144919596027650070' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7144919596027650070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7144919596027650070'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/06/tfs-baseless-merges.html' title='TFS Baseless Merges'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JHcNniNYPXo/SjnnVvpEEQI/AAAAAAAAAFE/Y2pZGZUeQvQ/s72-c/BaselessMerges.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-5213570157473371731</id><published>2009-06-10T13:45:00.004+08:00</published><updated>2009-06-10T13:54:35.798+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Disabling the back button on the browser.</title><content type='html'>Now this sounds like a trivial exercise right? When I tried to search for this, I found hundreds of answers to this question and none of them worked. Then finally I stumbled on to this gem, I thought I’d share it with you.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class="javascript:nogutter" name="code"&gt;&lt;br /&gt;function noBack(){window.history.forward();setTimeout(”noBack()”, 500);}&lt;br /&gt;noBack();&lt;br /&gt;window.onload=noBack;&lt;br /&gt;window.onpageshow=function(evt){if(evt.persisted)noBack()}&lt;br /&gt;window.onunload=function(){void(0)}&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/4773008052255971421-5213570157473371731?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/5213570157473371731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=5213570157473371731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5213570157473371731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5213570157473371731'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/06/disabling-back-button-on-browser.html' title='Disabling the back button on the browser.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-7991096032348765768</id><published>2009-03-26T08:07:00.003+09:00</published><updated>2009-03-26T08:28:33.475+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SilverLight'/><title type='text'>Silverlight 3</title><content type='html'>Some links to and about the new Silverlight 3 (BETA) release.&lt;br /&gt;&lt;p&gt;Everything you need to get started&lt;/p&gt;&lt;p&gt;&lt;a href="http://silverlight.net/getstarted/silverlight3/default.aspx"&gt;http://silverlight.net/getstarted/silverlight3/default.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Silverlight Toolkit&lt;/p&gt;&lt;p&gt;&lt;a href="http://silverlight.codeplex.com/"&gt;http://silverlight.codeplex.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Building Silverlight 2 and Silverlight 3 Beta applications on the same machine&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jeff.wilcox.name/2009/03/sxs-sl2-sl3-building/"&gt;http://www.jeff.wilcox.name/2009/03/sxs-sl2-sl3-building/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Silverlight 3 Release Date (RTW) Surprise&lt;/p&gt;&lt;p&gt;&lt;a href="http://silverlighthack.com/post/2009/03/22/Silverlight-3-Release-Date.aspx"&gt;http://silverlighthack.com/post/2009/03/22/Silverlight-3-Release-Date.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Getting Started with Virtual Earth Silverlight Map Control SDK CTP&lt;/p&gt;&lt;p&gt;&lt;a href="http://pietschsoft.com/post/2009/03/Getting-Started-Virtual-Earth-Silverlight-Map-Control-SDK-CTP.aspx"&gt;http://pietschsoft.com/post/2009/03/Getting-Started-Virtual-Earth-Silverlight-Map-Control-SDK-CTP.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hight-Speed RIA Development with the Microsoft Silverlight Toolkit&lt;/p&gt;&lt;p&gt;&lt;a href="http://videos.visitmix.com/MIX09/T15F"&gt;http://videos.visitmix.com/MIX09/T15F&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Sample LOB Silverlight application&lt;/p&gt;&lt;p&gt;&lt;a href="http://labs.cas.de/silverlight/CASPIASL/"&gt;http://labs.cas.de/silverlight/CASPIASL/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-7991096032348765768?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/7991096032348765768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=7991096032348765768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7991096032348765768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7991096032348765768'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/03/silverlight-3.html' title='Silverlight 3'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-2070916870364221309</id><published>2009-02-17T10:14:00.001+09:00</published><updated>2009-02-17T10:16:31.314+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='SilverLight'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><title type='text'>The ViewModel Pattern. (WPF &amp; Silverlight)</title><content type='html'>A great article on the Model-View-ViewModel pattern by David Hill.&lt;br /&gt;&lt;a href="http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx"&gt;http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-2070916870364221309?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/2070916870364221309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=2070916870364221309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2070916870364221309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2070916870364221309'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/viewmodel-pattern-wpf-silverlight.html' title='The ViewModel Pattern. (WPF &amp; Silverlight)'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-9051583094180913287</id><published>2009-02-12T09:17:00.003+09:00</published><updated>2009-02-12T09:21:49.262+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>TFS Offline Solution</title><content type='html'>&lt;strong&gt;&lt;u&gt;When and how does my solution go "offline"?&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;TFS 2008 adds improved support for "offline" scenarios.  This blog post identifies the scenarios under which a solution will be placed in "offline" mode.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If the Visual Studio IDE is unable to connect to the TFS server when it is opening the solution, then it will mark the solution as being offline.  It will also mark the TFS server as being offline. A messagebox will be displayed indicating the solution was taken offline and a message to the same effect will appear in the Output window.&lt;/li&gt;&lt;li&gt;If the Visual Studio IDE is opening a solution and finds the TFS server to which the solution is bound is marked as offline, then VS will mark the solution as being offline&lt;br /&gt;In this scenario, a message about the solution being opened offline will appear in the Output window, but no messagebox will appear.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Notes&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Offline detection is done ONLY during solution open.  Failures to connect to the server during other version control operations within VS do not affect the offline state of the solution or server.&lt;/li&gt;&lt;li&gt;The offline state for the solution is stored in the solution's local .suo file.&lt;/li&gt;&lt;li&gt;When the server is marked offline, we also turn off the server's "AutoReconnect" setting.&lt;/li&gt;&lt;li&gt;The server's offline state is stored in a registry value named Offline, and the AutoReconnect state is stored in in a value named AutoReconnect.  Both of these live under the key: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\TeamFoundation\Servers\&lt;tfs&gt;&lt;/li&gt;&lt;li&gt;A solution remains offline until it is explicitly taken online.&lt;/li&gt;&lt;li&gt;A TFS server remains marked offline until an offline solution bound to that server is taken online.&lt;/li&gt;&lt;li&gt;Opening a solution that was previously marked offline while its server is still marked offline opens the solution without any messageboxes appearing.  We will present a message in the Output window indicating the solution is still offline.&lt;/li&gt;&lt;li&gt;Opening a solution that was previously marked offline when its server is marked online presents the user with a messagebox.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:85%;color:#666666;"&gt;Original post by: Benryan&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-9051583094180913287?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/9051583094180913287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=9051583094180913287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/9051583094180913287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/9051583094180913287'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/tfs-offline-solution.html' title='TFS Offline Solution'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-540449402043038266</id><published>2009-02-12T09:10:00.002+09:00</published><updated>2009-02-12T09:16:09.718+09:00</updated><title type='text'>VS2008 fails to uninstall.</title><content type='html'>A couple of days ago I needed to add C++ to my VS2008 install. When I tried to open the setup from add remove programs it just failed. After a couple of hours of struggling I came to the conclusion that my only option was to uninstall and the reinstall.&lt;br /&gt;&lt;br /&gt;To my surprise I was unable to uninstall Visual Studio. After searching the web for a while I found the solution to uninstalling Visual Studio 2008. I thought I'd share this with everybody as I doubt that I'm the only one having this problem.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/bb968856.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/bb968856.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-540449402043038266?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/540449402043038266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=540449402043038266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/540449402043038266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/540449402043038266'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/vs2008-fails-to-uninstall.html' title='VS2008 fails to uninstall.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-2857756600747748821</id><published>2009-02-11T12:12:00.002+09:00</published><updated>2009-02-11T12:17:30.386+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>C# 4.0 - New Features</title><content type='html'>This article summarizes the changes that are going to be present in C# 4.0. C# 4.0 is scheduled to be released sometime during 2010 along with the new version of Visual Studio which has been "Rosario". In the meantime, if you are an early adopter, CTPs will be made publicly available as a Virtual PC image.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Dynamic Look up &lt;/strong&gt;- This feature will give you the ability to resolve names during run time instead of at compile time. In Visual Basic .NET this is referred to as "late binding" and has been available for quite some time now. Dynamic look up will be very useful for solutions which involve any kind of COM Interop. COM Interop allows .NET code to call COM components and COM code to call .NET components. An example of this would be Office automation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Named and optional parameters&lt;/strong&gt; - Finally we have the ability to specify default values for parameters. In additional optional arguments can be added to the method signature. These changes should reduce the need for method overloading and increase the compatibility between C# and Visual Basic.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Covariance and Contravariance &lt;/strong&gt;- These topics can be a little bit hard to wrap your head around. Therefore lets starts with some definitions. An operator between types is said to be covariant if it orders these types from more specific to more general ones. Similarly an operator between types is said to be contravariant if it orders them in the reversed order. Whenever neither of these conditions is met, an operator is said to be invariant.&lt;br /&gt;&lt;br /&gt;In any case covariance, contravariance and invariance already exist in the C# language. The changes made in 4.0 will just make these features a little easier to utilize. For a good overview of the topic read &lt;a href="http://blogs.msdn.com/charlie/archive/2008/10/28/linq-farm-covariance-and-contravariance-in-visual-studio-2010.aspx"&gt;Charlie Calvert's&lt;/a&gt; post. If you still want more information then visit &lt;a href="http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx"&gt;Eric Lippert's blog&lt;/a&gt;. He has a series of posts on the topic.&lt;br /&gt;&lt;br /&gt;In conclusion, C# 4.0 will continue to evolve based on the trend of dynamic programming. This is primarily due to a ripple effect created by languages like IronRuby, IronPython and Visual Basic. On the flip side, VB will also get some language enhancements in order to keep it on even keel with C#. Perhaps someday the classic debate between C# and VB.NET developers about which language is better may start to fade away. This will be primarily due to the standardization of features across languages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#666666;"&gt;Original post by: Michael Ceranski&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-2857756600747748821?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/2857756600747748821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=2857756600747748821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2857756600747748821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2857756600747748821'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/c-40-new-features.html' title='C# 4.0 - New Features'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4821179141023276499</id><published>2009-02-11T12:08:00.001+09:00</published><updated>2009-02-18T08:45:51.182+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SilverLight'/><title type='text'>Why Silverlight is the future</title><content type='html'>I think Silverlight represents the likely future of computing for most of us. And by “us”, I mean both Windows and web developers on the Microsoft platform (and maybe beyond).&lt;br /&gt;&lt;br /&gt;I think we’re at a point of convergence, where two industry trends are coming together in a way that makes Silverlight the most compelling answer for a lot of development scenarios. These trends are the continued abstraction away from the hardware, and now the operating system; and the likelihood that the web as we know it is nearing the end of its life, so we’re looking for the next big thing in that space.&lt;br /&gt;&lt;br /&gt;Arguably, Silverlight’s primary competitor is WPF. But I don’t think WPF is the long-term winner. Another obvious competitor is Flash/Flex/Air, and that could be serious except for the fact that Silverlight lets existing .NET developers (and there are a lot of us) leverage our existing skills, while Adobe means starting over. And another competitor is Gears, which may be valid, time will tell (as long as I don’t have to do Javascript), but also means starting over and discarding all the .NET skills we’ve accumulated. And Gears, to me, represents the last gasping attempt to salvage the web as we know it – and I suspect that’s a lost cause.&lt;br /&gt;&lt;br /&gt;Part of the appeal of Silverlight, and the reason it almost instantly gains traction in any conversation with my clients, is that it is independent of Windows. They like the idea that it works across Windows versions without worrying that Microsoft will fix some Windows thing and break their app.&lt;br /&gt;&lt;br /&gt;Some of them, especially those that deal with the government, really like that it works on the Mac as well as Windows. They have cross-platform requirements mandated by either the market or by law, and Silverlight gives them the option of using .NET (which they love) to run apps on the Mac.&lt;br /&gt;&lt;br /&gt;Another part of the appeal of Silverlight, across the board from what I can see, is that people don't trust ClickOnce. But they do trust the browser as a deployment vehicle. I suspect this goes back, somewhat, to Silverlight being independent of Windows, while ClickOnce is more vulnerable to the OS itself. Our overall experience with ClickOnce is that it works great 99% of the time. And then 1% of the time it fails for no reason anyone can figure out. Same target machines, same configuration, but it just doesn't quite work. Maybe, over time, we'll find out Silverlight is also unreliable in this manner - but early indications are that this is not the case.&lt;br /&gt;If you look at the theme here, it is about escaping the OS and all its complexity. And that's not entirely surprising.&lt;br /&gt;&lt;br /&gt;We build the first OSes to abstract the hardware. And they evolved over decades until they were terribly complex, and somewhat intertwined with the hardware (driver issues are the major failure point for Windows).&lt;br /&gt;&lt;br /&gt;So we built runtimes to abstract the OS (starting perhaps with Smalltalk, then VB, the JDK and now .NET). And they evolved over the past couple decades until they are becoming terribly complex, and somewhat intertwined with the OS (installing/upgrading .NET usually requires a reboot of Windows).&lt;br /&gt;&lt;br /&gt;It appears to me that we're now building smaller, decoupled runtimes that are a bit less complex, and that are intentionally decoupled from the OS, and are largely self-contained. It is just the next step in the evolution - though I suspect it does mean Windows (or any other OS) becomes substantially less relevant to most people.&lt;br /&gt;&lt;br /&gt;By itself, I'm not sure that a runtime that is less coupled to the OS would be enough to drive Silverlight’s future. But there's another dynamic here too: the aging of the web, and the search for "what's next".&lt;br /&gt;&lt;br /&gt;I was subscribed to the Usenet newsgroups in the early 90's, when they were discussing the future of the global network. When WAIS, Gopher and HTTP were competing (Gopher came from Minnesota after all : ) ). And HTTP/HTML won, because they really were the superior document viewing technology. A global version of lex; something that should have filled the role of PDF.&lt;br /&gt;&lt;br /&gt;But as we got into the mid-90's, people started bastardizing and hacking this technology. Warping it into something far different from its original intent. And that's OK - but it is important to realize this was done ad-hoc, with little or no pre-planning or thought of proper architecture.&lt;br /&gt;&lt;br /&gt;I know, I sound like a CS purist, but really the web, as we know it, is a stack of horrible hacks, all leaned up against each other like the world's biggest and most expensive house of cards. In short, the technology of the web is a mess. Just witness the insanity around browser versions, the standards compliance farce, and the ridiculously inefficient ways we waste time/money building a web app that runs on more than one version of even one browser.&lt;br /&gt;&lt;br /&gt;Yes, the web has transformed the world. And it revealed some very good patterns for software and usability. But it became mainstream over 10 years ago, and most technologies fade gracefully away at the 10 year mark. So it is time for the web (as we know it) to die.&lt;br /&gt;The question then, is what comes next? Do browsers become the new standards-based OS? Or do we extend the runtime concept into the web, as a long-term replacement.&lt;br /&gt;&lt;br /&gt;Google is betting on the former, with Gears and Chrome. They clearly hope/expect that the browser itself will be the next OS - the thing that makes Windows and Mac OSes irrelevant. Adobe is betting on the latter. They clearly hope Flash/Flex/Air will be the runtime that makes both the browser and the OS irrelevant.&lt;br /&gt;&lt;br /&gt;Microsoft is playing a smart game, imo. Silverlight (with Mesh and Azure) represents a strategy very similar to Adobe's (but bigger), where a runtime may well make the browser and the Windows/Mac/Linux desktop irrelevant. At the same time, they've got WPF as a fall-back in case the core OS does remain important to the average consumer.&lt;br /&gt;&lt;br /&gt;So I think these two dynamics - the desire by our customers to escape the shackles of the OS (not just Windows - the OS in general), coupled with the fact that the industry is looking for the next step in the evolution of the web itself - work together to make this the perfect time for Silverlight to be the hot technology.&lt;br /&gt;&lt;br /&gt;And I do think this works against WPF, because it neither helps us escape the OS, nor does it represent the future of the web. And it works against Adobe, because their vision isn’t big enough, nor their established developer base large enough. And against Google, because they are still trying to shape the stack of hacks that is the browser into something reliable, and I suspect that’s simply unrealistic.&lt;br /&gt;&lt;br /&gt;In short, I think Silverlight offers the power needed for smart client business apps, with the best deployment and navigation characteristics of the web. Sure, it needs to continue to grow and evolve (the search issue needs addressing for example), but I really think Silverlight represents the future of development for most of us.&lt;br /&gt;&lt;br /&gt;Microsoft Silverlight. &lt;a href="http://silverlight.net/"&gt;http://silverlight.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#666666;"&gt;Original post by: Rockford Lhotka&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4821179141023276499?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4821179141023276499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4821179141023276499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4821179141023276499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4821179141023276499'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/why-silverlight-is-future.html' title='Why Silverlight is the future'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-7108778010478366185</id><published>2009-02-11T09:34:00.003+09:00</published><updated>2009-02-11T09:52:06.206+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Enabling WCF tracing and using it.</title><content type='html'>&lt;strong&gt;&lt;u&gt;How to enable WCF tracing:&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open the Visual Studio Command Prompt.&lt;/li&gt;&lt;li&gt;Run svcconfigeditor.exe&lt;/li&gt;&lt;li&gt;Go File/Open and browse to the web.config file of your WCF service.&lt;/li&gt;&lt;li&gt;In the "Configuration" section click on "Diagnostics".&lt;/li&gt;&lt;li&gt;In the "Diagnostics" section click on "Enable Tracing".&lt;/li&gt;&lt;li&gt;Now click on the link next to "Trace Level:" and select the level of tracing. &lt;em&gt;&lt;span style="font-size:85%;color:#000000;"&gt;(I like verbose)&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;File/Save&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_JHcNniNYPXo/SZIfuDVqA9I/AAAAAAAAAE0/7fMLoosF1lw/s1600-h/Tracing1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301334587399078866" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 272px" alt="" src="http://3.bp.blogspot.com/_JHcNniNYPXo/SZIfuDVqA9I/AAAAAAAAAE0/7fMLoosF1lw/s400/Tracing1.JPG" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Viewing your tracefile&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open the Visual Studio Command Prompt.&lt;/li&gt;&lt;li&gt;Run svctraceviewer.exe&lt;/li&gt;&lt;li&gt;File/Open and find your *.svclog file. &lt;em&gt;&lt;span style="font-size:85%;"&gt;(Usually in the same location as your "web.config" file)&lt;/span&gt;&lt;/em&gt;&lt;a href="http://3.bp.blogspot.com/_JHcNniNYPXo/SZIgqs9Ez6I/AAAAAAAAAE8/EyNMOI2DAFQ/s1600-h/Tracing2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301335629362417570" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 294px" alt="" src="http://3.bp.blogspot.com/_JHcNniNYPXo/SZIgqs9Ez6I/AAAAAAAAAE8/EyNMOI2DAFQ/s400/Tracing2.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Happy tracing!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-7108778010478366185?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/7108778010478366185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=7108778010478366185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7108778010478366185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7108778010478366185'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/enabling-wcf-tracing-and-using-it.html' title='Enabling WCF tracing and using it.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JHcNniNYPXo/SZIfuDVqA9I/AAAAAAAAAE0/7fMLoosF1lw/s72-c/Tracing1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-5917246617119468429</id><published>2009-02-11T08:54:00.004+09:00</published><updated>2009-02-11T08:58:30.287+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Passing Large and Complex objects in WCF</title><content type='html'>Generally WCF has no restrictions on the maximum size of the message that can be passed across the wire. Technically speaking, the maximum size of a message that can be passed and processed in a typical WCF communication is about 9,223,372,036,854,775,807 bytes (which is about 8.5 billion GB!). That is, only if you explicity allow the WCF service and client to receive messages of such sizes. However, there are certain caveats to keep in mind.&lt;br /&gt;&lt;br /&gt;For most part, it is possible to set maxReceivedMessageSize attribute to a large value (the defualt being 64KB) to get it going. If a plain large object (say of size 22 MB) is serialized while sending across the wire, it would work just as well as it may not have objects nested within one another. But in cases where there are too many nested objects, with many nested Lists containing a large number of items (say 10,000) embedded, then the number of objects going across the wire crosses the default limit of 65,536.&lt;br /&gt;&lt;br /&gt;This restriction is placed to prevent Denial of Service attacks. But by configuring dataContractSerializer you can pass such complex objects of large sizes. This attibute is not available through the bindings, but actually as an extension of the service and endpoint behavior. The value needs to be set in both the client and the server.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Client&lt;/strong&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;        &lt;endpointbehaviors&gt;&lt;br /&gt;          &lt;behavior name="ClientBehavior"&gt;&lt;br /&gt;            &lt;datacontractserializer maxitemsinobjectgraph="10000000"&gt;&lt;br /&gt;          &lt;/behavior&gt;&lt;br /&gt;        &lt;/endpointbehaviors&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;      &lt;servicebehaviors&gt;&lt;br /&gt;        &lt;behavior name="HostBehavior"&gt;&lt;br /&gt;          &lt;datacontractserializer maxitemsinobjectgraph="10000000"&gt;&lt;br /&gt;        &lt;/behavior&gt;&lt;br /&gt;      &lt;servicebehaviors&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Once this behavior is set, the WCF service and client can send and receive not only large objects, but also highly complex ones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;color:#666666;"&gt;Original post by: Kishore Gopalan&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-5917246617119468429?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/5917246617119468429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=5917246617119468429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5917246617119468429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5917246617119468429'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/passing-large-and-complex-objects-in.html' title='Passing Large and Complex objects in WCF'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-5307623181797019629</id><published>2009-02-10T08:52:00.006+09:00</published><updated>2009-02-10T09:14:39.029+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>The remote server returned an error: (400) Bad Request. (WCF)</title><content type='html'>If you want to send parameters across WCF larger than a few bytes,you'll need to increase some tags in your web.config.&lt;br /&gt;&lt;br /&gt;WEB.CONFIG&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;services&gt;&lt;br /&gt;&lt;service name="DocCube.BusinessLogic.DocumentManager" behaviorconfiguration="HttpGetBehavior"&gt;&lt;br /&gt;&lt;endpoint binding="wsHttpBinding" bindingconfiguration="wsHttp" address="" contract="DocCube.Interfaces.IDocumentManager"&gt;&lt;br /&gt;&lt;/service&gt;&lt;br /&gt;&lt;/services&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NOTE: the "bindingConfiguration" was added manually, as was the binding declaration below;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;bindings&gt;&lt;br /&gt;&lt;wshttpbinding&gt;&lt;br /&gt;&lt;binding name="wsHttp" maxreceivedmessagesize="50000000" messageencoding="Mtom" maxbufferpoolsize="50000000"&gt;&lt;br /&gt;&lt;readerquotas maxdepth="500000000" maxarraylength="500000000" maxbytesperread="500000000" maxnametablecharcount="500000000" maxstringcontentlength="500000000"&gt;&lt;br /&gt;&lt;security mode="None"&gt;&lt;br /&gt;&lt;/binding&gt;&lt;br /&gt;&lt;/wshttpbinding&gt;&lt;br /&gt;&lt;/bindings&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now delete the app.config from client and refresh your services references.&lt;br /&gt;&lt;br /&gt;Don't forget to delete identity tag either to avoid those pesky undecipherable exceptions.&lt;br /&gt;&lt;br /&gt;Original Post by: Herman Schoenfeld&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-5307623181797019629?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/5307623181797019629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=5307623181797019629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5307623181797019629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/5307623181797019629'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/02/remote-server-returned-error-400-bad.html' title='The remote server returned an error: (400) Bad Request. (WCF)'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-6999299811044605673</id><published>2009-01-20T10:11:00.000+09:00</published><updated>2009-01-20T10:12:36.585+09:00</updated><title type='text'>OO Design Principels</title><content type='html'>Great summary of principles to understand in order to design / write great OO code&lt;br /&gt;&lt;a href="http://www.noctovis.net/blog/index.php/2009/01/15/design-principles/"&gt;http://www.noctovis.net/blog/index.php/2009/01/15/design-principles/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-6999299811044605673?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/6999299811044605673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=6999299811044605673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/6999299811044605673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/6999299811044605673'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/01/oo-design-principels.html' title='OO Design Principels'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-1479072600526786006</id><published>2009-01-09T10:52:00.007+09:00</published><updated>2009-01-20T09:54:04.617+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>To GUID or not to GUID</title><content type='html'>This week I have been having some interesting discussions with some of my colleagues on whether we should be changing our SQL database from identifier (int) primary key columns to GUID/UNIQUEIDENTIFIER primary key columns. The discussion is a bit mute, because we need our distributed winforms application to synchronise up to a central database. BUT... Some very interesting points where raised that I'd like to share.&lt;br /&gt;&lt;br /&gt;Please before I get crucified here, SQL is not my strongest technical skill.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#666666;"&gt;"GUIDs are nice for their uniqueness but are quite nasty on SQL DBs as primary keys because they consume 4 times the space of an identity column (so your DB's operating memory footprint goes up) and fragment to hell because they are generated in a random fashion making the index slow to update. ... I wouldn't be inclined to go this route if we're talking thousands of users and hundreds of thousands of rows of data." &lt;em&gt;DBA&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now when people make statements like this the hair on the back of my neck immediately stand up. He seems to be aware of the problems but did not even bother to fully understand it before preaching it as fact.&lt;br /&gt;&lt;br /&gt;So... I had a quick chat with my friend google and found this article:&lt;br /&gt;&lt;h1 align="left"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Working with GUIDs in SQL Server&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family:Arial;font-size:85%;color:#000099;"&gt;by Zach Nichter&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;&lt;p&gt;&lt;b&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;font-size:100%;color:#000099;"&gt;Using GUIDs - Inserts&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Currently we are designing a database schema. When I heard they were using GUID's (Global Unique Identifier) as PK's (primary keys) my jaw about dropped. Turns out the reasoning behind the use of the keys was completely legitimate and actually is the reason GUID's were implemented by MS in the first place. They needed a key that would be unique across databases and database servers. The GUID certainly fulfills this need but it comes a cost. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;The GUID is a wide column (16 bytes to be specific) and contains a unique combination of 33 hex value characters. This column, because it is the primary key, is going to be stored in, of course, the clustered index (unless specified to be a non- clustered index), and will be the page pointer for each leaf page in a non-clustered index. Also, if a GUID is used instead of an integer identity column then the bits need to be matched up for each row, which is relatively fast. If a high volume of inserts are done on these tables then GUID's being large will contribute to page splits, as will the fact that the NEWID() function generates a random GUID value, which could place the new record on any of the data pages for this table and could cause performance problems. Another reason is that typically primary keys are searched most frequently and trying to recall a GUID from memory to type into a query is not probable.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;If you needed a key that would be unique across all servers I would recommend a composite key as the PK instead of the GUID. Use a single integer identity column to uniquely identify the rows and another column to identify the server, placing a default server id value and placing a check constraint on the server id column to validate that the value is only what you would expect for it to be for that server. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;I have mocked a test to validate my theory on inserts only (results below), I'll get to the selects a little later.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 1 - Completed in 79 seconds on test machine&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Created table with the following syntax.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-: EN-USfont-family:'Times New Roman';font-size:10;color:#000099;"   &gt;create table test1&lt;br /&gt;(tid uniqueidentifier default newid() not null,&lt;br /&gt;col1 char(1) not null&lt;br /&gt;primary key (tid)) on [primary]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;I used the following script to insert into the table.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="631005818-13012006"&gt;&lt;span style="font-family:Arial;"&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;"&gt;&lt;span style="color:#000099;"&gt;declare @d1datetime, @d2 datetime, @i int, @j int&lt;br /&gt;select @d1=getdate(), @i=1, @j=100000&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;"&gt;&lt;span style="color:#000099;"&gt;while @i &amp;lt;= @j&lt;br /&gt;begin&lt;br /&gt;insert test1 (col1)&lt;br /&gt;values ('a')&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;"&gt;&lt;span style="color:#000099;"&gt;set @i= @i + 1&lt;br /&gt;end&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color:#000099;"&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-: EN-USfont-family:'Times New Roman';font-size:10;"  &gt;select @d2=getdate()&lt;br /&gt;select datediff(s,@d1,@d2)&lt;/span&gt; &lt;/span&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color:#000099;"&gt;Test 2 - Completed in 33 seconds on test machine&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Created the second test table with the following syntax.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;color:#000099;"&gt;create table test2&lt;br /&gt;(tid int identity(1,1) not null,&lt;br /&gt;sid int default 2 not null&lt;br /&gt;check (sid=2),&lt;br /&gt;col1 char(1) not null&lt;br /&gt;primary key (tid,sid)) on [primary]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;I used the following script to insert into the test2 table.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;declare @d1 datetime, @d2 datetime, @i int, @j int&lt;br /&gt;select @d1=getdate(), @i=1, @j=100000&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;while @i &amp;lt;= @j&lt;br /&gt;begin&lt;br /&gt;insert test2 (col1)&lt;br /&gt;values ('a')&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;set @i = @i + 1&lt;br /&gt;end&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;select @d2=getdate()&lt;br /&gt;select datediff(s,@d1,@d2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test 3 - Completed in 33 seconds on test machine&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Created the second test table with the following syntax.&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;create table test3&lt;/span&gt;&lt;/p&gt;&lt;p style="TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;(tid uniqueidentifier default CONVERT(UNIQUEIDENTIFIER, CONVERT(BINARY(10), NEWID()) + CONVERT(BINARY(6), GETDATE())) not null,&lt;/span&gt;&lt;/p&gt;&lt;p style="TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;col1 char(1) not null&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;color:#000099;"&gt;primary key (tid)) on [primary]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;I used the following script to insert into the test2 table.&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;declare @d1 datetime, @d2 datetime&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;select @d1 = getdate()&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;declare @i int, @j int&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;select @i = 1, @j = 4000000&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;while @i &amp;lt;= @j&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;begin&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;insert test3 (col1)&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;values ('a')&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;set @i = @i + 1&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;end&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;select @d2 = getdate()&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="font-family:'Courier New';font-size:10;color:#000099;"&gt;select datediff(s, @d1, @d2)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;color:#000099;"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:100%;color:#000099;"&gt;Using GUIDs - Selects&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Alright, so I tested the GUID usage a bit more. In my previous post you can see I already tested the inserts for 100,000 rows using the 3 different methods. The first method (I refer to this method as Test1 throughout) used the NEWID() as a default on the uniqueidentifier clustered primary key. The second method was to use a composite key made up of 2 integer columns, one being an identity and one forced with a server id (this method is referred to as Test2 throughout), these columns make up this tables clustered primary key. And the third method uses a function to create a sequential uniqueidentifier, using a combination of the NEWID() function and a converted binary(6) datetime value (referred to as Test3 throughout) to make up the clustered primary key.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;color:#000099;"&gt;CODE FOR SEQUENTIAL NEWID() USED IN TEST3&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;color:#000099;"&gt;SELECT CONVERT(UNIQUEIDENTIFIER, CONVERT(BINARY(10), NEWID()) + CONVERT(BINARY(6), GETDATE()))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;These tests did the following, first truncated the tables and inserted 4,000,000 rows into test table, Test1, Test2 and Test3. Next, I tested single row selects for each table. For the next test, I selected 70,000 rows from each table. For the 70,000 row selects I did a ranged select, first I cleared the proc cache, the buffer cache, did a checkpoint, and then ran the select statement. I did this 10 times for each query and took the averages to report here. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;color:#000099;"&gt;INSERTS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Inserts for Test1 took 79 seconds to insert 100,000 rows and 45,191 seconds to insert 4,000,000 rows. The inserts for Test2 it took 33 seconds for the 100,000 rows and took 1630 seconds for the 4,000,000 rows. For Test3 the inserts took 33 seconds for the 100,000 inserted rows and 2025 seconds for the 4,000,000 rows.&lt;/span&gt;&lt;/p&gt;&lt;table style="BORDER-COLLAPSE: collapse;color:#111111;" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" &gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 1 -&lt;br /&gt;Uniqueidentifier&lt;br /&gt;NEWID()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 2 -&lt;br /&gt;Composite Key &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 3 -&lt;br /&gt;Uniqueidentifier&lt;br /&gt;getdate()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Insert - 100000&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;79 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;33 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;33 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Insert - 4000000&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;45191 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;1630 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;2025 sec&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;It took much longer for test1 because to insert because the GUID values are random values and because the default fill factor for indexes is 80%, which wasn't changed for this test, there were a great number of page splits. Because the inserts for Test2 and Test3 are sequential the fill factor for those indexes could be set to 100% for better performance on inserts and selects because fewer data pages would be used or returned. The inserts took longer for Test3 than they did for Test2 because of the overhead associated with executing a function 4,000,000 times.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color:#000099;"&gt;SELECTS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;The CPU Time for all single row selects took 0ms. However, the average CPU and Elapsed times for the 70,000 row ranged select varied for each test. On average Test1 performed better on CPU time than the other two tests but Test2 faired better on logical reads and elapsed time than the other 2 tests, this was because the size of a Test2 row is 9 bytes while the size of the Test1 and Test3 rows is 17 bytes. Test1 caused a tremendous amount of page splits and had a scan density around 12% when I ran a DBCC SHOWCONTIG after the inserts completed. The Test2 table had a scan density around 98% and the Test3 table had a scan density around 86% after inserts (I should have rebuilt the indexes after the data load, but I didn't :)). All of the CPU times were close enough in range to be circumstantial, but the elapsed time seemed to very between all of them. I think the variance is because of the nature of the data being returned to Query Analyzer for a more accurate test of elapsed time (I should have used OSQL, but I didn't :)). The tests seem to prove that the binary comparison of the GUID performs quite well.&lt;/span&gt;&lt;/p&gt;&lt;table style="BORDER-COLLAPSE: collapse;color:#111111;" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" &gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 1 -&lt;br /&gt;Uniqueidentifier&lt;br /&gt;NEWID()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 2 -&lt;br /&gt;Composite Key&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Test 3 -&lt;br /&gt;Uniqueidentifier&lt;br /&gt;getdate()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select Range 70000 -&lt;br /&gt;CPU TIME (AVERAGE)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;43 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;50 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;48 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select Range 70000 -&lt;br /&gt;Elapsed TIME (AVERAGE)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;1987 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;712 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;1175 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select Range 70000 -&lt;br /&gt;Logical Reads&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;331&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;159&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;439&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select Range 70000 -&lt;br /&gt;Physical Reads&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select Range 70000 -&lt;br /&gt;Read Aheads&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;331&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;159&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;440&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select 1 Row -&lt;br /&gt;CPU Time&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;0 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;0 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;0 ms&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select 1 Row -&lt;br /&gt;Logical Reads&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;Select 1 Row -&lt;br /&gt;Physical Reads&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-BOTTOM: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-RIGHT: 0.75pt; PADDING-TOP: 0.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10;"&gt;&lt;span style="font-family:Arial;color:#000099;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:100%;color:#000099;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;It would seem to be as a result of the tests that the uniqueidentifier data type performs about the same as an integer when filtering the data through the where clause. There are only a couple of downsides I can see in using the uniqueidentifier. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;First, and probably the most important, the size of the column (which can be an issue). It adds overhead to a system to have to return more data pages than possibly necessary (I/O's are the most expensive of system costs). The large size could in turn cause more page splits during inserts depending on whether the data is static or not (but so can adding a unnecessary column to a table).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Second, with the use of the NEWID() function, inserts will be random and therefore will by nature, cause page splits. Using an integer identity column will place the records sequentially into the table. "Ah...", you say, "...but the use of the function that parses the NEWID() and adds the converted getdate value to the end will do that as well." Yes, it does, and if you use it then I would say, “good for you, but why not use an integer then? It requires less space to store the unique value in an integer.” To be honest, I don’t think you will really save yourself that much in resources, except for the space if the table is really large. The inserts take roughly the same duration for inserting a single row and for the 100,000 rows. I don't often load 4 million rows into a table, and so for me that is not as big a deal (just use the modified NEWID() function when doing a mass load into a table or use it as the default value).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;The third issue is having to type that uniqueidentifier value into a query manually, in my opinion it has more potential for user error. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;So in short, it looks as though if you plan carefully and design wisely, then the use of the uniqueidentifier can perform as well in SELECT statements as an integer. Inserts are a different story and we already discussed that as long as they are sequential values it really shouldn't matter that much, unless you’re inserting millions of rows.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;I apologize for my initial shock in the usage of the uniqueidentifier column, hoping that everyone who read the initial statement can forgive me, Integers still rule the inserts though.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;&lt;b&gt;SPECIAL NOTE:&lt;/b&gt; I would like to thank Adam Machanic for all of the help and direction during the research of this topic.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;&lt;hr /&gt;&lt;/span&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color:#000099;"&gt;Zach Nichter &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;has been working with SQL Server for 11 years. Currently he holds a position at Levi Strauss &amp;amp; Co.&lt;br /&gt;Zach specializes in architecture, optimization and performance of SQL Server systems and Transact SQL.&lt;br /&gt;His blog can be found at&lt;/span&gt;&lt;a href="http://www.sqljunkies.com/WebLog/odds_and_ends/default.aspx"&gt;&lt;span style="color:#000099;"&gt;http://www.sqljunkies.com/WebLog/odds_and_ends/default.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#000099;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;pre class="sql:nogutter" name="code"&gt;&lt;br /&gt;CONVERT(UNIQUEIDENTIFIER, CONVERT(BINARY(10), NEWID()) + CONVERT(BINARY(6), GETDATE()))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Designing software is like being married. It's full of compromises. No one thing will work for EVERY situation. Yes GUID's have over head, but in certain very specific circumstances they are the correct choice. You should always weigh up all the pros and cons in your given circumstance and then select the appropriate technology to solve that problem. Remembering next time that your previous selection/choice most probably will not be right for this new situation.&lt;br /&gt;&lt;br /&gt;PS. I love my wife and like being married. No really. :)&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-1479072600526786006?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/1479072600526786006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=1479072600526786006' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1479072600526786006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1479072600526786006'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/01/to-guid-or-not-to-guid.html' title='To GUID or not to GUID'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-1062427214354844145</id><published>2009-01-08T13:31:00.018+09:00</published><updated>2009-01-09T13:58:19.777+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PerfectApp'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>StableGen version 1.5</title><content type='html'>Retrieving data, from a SQL stored procedure in .net 2.0 as an object, &lt;span style="FONT-WEIGHT: bold"&gt;with a single line of code&lt;/span&gt;, with intelisense, auto consistency checking, soft deleting, auditing, parameter &amp;amp; result interface generation and .net transactional support. So here is my code generator.&lt;br /&gt;&lt;br /&gt;If you are thinking: Yes but why? Please see &lt;a href="http://redcango.blogspot.com/2007/09/stablegen.html"&gt;StableGen version 1 article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWfNlBbOrI/AAAAAAAAAEo/c3qi8iaKCDY/s1600-h/StableGen15_4.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 9px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5288808393041722034" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWfNlBbOrI/AAAAAAAAAEo/c3qi8iaKCDY/s400/StableGen15_4.jpg" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;I have been using the generated code from this version in production code and so far have not had any major issues. Generating wrapper classes for my data access layer in .NET C#, has sped up development time tremediously. (Currently only supports SQL.)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_JHcNniNYPXo/SWWFeiBkCuI/AAAAAAAAAEQ/7WXAK7HJXnM/s1600-h/StableGen15_1.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5288780096992447202" border="0" alt="" src="http://2.bp.blogspot.com/_JHcNniNYPXo/SWWFeiBkCuI/AAAAAAAAAEQ/7WXAK7HJXnM/s400/StableGen15_1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;What has changed in this version:&lt;/strong&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Generated code is now FxCop &amp;amp; StyleCop compliant.&lt;/li&gt;&lt;li&gt;Interface classes now generated for Stored Procedure parameters and results.&lt;/li&gt;&lt;li&gt;Result object has been changed to a struct implementing the result interface. &lt;/li&gt;&lt;li&gt;Default indexer added to class.&lt;/li&gt;&lt;li&gt;ExecuteStoredProcedure method now also accepts any object implementing the parameter interface.&lt;/li&gt;&lt;li&gt;ExecuteStoredProcedure now returns a collection of the calling class if it implements the result interface.&lt;/li&gt;&lt;li&gt;Interface ExecuteStoredProcedure method now omitted if there is only one input parameter.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;FxCop &amp;amp; StyleCop&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;I'm a sucker for clean well formatted code, that can be easily understood and maintained. Must be because of all my experience trying to understand and maintain other peoples code. Consider the next guy when you write your code. I have also found FxCop/Code Analysis to be an invaluable learning tool for any developer.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Interface classes now generated for Stored Procedure parameters and results.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWeMERF2WI/AAAAAAAAAEY/9gHtvhpla7A/s1600-h/StableGen15_2.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 214px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5288807267557562722" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWeMERF2WI/AAAAAAAAAEY/9gHtvhpla7A/s400/StableGen15_2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To simplify the use of my generated class even more I have decided to generate 2 interface classes for each stored procedure: Parameter and Result. By having any business object implement the parameters interface, you can simple pass that whole class in as the parameter for the stored procedure. The result from the stored procedure will also conform to the resulting interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;Result object has been changed to a struct implementing the result interface. &lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWepcVgPmI/AAAAAAAAAEg/FKn_K7VbdN0/s1600-h/StableGen15_3.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 212px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5288807772234727010" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/SWWepcVgPmI/AAAAAAAAAEg/FKn_K7VbdN0/s400/StableGen15_3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There was no need for this to be a class, so for performance and resource reasons I made it a struct.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;Default indexer added to class.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Duh!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;ExecuteStoredProcedure method now also accepts any object implementing the parameter interface.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;See interface classes now generated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;ExecuteStoredProcedure now returns a collection of the calling class if it implements the result interface.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I use reflection and the System.Activator.CreateInstance to create an instance of the calling class if it implements the result interface for this stored procedure. The reasoning behind this is that you would then not need to map the business objects properties to the stored procedure result. I know there is a slight performance hit here, but in my opinion if you weigh this off against the saving in development time then it is well worth it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;Interface ExecuteStoredProcedure method now omitted if there is only one input parameter.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;If the stored procedure ends up having only one or no parameters then we need not have a parameter interface. Having two method with the same number of parameters with different types is also not supported in the .NET framework.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="c-sharp:nogutter" name="code"&gt;&lt;br /&gt;&lt;br /&gt;// &lt;copyright file="uspGetBillOfMaterials.cs" company="Stable Software Solutions"&gt;&lt;br /&gt;// Copyright (c) 2008 All Right Reserved&lt;br /&gt;// &lt;/copyright&gt;&lt;br /&gt;// &lt;author&gt;DataGen v1.5.0.137 (Dana Beck)&lt;/author&gt;&lt;br /&gt;// &lt;email&gt;ABC@DEF.com&lt;/email&gt;&lt;br /&gt;// &lt;date&gt;9/01/2009 10:28:06 AM&lt;/date&gt;&lt;br /&gt;// &lt;summary&gt;Generated Data Access wrapper layer for sql stored procedures on databse SS-N-001 for stored procedure dbo.uspGetBillOfMaterials.&lt;/summary&gt;&lt;br /&gt;namespace DB.AdvantureWorks&lt;br /&gt;{&lt;br /&gt;    using System;&lt;br /&gt;    using System.CodeDom.Compiler;&lt;br /&gt;    using System.Collections.ObjectModel;&lt;br /&gt;    using System.Data;&lt;br /&gt;    using System.Data.SqlClient;&lt;br /&gt;    using System.Diagnostics;&lt;br /&gt;&lt;br /&gt;    using DB.AdvantureWorks.Interfaces;&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;Generated data access struct item from stored procedure 'uspGetBillOfMaterials'&lt;/summary&gt;&lt;br /&gt;    /// &lt;remarks&gt;Generated by DataGenAddin(Dana Beck) ver 1.5.0.137 for DataBase SS-N-001 on 9/01/2009 10:28:07 AM.&lt;/remarks&gt;&lt;br /&gt;    [GeneratedCode("StableGen", "1.5.0.137")]&lt;br /&gt;    internal struct RowObject_uspGetBillOfMaterials : IuspGetBillOfMaterials_Result&lt;br /&gt;    {&lt;br /&gt;        private Nullable&lt;int&gt; productAssemblyID;&lt;br /&gt;        private Nullable&lt;int&gt; componentID;&lt;br /&gt;        private string componentDesc;&lt;br /&gt;        private Nullable&lt;decimal&gt; totalQuantity;&lt;br /&gt;        private Nullable&lt;decimal&gt; standardCost;&lt;br /&gt;        private Nullable&lt;decimal&gt; listPrice;&lt;br /&gt;        private Nullable&lt;int16&gt; bOMLevel;&lt;br /&gt;        private Nullable&lt;int&gt; recursionLevel;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ProductAssemblyID.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;int&gt; ProductAssemblyID&lt;br /&gt;        {&lt;br /&gt;            get { return this.productAssemblyID; }&lt;br /&gt;            set { this.productAssemblyID = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ComponentID.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;int&gt; ComponentID&lt;br /&gt;        {&lt;br /&gt;            get { return this.componentID; }&lt;br /&gt;            set { this.componentID = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ComponentDesc.&lt;/summary&gt;&lt;br /&gt;        public string ComponentDesc&lt;br /&gt;        {&lt;br /&gt;            get { return this.componentDesc; }&lt;br /&gt;            set { this.componentDesc = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets TotalQuantity.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;decimal&gt; TotalQuantity&lt;br /&gt;        {&lt;br /&gt;            get { return this.totalQuantity; }&lt;br /&gt;            set { this.totalQuantity = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets StandardCost.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;decimal&gt; StandardCost&lt;br /&gt;        {&lt;br /&gt;            get { return this.standardCost; }&lt;br /&gt;            set { this.standardCost = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ListPrice.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;decimal&gt; ListPrice&lt;br /&gt;        {&lt;br /&gt;            get { return this.listPrice; }&lt;br /&gt;            set { this.listPrice = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets BOMLevel.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;int16&gt; BOMLevel&lt;br /&gt;        {&lt;br /&gt;            get { return this.bOMLevel; }&lt;br /&gt;            set { this.bOMLevel = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets RecursionLevel.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;int&gt; RecursionLevel&lt;br /&gt;        {&lt;br /&gt;            get { return this.recursionLevel; }&lt;br /&gt;            set { this.recursionLevel = value; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;Generated data access class from storedproc 'uspGetBillOfMaterials'&lt;/summary&gt;&lt;br /&gt;    /// &lt;remarks&gt;Generated by DataGenAddin(Dana Beck) ver 1.5.0.137 for DataBase SS-N-001 on 9/01/2009 10:28:07 AM.&lt;/remarks&gt;&lt;br /&gt;    [GeneratedCode("StableGen", "1.5.0.137")]&lt;br /&gt;    public partial class uspGetBillOfMaterials : IDisposable&lt;br /&gt;    {&lt;br /&gt;        private Collection&lt;iuspgetbillofmaterials_result&gt; rows;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Prevents a default instance of the uspGetBillOfMaterials class from being created. Please use factory pettern constructor uspGetBillOfMaterials.CreateInstance().&lt;/summary&gt;&lt;br /&gt;        private uspGetBillOfMaterials()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets a collection of uspGetBillOfMaterials (item) records as RowuspGetBillOfMaterials objects.&lt;/summary&gt;&lt;br /&gt;        public Collection&lt;iuspgetbillofmaterials_result&gt; Items&lt;br /&gt;        {&lt;br /&gt;            get { return this.rows; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Default indexer for uspGetBillOfMaterials.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="index"&gt;The zero-based index of the element to get or set.&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public IuspGetBillOfMaterials_Result this[int index]&lt;br /&gt;        {&lt;br /&gt;            get { return this.rows[index]; }&lt;br /&gt;            set { this.rows[index] = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Factory pattern constructor.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="connectionObject"&gt;Sql Connection objects to be used for this SQL dataAccess.&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="parameters"&gt;Any object implementing IuspGetBillOfMaterials_Param.&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;An instance of uspGetBillOfMaterials.&lt;/returns&gt;&lt;br /&gt;        public static uspGetBillOfMaterials ExecuteProcedure(SqlConnection connectionObject, IuspGetBillOfMaterials_Param parameters)&lt;br /&gt;        {&lt;br /&gt;            return&lt;br /&gt;            uspGetBillOfMaterials.ExecuteProcedure(connectionObject, parameters.StartProductID, parameters.CheckDate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Factory pattern constructor.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="connectionObject"&gt;Sql Connection objects to be used for this SQL dataAccess.&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="startProductID"&gt;Generated parameter called startProductID.&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="checkDate"&gt;Generated parameter called checkDate.&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;An instance of uspGetBillOfMaterials.&lt;/returns&gt;&lt;br /&gt;        public static uspGetBillOfMaterials ExecuteProcedure(SqlConnection connectionObject, Nullable&lt;int&gt; startProductID, Nullable&lt;datetime&gt; checkDate)&lt;br /&gt;        {&lt;br /&gt;            uspGetBillOfMaterials tmpuspGetBillOfMaterials = new uspGetBillOfMaterials();&lt;br /&gt;&lt;br /&gt;            bool didIOpenTheConnection = false;&lt;br /&gt;            SqlCommand cmd = new SqlCommand();&lt;br /&gt;            SqlDataReader result = null;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                cmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;                cmd.CommandText = "dbo.uspGetBillOfMaterials";&lt;br /&gt;                cmd.Parameters.Add("@StartProductID", SqlDbType.Int).Value = startProductID;&lt;br /&gt;                cmd.Parameters.Add("@CheckDate", SqlDbType.DateTime).Value = checkDate;&lt;br /&gt;&lt;br /&gt;                if (connectionObject != null)&lt;br /&gt;                {&lt;br /&gt;                    // If the connection object I received is closed, try to open it. If I open it, I must close it again.&lt;br /&gt;                    if (connectionObject.State == ConnectionState.Closed)&lt;br /&gt;                    {&lt;br /&gt;                        connectionObject.Open();&lt;br /&gt;                        didIOpenTheConnection = true;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    cmd.Connection = connectionObject;&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    throw new ArgumentNullException("connectionObject", "Please use the TheConnection.SqlConnectionObject to get a connection object.");&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                result = cmd.ExecuteReader(CommandBehavior.Default);&lt;br /&gt;&lt;br /&gt;                tmpuspGetBillOfMaterials.rows = new Collection&lt;iuspgetbillofmaterials_result&gt;();&lt;br /&gt;&lt;br /&gt;                while (result.Read())&lt;br /&gt;                {&lt;br /&gt;                    IuspGetBillOfMaterials_Result tmpRowObj = null;&lt;br /&gt;                    Type[] typeList = (new StackFrame(1, false).GetMethod().DeclaringType).GetInterfaces();&lt;br /&gt;&lt;br /&gt;                    foreach (Type itemType in typeList)&lt;br /&gt;                    {&lt;br /&gt;                        if (itemType.Name == "IuspGetBillOfMaterials_Result")&lt;br /&gt;                        {&lt;br /&gt;                            // StackFrame: This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.&lt;br /&gt;                            tmpRowObj = (IuspGetBillOfMaterials_Result)System.Activator.CreateInstance(new StackFrame(1, false).GetMethod().DeclaringType);&lt;br /&gt;                            break;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    if (tmpRowObj == null)&lt;br /&gt;                    {&lt;br /&gt;                        tmpRowObj = new RowObject_uspGetBillOfMaterials();&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    tmpRowObj.ProductAssemblyID = result.IsDBNull(result.GetOrdinal("ProductAssemblyID")) ? null : (Nullable&lt;int&gt;)result["ProductAssemblyID"];&lt;br /&gt;                    tmpRowObj.ComponentID = result.IsDBNull(result.GetOrdinal("ComponentID")) ? null : (Nullable&lt;int&gt;)result["ComponentID"];&lt;br /&gt;                    tmpRowObj.ComponentDesc = result.IsDBNull(result.GetOrdinal("ComponentDesc")) ? null : result["ComponentDesc"].ToString();&lt;br /&gt;                    tmpRowObj.TotalQuantity = result.IsDBNull(result.GetOrdinal("TotalQuantity")) ? null : (Nullable&lt;decimal&gt;)result["TotalQuantity"];&lt;br /&gt;                    tmpRowObj.StandardCost = result.IsDBNull(result.GetOrdinal("StandardCost")) ? null : (Nullable&lt;decimal&gt;)result["StandardCost"];&lt;br /&gt;                    tmpRowObj.ListPrice = result.IsDBNull(result.GetOrdinal("ListPrice")) ? null : (Nullable&lt;decimal&gt;)result["ListPrice"];&lt;br /&gt;                    tmpRowObj.BOMLevel = result.IsDBNull(result.GetOrdinal("BOMLevel")) ? null : (Nullable&lt;short&gt;)result["BOMLevel"];&lt;br /&gt;                    tmpRowObj.RecursionLevel = result.IsDBNull(result.GetOrdinal("RecursionLevel")) ? null : (Nullable&lt;int&gt;)result["RecursionLevel"];&lt;br /&gt;&lt;br /&gt;                    tmpuspGetBillOfMaterials.Items.Add(tmpRowObj);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if (result != null)&lt;br /&gt;                {&lt;br /&gt;                    result.Close();&lt;br /&gt;                    result = null;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                if (didIOpenTheConnection)&lt;br /&gt;                {&lt;br /&gt;                    if (connectionObject != null)&lt;br /&gt;                    {&lt;br /&gt;                        connectionObject.Close();&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return tmpuspGetBillOfMaterials;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Types that own disposable fields should be disposable.&lt;/summary&gt;&lt;br /&gt;        public void Dispose()&lt;br /&gt;        {&lt;br /&gt;            this.Dispose(true);&lt;br /&gt;            GC.SuppressFinalize(this);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;The bulk of the clean-up code is implemented in Dispose(bool).&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="disposing"&gt;True or false.&lt;/param&gt;&lt;br /&gt;        protected virtual void Dispose(bool disposing)&lt;br /&gt;        {&lt;br /&gt;            if (disposing)&lt;br /&gt;            {&lt;br /&gt;                // Do nothing!&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;// &lt;copyright file="IuspGetBillOfMaterials.cs" company="Stable Software Solutions"&gt;&lt;br /&gt;// Copyright (c) 2008 All Right Reserved&lt;br /&gt;// &lt;/copyright&gt;&lt;br /&gt;// &lt;author&gt;DataGen v1.5.0.137 (Dana Beck)&lt;/author&gt;&lt;br /&gt;// &lt;email&gt;ABC@DEF.com&lt;/email&gt;&lt;br /&gt;// &lt;date&gt;9/01/2009 10:28:07 AM&lt;/date&gt;&lt;br /&gt;// &lt;summary&gt;Generated Data Access wrapper interface for sql stored procedures on databse SS-N-001 for stored procedure dbo.uspGetBillOfMaterials.&lt;/summary&gt;&lt;br /&gt;namespace DB.AdvantureWorks.Interfaces&lt;br /&gt;{&lt;br /&gt;    using System;&lt;br /&gt;    using System.CodeDom.Compiler;&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;Generated stored procedure result interface.&lt;/summary&gt;&lt;br /&gt;    [GeneratedCode("StableGen", "1.5.0.137")]&lt;br /&gt;    public interface IuspGetBillOfMaterials_Result&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ProductAssemblyID.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;int&gt; ProductAssemblyID { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ComponentID.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;int&gt; ComponentID { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ComponentDesc.&lt;/summary&gt;&lt;br /&gt;        string ComponentDesc { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets TotalQuantity.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;decimal&gt; TotalQuantity { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets StandardCost.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;decimal&gt; StandardCost { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets ListPrice.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;decimal&gt; ListPrice { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets BOMLevel.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;int16&gt; BOMLevel { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets RecursionLevel.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;int&gt; RecursionLevel { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;Generated stored procedure parameter interface.&lt;/summary&gt;&lt;br /&gt;    [GeneratedCode("StableGen", "1.5.0.137")]&lt;br /&gt;    public interface IuspGetBillOfMaterials_Param&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;Gets or sets StartProductID.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;int&gt; StartProductID { get; set; }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Gets or sets CheckDate.&lt;/summary&gt;&lt;br /&gt;        Nullable&lt;datetime&gt; CheckDate { get; set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Plans for version 2&lt;/strong&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Regular expressions for use with templates rather than the current string builder. :o&lt;/li&gt;&lt;li&gt;Visual Studio integration. (To much copy and pasting at the moment.)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Conclusions&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;This implementation was not designed for large, high performance applications but I have been load testing it and have been getting very good results. This article is not about my code generator but rather the code that I have chosen to generate. I could have easily used something like CodeSmith, but that would not have been half as much fun. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;In the end it's all about experimenting, learning first hand what works and more importantly what does not work. I hope that you got something out of this post and welcome any constructive criticism.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-1062427214354844145?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/1062427214354844145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=1062427214354844145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1062427214354844145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1062427214354844145'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/01/stablegen-version-15.html' title='StableGen version 1.5'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JHcNniNYPXo/SWWfNlBbOrI/AAAAAAAAAEo/c3qi8iaKCDY/s72-c/StableGen15_4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-2976829899908258654</id><published>2009-01-08T11:51:00.002+09:00</published><updated>2009-01-08T12:03:38.855+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OZ'/><title type='text'>Australian life</title><content type='html'>We arrived in Perth on the first of June as planned.&lt;br /&gt;&lt;br /&gt;I LOVE PERTH! (My only regret is not moving here sooner.)&lt;br /&gt;&lt;br /&gt;My family and I have now completely settled in and have had a wonderful Christmas. The new year has started and it's time for some longer term planning.&lt;br /&gt;&lt;br /&gt;I am full of optimism and looking forward to the challenges of the new year.&lt;br /&gt;&lt;br /&gt;PS. I found work as a Technical Lead Developer, 3 weeks after landing here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-2976829899908258654?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/2976829899908258654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=2976829899908258654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2976829899908258654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2976829899908258654'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2009/01/australian-life.html' title='Australian life'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-7397065619072987399</id><published>2008-05-22T20:36:00.003+08:00</published><updated>2008-05-22T20:40:26.151+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OZ'/><title type='text'>Some more OZ progress</title><content type='html'>We're flying to Perth next Saturday the 31st of May.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;VISA in hand&lt;/li&gt;&lt;li&gt;Plane tickets in hand&lt;/li&gt;&lt;li&gt;Container shipped&lt;/li&gt;&lt;li&gt;TV air freighted. :)&lt;/li&gt;&lt;li&gt;No job yet. :(&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So if anybody in Perth is looking for a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;pretty&lt;/span&gt; decant C#.NET programmer give me a shout!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-7397065619072987399?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/7397065619072987399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=7397065619072987399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7397065619072987399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7397065619072987399'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2008/05/some-more-oz-progress.html' title='Some more OZ progress'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4990238492742883880</id><published>2008-04-09T19:35:00.002+08:00</published><updated>2008-04-09T19:38:08.122+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OZ'/><title type='text'>OZ Progress</title><content type='html'>Our OZ plans are now finally starting to come together.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sponsorship has been approved.&lt;/li&gt;&lt;li&gt;Medicals done.&lt;/li&gt;&lt;li&gt;VISA application submitted and received.&lt;/li&gt;&lt;li&gt;My wife has found a job.&lt;/li&gt;&lt;li&gt;Secured a rental property.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If all goes well, we will be in Perth by the 1st of June '08.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4990238492742883880?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4990238492742883880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4990238492742883880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4990238492742883880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4990238492742883880'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2008/04/oz-progress.html' title='OZ Progress'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-2174877618342316313</id><published>2008-01-08T18:19:00.000+09:00</published><updated>2008-01-08T18:24:27.133+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WM'/><title type='text'>Windows mobile 7</title><content type='html'>Found &lt;a href="http://microsoft.blognewschannel.com/archives/2008/01/06/exclusive-windows-mobile-7-to-focus-on-touch-and-motion-gestures"&gt;this&lt;/a&gt; blog.  Is this really Windows Mobile 7?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/R4NBIuIsDYI/AAAAAAAAAC8/duhJrpOcL4c/s1600-h/WM7_1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_JHcNniNYPXo/R4NBIuIsDYI/AAAAAAAAAC8/duhJrpOcL4c/s400/WM7_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5153034016721210754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Look really cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-2174877618342316313?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/2174877618342316313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=2174877618342316313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2174877618342316313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/2174877618342316313'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2008/01/windows-mobile-7.html' title='Windows mobile 7'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JHcNniNYPXo/R4NBIuIsDYI/AAAAAAAAAC8/duhJrpOcL4c/s72-c/WM7_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-8163379762826058947</id><published>2008-01-03T20:10:00.000+09:00</published><updated>2008-01-03T20:14:56.144+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WM'/><title type='text'>Windows Mobile update</title><content type='html'>I finally got my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;TyTn&lt;/span&gt; II. I'm loving it.&lt;br /&gt;&lt;br /&gt;Started playing around with the WM &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SDK&lt;/span&gt;. Stumbled onto these 3 sites.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.pointui.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;PointUI&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.droneship.com/pockethal/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;PocketHAL&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.droneship.com/pocketfrog/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;PocketFROG&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;More later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-8163379762826058947?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/8163379762826058947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=8163379762826058947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8163379762826058947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8163379762826058947'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2008/01/windows-mobile-update.html' title='Windows Mobile update'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-8425534182906761054</id><published>2007-12-07T16:13:00.000+09:00</published><updated>2007-12-07T16:33:53.180+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WM'/><category scheme='http://www.blogger.com/atom/ns#' term='Surface'/><title type='text'>Windows Mobile</title><content type='html'>Saturday I ordered my HTC TyTn-II, still waiting. :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JHcNniNYPXo/R1j3Lfm6R5I/AAAAAAAAAC0/eLkJtN2Dw9Y/s1600-h/tytnII_101x111.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_JHcNniNYPXo/R1j3Lfm6R5I/AAAAAAAAAC0/eLkJtN2Dw9Y/s400/tytnII_101x111.jpg" alt="" id="BLOGGER_PHOTO_ID_5141130751478744978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I have decided to focus my Microsoft skill sets on&lt;br /&gt;&lt;ul&gt;&lt;li&gt;.NET Framework (MCTS)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;WPF (lack some artistic flair...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;WCF&lt;/li&gt;&lt;li&gt;Windows Mobile development (WM &amp;amp; tabletPC)&lt;/li&gt;&lt;/ul&gt;I have a real passion for Microsoft Surface computing. I have even gone to the extreme of building my own surface computer, with the help of some South African &lt;a href="http://blog.whitespaced.co.za/"&gt;university students&lt;/a&gt;. I think the future of surface and other multi-touch consumer devices is only starting to be realised. The iPhone is only a glimpse of what can be done. With the highly anticipated release of silver light &lt;a href="http://silverlight.net/forums/t/456.aspx"&gt;WPFe for windows mobile&lt;/a&gt;... This will open the floodgates.&lt;br /&gt;&lt;br /&gt;If you interested in this kind of thing you can also have a look at the &lt;a href="http://msdn2.microsoft.com/en-gb/embedded/bb267253.aspx"&gt;.NET Micro Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is just an introduction to a topic I will be blogging about a lot in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-8425534182906761054?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/8425534182906761054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=8425534182906761054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8425534182906761054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8425534182906761054'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/12/windows-mobile.html' title='Windows Mobile'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JHcNniNYPXo/R1j3Lfm6R5I/AAAAAAAAAC0/eLkJtN2Dw9Y/s72-c/tytnII_101x111.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4826064560747023529</id><published>2007-11-29T17:01:00.000+09:00</published><updated>2007-11-29T17:03:18.959+09:00</updated><title type='text'>Top 10 Ways To Demotivate Your Programming Team</title><content type='html'>If you're in charge of an overly motivated programming team that meets all  deadlines and produces high quality code you may recognize that they don't  really need you. Here are 10 tips how to regain control.&lt;br /&gt;&lt;a title="Permanent Link to Top 10 Ways To Demotivate Your Programming Team" href="http://klimek.box4.net/blog/2006/12/20/top-10-ways-to-demotivate-your-programming-team/" rel="bookmark"&gt;Top 10 Ways To Demotivate Your Programming Team&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4826064560747023529?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4826064560747023529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4826064560747023529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4826064560747023529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4826064560747023529'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/11/top-10-ways-to-demotivate-your.html' title='Top 10 Ways To Demotivate Your Programming Team'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-4453746687804353550</id><published>2007-09-26T19:40:00.011+08:00</published><updated>2009-01-09T10:44:26.960+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>StableGen</title><content type='html'>Retrieving data, from a SQL stored procedure in .net 2.0 as an object, &lt;span style="FONT-WEIGHT: bold"&gt;with a single line of code&lt;/span&gt;,with intelisense, auto consistency checking, soft deleting, auditing and .net transactional support.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpKZjo-BmI/AAAAAAAAACk/9E9zjRPukbI/s1600-h/StableGen9.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114482129756882530" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpKZjo-BmI/AAAAAAAAACk/9E9zjRPukbI/s400/StableGen9.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A while back I worked for a company, and we decide that we will be using an object wrapping system for all stored procedures. It soon became apparent that using these objects to get to SQL data was just sweet. &lt;span style="FONT-WEIGHT: bold"&gt;BUT&lt;/span&gt;. &lt;span style="FONT-STYLE: italic"&gt;(There is always one of those aren't there?)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Writing these object wrappers was tedious and time consuming. So one night I decided to write a little application that would generate this code for me, and so StableGen was borne.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpFgzo-BeI/AAAAAAAAABk/E3IjDOFfZVQ/s1600-h/StableGen1.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114476756752795106" border="0" alt="" src="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpFgzo-BeI/AAAAAAAAABk/E3IjDOFfZVQ/s400/StableGen1.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;After selecting and connecting to your SQL database, simply browse to the stored procedure and right click. Alternatively you can right click on the table and generate the stored procedure for you, as in this example.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpF0zo-BfI/AAAAAAAAABs/1aDMYsDs3DA/s1600-h/StableGen2.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114477100350178802" border="0" alt="" src="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpF0zo-BfI/AAAAAAAAABs/1aDMYsDs3DA/s400/StableGen2.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Give the stored procedure a name, select the flag delete column and finally select the primary key column.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpGAjo-BgI/AAAAAAAAAB0/qeZpT8sPdbY/s1600-h/StableGen3.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114477302213641730" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpGAjo-BgI/AAAAAAAAAB0/qeZpT8sPdbY/s400/StableGen3.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Click generate and wham, your select stored procedure. Copy and past, and you're done.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/RvpGKTo-BhI/AAAAAAAAAB8/9CODeO-n_vo/s1600-h/StableGen4.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114477469717366290" border="0" alt="" src="http://4.bp.blogspot.com/_JHcNniNYPXo/RvpGKTo-BhI/AAAAAAAAAB8/9CODeO-n_vo/s400/StableGen4.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/RvpGWTo-BiI/AAAAAAAAACE/BNWaoYIVS1M/s1600-h/StableGen5.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114477675875796514" border="0" alt="" src="http://4.bp.blogspot.com/_JHcNniNYPXo/RvpGWTo-BiI/AAAAAAAAACE/BNWaoYIVS1M/s400/StableGen5.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Refresh the "Database Properties" window and right click on your new stored procedure.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpGhzo-BjI/AAAAAAAAACM/tzg68Q8SMpw/s1600-h/StableGen6.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114477873444292146" border="0" alt="" src="http://2.bp.blogspot.com/_JHcNniNYPXo/RvpGhzo-BjI/AAAAAAAAACM/tzg68Q8SMpw/s400/StableGen6.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Supply the namespace you want to use, I like DB.(Database name), It works well when you have a shared "Data Access Layer". Select how you want your data returned and "Generate".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpGxjo-BkI/AAAAAAAAACU/-w46PnSbjN0/s1600-h/StableGen7.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114478144027231810" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpGxjo-BkI/AAAAAAAAACU/-w46PnSbjN0/s400/StableGen7.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Copy and past the code into your project. You are now ready to access the stored procedure with a single line of code.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpG8jo-BlI/AAAAAAAAACc/MAngQBiHUSU/s1600-h/StableGen8.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114478333005792850" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/RvpG8jo-BlI/AAAAAAAAACc/MAngQBiHUSU/s400/StableGen8.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Features of StableGen&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;.NET transactional support. &lt;/li&gt;&lt;li&gt;Threading.&lt;/li&gt;&lt;li&gt;Generate Select stored procedures.&lt;/li&gt;&lt;li&gt;Generate Create/Update/Delete stored procedures.&lt;/li&gt;&lt;li&gt;Generate Enum(s) from lookup tables.&lt;/li&gt;&lt;li&gt;Generate Stored procedure wrapper classes.&lt;/li&gt;&lt;li&gt;Nullable types.&lt;/li&gt;&lt;li&gt;Fully commented generated code.&lt;/li&gt;&lt;li&gt;FxCop clean generated source code.&lt;/li&gt;&lt;li&gt;Partial class, easy to extend generated classes.&lt;/li&gt;&lt;li&gt;Factory pattern constructors (static).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Sample of a generate Stored Procedure wrapper class.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/Rvpaajo-BnI/AAAAAAAAACs/4OYTX4m3ZP0/s1600-h/StableGen10.JPG"&gt;&lt;img style="CURSOR: pointer" id="BLOGGER_PHOTO_ID_5114499739122796146" border="0" alt="" src="http://1.bp.blogspot.com/_JHcNniNYPXo/Rvpaajo-BnI/AAAAAAAAACs/4OYTX4m3ZP0/s400/StableGen10.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre name="code" class="c-sharp:nogutter"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Collections.ObjectModel;&lt;br /&gt;using System.Globalization;&lt;br /&gt;&lt;br /&gt;using DB.InternalData.Row;&lt;br /&gt;&lt;br /&gt;namespace DB.InternalData&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;Generated data access class from storedproc 'PersonGet'&lt;/summary&gt;&lt;br /&gt;    /// &lt;remarks&gt;Generated by DataGenAddin(Dana Beck) ver 0.7.2.578 for DataBase (local) on 26/09/2007 13:01:55.&lt;/remarks&gt;&lt;br /&gt;    public partial class PersonGet : IDisposable&lt;br /&gt;    {&lt;br /&gt;        private Collection&lt;rowpersonget&gt; _rows = new Collection&lt;rowpersonget&gt;();&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Private constructor, please use static method Construct.&lt;/summary&gt;&lt;br /&gt;        private PersonGet() { }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Factory pattern constructor..&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="connectionObject"&gt;Sql Connection objects to be used for this SQL dataAccess.&lt;br /&gt;        /// &lt;param name="id"&gt;id.&lt;br /&gt;        /// &lt;returns&gt;An instance of PersonGet.&lt;/returns&gt;&lt;br /&gt;        public static PersonGet Construct(SqlConnection connectionObject, Guid id)&lt;br /&gt;        {&lt;br /&gt;            PersonGet tmpPersonGet = new PersonGet();&lt;br /&gt;&lt;br /&gt;            bool didIOpenTheConnection = false;&lt;br /&gt;            SqlCommand cmd = new SqlCommand();&lt;br /&gt;            SqlDataReader result = null;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                cmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;                cmd.CommandText = "PersonGet";&lt;br /&gt;                cmd.Parameters.Add("@Id", SqlDbType.UniqueIdentifier).Value = id;&lt;br /&gt;                if (connectionObject != null)&lt;br /&gt;                {&lt;br /&gt;                    //If the connection object I received is closed, try to open it. If I open it, I must close it again.&lt;br /&gt;                    if (connectionObject.State == ConnectionState.Closed)&lt;br /&gt;                    {&lt;br /&gt;                        connectionObject.Open();&lt;br /&gt;                        didIOpenTheConnection = true;&lt;br /&gt;                    }&lt;br /&gt;                    cmd.Connection = connectionObject;&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    throw new ArgumentNullException("connectionObject", "Please use the TheConnection.SqlConnectionObject to get a connection object.");&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                result = cmd.ExecuteReader(CommandBehavior.Default);&lt;br /&gt;&lt;br /&gt;                while (result.Read())&lt;br /&gt;                {&lt;br /&gt;                    RowPersonGet tmpRowPersonGet = new RowPersonGet();&lt;br /&gt;                    tmpRowPersonGet.Id = result.IsDBNull(result.GetOrdinal("Id")) ? Guid.Empty : (Guid)result["Id"];&lt;br /&gt;                    tmpRowPersonGet.StaffCode = result.IsDBNull(result.GetOrdinal("StaffCode")) ? null : result["StaffCode"].ToString();&lt;br /&gt;                    tmpRowPersonGet.Surname = result.IsDBNull(result.GetOrdinal("Surname")) ? null : result["Surname"].ToString();&lt;br /&gt;                    tmpRowPersonGet.FirstName = result.IsDBNull(result.GetOrdinal("FirstName")) ? null : result["FirstName"].ToString();&lt;br /&gt;                    tmpRowPersonGet.Extension = result.IsDBNull(result.GetOrdinal("Extension")) ? null : result["Extension"].ToString();&lt;br /&gt;                    tmpRowPersonGet.LastModifiedBy = result.IsDBNull(result.GetOrdinal("LastModifiedBy")) ? Guid.Empty : (Guid)result["LastModifiedBy"];&lt;br /&gt;                    tmpRowPersonGet.LastUpdated = result.IsDBNull(result.GetOrdinal("LastUpdated")) ? null : (Nullable&lt;datetime&gt;)result["LastUpdated"];&lt;br /&gt;                    tmpRowPersonGet.Deleted = result.IsDBNull(result.GetOrdinal("Deleted")) ? false : (bool)result["Deleted"];&lt;br /&gt;&lt;br /&gt;                    tmpPersonGet.Items.Add(tmpRowPersonGet);&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if (result != null)&lt;br /&gt;                {&lt;br /&gt;                    result.Close();&lt;br /&gt;                }&lt;br /&gt;                if (didIOpenTheConnection) { if (connectionObject != null) { connectionObject.Close(); } }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return tmpPersonGet;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Returns a collection of PersonGet (item) records as RowPersonGet objects.&lt;/summary&gt;&lt;br /&gt;        public Collection&lt;rowpersonget&gt; Items&lt;br /&gt;        {&lt;br /&gt;            get { return _rows; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Types that own disposable fields should be disposable.&lt;/summary&gt;&lt;br /&gt;        public void Dispose()&lt;br /&gt;        {&lt;br /&gt;            Dispose(true);&lt;br /&gt;            GC.SuppressFinalize(this);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;The bulk of the clean-up code is implemented in Dispose(bool).&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="disposing"&gt;True or false.&lt;br /&gt;        protected virtual void Dispose(bool disposing)&lt;br /&gt;        {&lt;br /&gt;            if (disposing)&lt;br /&gt;            {&lt;br /&gt;                // Do nothing!&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;namespace DB.InternalData.Row&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;Generated data access class item from storedproc 'PersonGet'&lt;/summary&gt;&lt;br /&gt;    /// &lt;remarks&gt;Generated by DataGenAddin(Dana Beck) ver 0.7.2.578 for DataBase (local) on 26/09/2007 13:01:56.&lt;/remarks&gt;&lt;br /&gt;    public struct RowPersonGet&lt;br /&gt;    {&lt;br /&gt;        private Guid _Id;&lt;br /&gt;        private string _StaffCode;&lt;br /&gt;        private string _Surname;&lt;br /&gt;        private string _FirstName;&lt;br /&gt;        private string _Extension;&lt;br /&gt;        private Guid _LastModifiedBy;&lt;br /&gt;        private Nullable&lt;datetime&gt; _LastUpdated;&lt;br /&gt;        private bool _Deleted;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Id.&lt;/summary&gt;&lt;br /&gt;        public Guid Id&lt;br /&gt;        {&lt;br /&gt;            get { return _Id; }&lt;br /&gt;            set { _Id = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;StaffCode.&lt;/summary&gt;&lt;br /&gt;        public string StaffCode&lt;br /&gt;        {&lt;br /&gt;            get { return _StaffCode; }&lt;br /&gt;            set { _StaffCode = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Surname.&lt;/summary&gt;&lt;br /&gt;        public string Surname&lt;br /&gt;        {&lt;br /&gt;            get { return _Surname; }&lt;br /&gt;            set { _Surname = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;FirstName.&lt;/summary&gt;&lt;br /&gt;        public string FirstName&lt;br /&gt;        {&lt;br /&gt;            get { return _FirstName; }&lt;br /&gt;            set { _FirstName = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Extension.&lt;/summary&gt;&lt;br /&gt;        public string Extension&lt;br /&gt;        {&lt;br /&gt;            get { return _Extension; }&lt;br /&gt;            set { _Extension = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;LastModifiedBy.&lt;/summary&gt;&lt;br /&gt;        public Guid LastModifiedBy&lt;br /&gt;        {&lt;br /&gt;            get { return _LastModifiedBy; }&lt;br /&gt;            set { _LastModifiedBy = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;LastUpdated.&lt;/summary&gt;&lt;br /&gt;        public Nullable&lt;datetime&gt; LastUpdated&lt;br /&gt;        {&lt;br /&gt;            get { return _LastUpdated; }&lt;br /&gt;            set { _LastUpdated = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Deleted.&lt;/summary&gt;&lt;br /&gt;        public bool Deleted&lt;br /&gt;        {&lt;br /&gt;            get { return _Deleted; }&lt;br /&gt;            set { _Deleted = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;In most programming languages there is no default implementation of the equality operator (==) for value types. Therefore, you should overload the equality operator (==) any time equality is meaningful.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="p1"&gt;RowPersonGet.&lt;br /&gt;        /// &lt;param name="p2"&gt;RowPersonGet.&lt;br /&gt;        /// &lt;returns&gt;Reference equality.&lt;/returns&gt;&lt;br /&gt;        public static bool operator ==(RowPersonGet p1, RowPersonGet p2)&lt;br /&gt;        {&lt;br /&gt;            return p1.Equals(p2);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;The inequality operator (!=) returns false if its operands are equal, true otherwise. Inequality operators are predefined for all types, including string and object. User-defined types can overload the != operator.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="p1"&gt;RowPersonGet&lt;br /&gt;        /// &lt;param name="p2"&gt;RowPersonGet&lt;br /&gt;        /// &lt;returns&gt;Reference equality.&lt;/returns&gt;&lt;br /&gt;        public static bool operator !=(RowPersonGet p1, RowPersonGet p2)&lt;br /&gt;        {&lt;br /&gt;            return !(p1.Equals(p2));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Determines whether the specified Object is equal to the current Object.&lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="obj"&gt;The Object to compare with the current Object.&lt;br /&gt;        /// &lt;returns&gt;true if the specified Object is equal to the current Object; otherwise, false.&lt;/returns&gt;&lt;br /&gt;        public override bool Equals(object obj)&lt;br /&gt;        {&lt;br /&gt;            return base.Equals(obj);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;It is recommended that any class that overrides Equals also override System.Object.GetHashCode.&lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;Returns a hash code, using a hashing algorithm that ignores the case of strings.&lt;/returns&gt;&lt;br /&gt;        public override int GetHashCode()&lt;br /&gt;        {&lt;br /&gt;            return base.GetHashCode();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;Overriding existing methods in order to add extra features.&lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;Returns a string representation of this struct.&lt;/returns&gt;&lt;br /&gt;        public override string ToString()&lt;br /&gt;        {&lt;br /&gt;            return base.ToString();&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;/datetime&gt;&lt;/datetime&gt;&lt;/rowpersonget&gt;&lt;/datetime&gt;&lt;/rowpersonget&gt;&lt;/rowpersonget&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-4453746687804353550?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/4453746687804353550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=4453746687804353550' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4453746687804353550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/4453746687804353550'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/09/stablegen.html' title='StableGen'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JHcNniNYPXo/RvpKZjo-BmI/AAAAAAAAACk/9E9zjRPukbI/s72-c/StableGen9.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-8245584669575898651</id><published>2007-08-24T18:46:00.000+08:00</published><updated>2007-08-24T21:11:06.331+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Surface'/><title type='text'>Microsoft Surface Computing</title><content type='html'>Microsoft Surface represents a fundamental change in the way we interact with digital content.&lt;br /&gt;&lt;br /&gt;With Surface, we can actually grab data with our hands, and move information between objects with natural gestures and touch.&lt;br /&gt;&lt;br /&gt;Surface features a 30-inch tabletop display whose unique abilities allow for several people to work independently or simultaneously. All without using a mouse or a keyboard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;a href="http://www.microsoft.com/surface" target="_blank"&gt;more&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://arstechnica.com/news.ars/post/20070530-what-lurks-below-microsofts-surface-a-qa-with-microsoft.html" target="_blank"&gt; What lurks below Microsoft's Surface? A brief Q&amp;A with Microsoft&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/Rs66nN-TRCI/AAAAAAAAABU/ouENUMT3AcY/s1600-h/mssurfacecom.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_JHcNniNYPXo/Rs66nN-TRCI/AAAAAAAAABU/ouENUMT3AcY/s320/mssurfacecom.jpg" alt="" id="BLOGGER_PHOTO_ID_5102220610785985570" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/Rs66wN-TRDI/AAAAAAAAABc/fMGXlRN53T0/s1600-h/mssurfacecomp1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_JHcNniNYPXo/Rs66wN-TRDI/AAAAAAAAABc/fMGXlRN53T0/s320/mssurfacecomp1.jpg" alt="" id="BLOGGER_PHOTO_ID_5102220765404808242" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-8245584669575898651?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/8245584669575898651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=8245584669575898651' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8245584669575898651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8245584669575898651'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/microsoft-surface-computing.html' title='Microsoft Surface Computing'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JHcNniNYPXo/Rs66nN-TRCI/AAAAAAAAABU/ouENUMT3AcY/s72-c/mssurfacecom.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-8159480933305787402</id><published>2007-08-17T20:14:00.000+08:00</published><updated>2007-08-17T20:38:14.614+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PerfectApp'/><title type='text'>Designing Object Models</title><content type='html'>&lt;div style="text-align: justify;"&gt;"Designing a custom object model can be a tricky business. If you dive in and start coding right away, you may find yourself realizing in the middle of your development process that your design is less than ideal. It pays to take some time to think through an object model, and even draw diagrams and make notes by hand. You may also want to study other object models to understand how they were constructed. When you design an object model, you are taking abstract processes and imposing concrete relationships upon them. In essence, you are creating artificial conceptual divisions for your code." &lt;a href="http://msdn2.microsoft.com/en-us/library/aa140813%28office.10%29.aspx"&gt;MSDN Article&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JHcNniNYPXo/RsWUut-TRBI/AAAAAAAAAAs/fsk_FdAIAII/s1600-h/0521540186.01.MZZZZZZZ.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_JHcNniNYPXo/RsWUut-TRBI/AAAAAAAAAAs/fsk_FdAIAII/s320/0521540186.01.MZZZZZZZ.jpg" alt="" id="BLOGGER_PHOTO_ID_5099645683402753042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt; &lt;span style=";font-family:verdana;font-size:100%;"  &gt;A common problem that I run into again and again is the idea that a data model should drive the development of your objects.&lt;span style=""&gt;  &lt;/span&gt;This idea comes in two flavors: your physical data schema should drive the development of your objects and that a conceptual/logical data model should be (almost) completely developed up front before you begin to design your objects.&lt;span style=""&gt;  &lt;/span&gt;Both of these views are inappropriate for non-agile projects and clearly wrong for agile projects.&lt;span style=""&gt;  &lt;/span&gt;Let’s explore this issue in more depth.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p  style="text-align: justify;font-family:verdana;" class="BT"&gt;&lt;span style="font-size:100%;"&gt;Why do people want to base their object models on existing data schemas?&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;First, there is very likely a desire to reuse the existing thinking that went behind the current schema.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;I’m a firm believer in reusing things, but I prefer to reuse the right things.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;There is an &lt;a href="http://www.agiledata.org/essays/impedanceMismatch.html"&gt;impedance mismatch&lt;/a&gt; between the object and relational paradigms, and this mismatch leads object and data practitioners to different designs.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;You also saw in &lt;a href="http://www.agiledata.org/essays/objectOrientation101.html"&gt;Object Orientation 101&lt;/a&gt; that object developers apply different design techniques and concepts than the techniques and concepts described in &lt;a href="http://www.agiledata.org/essays/dataModeling101.html"&gt;Data Modeling 101&lt;/a&gt; that data modelers apply.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Second, the database owner seeks to maintain or even enhance their political standing within your organization by forcing you to base your application on their existing design.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Third, the people asking you to take this approach may not understand the implications of this decision, or that there are better ways to proceed.&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt; Why is basing your object model on an existing data schema a bad idea?  First, your &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.agiledata.org/essays/legacyDatabases.html"&gt;legacy database design&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; likely has some significant problems.  In practice, I look at existing physical data models to get an idea of what is currently going on, and to get a feel for the technical constraints that I’ll have to work with, but I won’t unnaturally constrain my application with a bad data design.  Second, even if the existing database design is very good there can be significant differences in the way that you map objects to relational databases. &lt;a href="http://www.agiledata.org/essays/drivingForces.html"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Complete Article&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Why is basing your object model on a conceptual or logical data model a bad idea?  Actually, it’s not such a bad idea, as long as you’re taking an iterative and incremental approach, the real problem is the big design up front (BDUF) approach that many data professionals seem to prefer.&lt;/span&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/4773008052255971421-8159480933305787402?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/8159480933305787402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=8159480933305787402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8159480933305787402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/8159480933305787402'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/designing-object-models.html' title='Designing Object Models'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JHcNniNYPXo/RsWUut-TRBI/AAAAAAAAAAs/fsk_FdAIAII/s72-c/0521540186.01.MZZZZZZZ.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-7267393226587340254</id><published>2007-08-16T21:23:00.000+08:00</published><updated>2007-08-16T21:26:12.941+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OZ'/><title type='text'>The great trek.</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-ZA"&gt;For a while now my wife and I have been considering immigrating. We decided that if we are going to do it, we want to do it before my eldest child goes to school. Well that would be next year, so the time has come to make a decision. We have always loved &lt;st1:country-region st="on"&gt;&lt;st1:place st="on"&gt;South Africa&lt;/st1:place&gt;&lt;/st1:country-region&gt; and would really have “…sterwe vir jou Suid-Afrka” ~ “…died for our country”. But I’m not willing to die for nothing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-ZA"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;But like many South Africans, we feel this is no longer our country, towns and streets have different names, crime is out of control, and the future looks bleak for us. For a long time now, I have felt like a foreigner in my own country, or maybe orphan is more apt? So, we are not immigrating, we are finding ourselves a home, with a family that wants us.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-ZA"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;So we have decided to move to &lt;st1:country-region st="on"&gt;&lt;st1:place st="on"&gt;Australia&lt;/st1:place&gt;&lt;/st1:country-region&gt;, as this seems to be the family/home that is the closest to what we need to live in peace and happiness. Having some friends in &lt;st1:city st="on"&gt;&lt;st1:place st="on"&gt;Melbourne&lt;/st1:place&gt;&lt;/st1:city&gt;, that is where we are off to. I will keep you informed of our life changing journey here. (Will keep you posted.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-7267393226587340254?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/7267393226587340254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=7267393226587340254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7267393226587340254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/7267393226587340254'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/great-trek.html' title='The great trek.'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-1210468006698438498</id><published>2007-08-15T19:48:00.000+08:00</published><updated>2007-08-16T15:13:13.211+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CV'/><title type='text'>History</title><content type='html'>&lt;h1&gt;Curriculum Vitae&lt;/h1&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Biographical Information&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First Name(s):&lt;/span&gt;                                                       Petrus Dana&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Surname:&lt;/span&gt;                                                                  Beck&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Initials: &lt;/span&gt; PD   &lt;span style="font-weight: bold;"&gt;Title:&lt;/span&gt;    Mr&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Known as:&lt;/span&gt;  Dana&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Email Address:&lt;/span&gt; danabek(a)gmail.com&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gender:&lt;/span&gt;  Male   &lt;span style="font-weight: bold;"&gt;Marital Status:&lt;/span&gt; Married&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Date of Birth:  &lt;/span&gt;7 May 1974  &lt;span style="font-weight: bold;"&gt;Nationality: &lt;/span&gt; South African&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Current Location:&lt;/span&gt; Cape Town&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;About myself:&lt;/span&gt;&lt;br /&gt;I’m a highly motivated person, who likes to do things the right way. I like solving problem and find great joy in doing something that “can’t be done”. My feeling about technology is, give me the right book and yes I can do that. I want to start studying for a degree next year and am in the process of selecting which course I should take. I’d like to work for a company that encourages its employees to study.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;A sentence that describes me.&lt;/span&gt;&lt;br /&gt;A day that you have learned nothing new is a day wasted.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hobbies:&lt;/span&gt;&lt;br /&gt;Computer game development, Hiking and Karate/Kick boxing.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Proficiencies&lt;/span&gt;&lt;br /&gt;Please see attached skills matrix.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References&lt;/span&gt;&lt;br /&gt;Myburgh du Plessis (IT Manager)  – Balltron&lt;br /&gt;Contact 09:00 to 16:00 on cell: ********&lt;br /&gt;&lt;br /&gt;Schalk Lubbe (Senior Architect) – Sanlam&lt;br /&gt;Contact 09:00 to 16:00 on cell : ********&lt;br /&gt;&lt;br /&gt;Malcolm Jack (Analyst Developer) – Sanlam&lt;br /&gt;Contact 09:00 to 16:00 on cell : **********&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Education&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Detailed Description:&lt;/span&gt;   Institution and Date:&lt;br /&gt;Matric      Eben Donges, 1992&lt;br /&gt;MCSE      Old Mutual, 1997 (expired)&lt;br /&gt;MCSD      Old Mutual, 1997 (expired)&lt;br /&gt;OOA &amp; OOD using UML   Software Futures, 2005&lt;br /&gt;Ms.Net Applications for Windows (2555A) Sanlam, 2005&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The last 10 Books I have read:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Title        Author&lt;/span&gt;&lt;br /&gt;Patterns of Enterprise Application Architecture  Martin Fowler&lt;br /&gt;Programming C# (4th Edition)    Jesse Liberty&lt;br /&gt;Programming MS DirectShow for Digital Video &amp; TV Mark D. Pesce&lt;br /&gt;HTML &amp;amp; XHTML (The Definitive Guide)   Chuck Musciano &amp; Bill K&lt;br /&gt;JavaScript Bible (4th Edition)     Danny Goodman&lt;br /&gt;UML Distilled (2nd Edition)     Booch, Jacobson, Rumbaugh&lt;br /&gt;Amazon.com Get Big Fast     Robert Spector&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MCSD&lt;/span&gt;&lt;br /&gt;Analyzing Requirements and Defining MS.Net Solutions Architectures (70-300)&lt;br /&gt;Developing Web Applications with MS VB.NET and MS C#.NET (70-315)&lt;br /&gt;Developing Windows-Based Applications with VB.NET &amp; MS C#.NET (70-316)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Work History&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Senior Developer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Balltron&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Financial&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  Feb 2006  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; Current&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Redesign all the current systems, using OO techniques and agile methodologies, documenting design in UML (VISIO), implementing design in C# .NET 2.0 and managing, logging and handling all support issues, mentoring and training junior developers.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Company downsized.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Analyst developer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Sanlam&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Insurance&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  Jun 2003  End Date: Jan 2006&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Do analysis and help redesign current VB6/SQL back-office applications into n-Tier, Object Oriented and distributed systems, (Web services) while maintaining the current VB6/SQL system. A big focus has been given to performance / multi-threading and the proper use of XML.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Contract came to an end.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Analyst developer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Sanlam&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Insurance&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  Jun 2002  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; Jun 2003&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;Job Description: Helped develop an Intranet system for Sanlam, using VB.NET, ASP.NET and JScript, while maintaining the current VB6, SQL and ASP applications.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Intranet project completed and moved on to the next project.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Analyst developer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Sanlam&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Insurance&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  Jun 2001  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; Jun 2002&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Helped develop a web based application with a Mainframe backend for managing sales leads. (COBOL and DB2)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Project completed.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Senior Developer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; IExchange&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:  &lt;/span&gt;Software Development. (Product development)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  Feb 2001  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; May 2001&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Web front-end (JScript) and Install Shield development.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Company went bankrupt.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Software Engineer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Naspers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Online Publishing&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  April 1998  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; Feb 2001&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; I was one of the developers involved in the News24 web development. I ran a couple of projects as project lead and lead developer. I was sent to Holland at the end of 1999 to evaluate a new software product that the company wanted to purchase. Did extensive R&amp;D work on WAP. Most of the work done was in ASP, SQL, JScript and HTML.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Wanted a permanent position as my first child was about to be born. Nasper could not offer me one at that time.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Software Engineer&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; MicroSys&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Internet/E-Commerce&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  March 1996  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; April 1998&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Client services application developer in Delphi. Mostly contract work for Old Mutual.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; Company had financial problems.&lt;br /&gt;__________________________________&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Title:&lt;/span&gt;  Senior Developer/ Project leader&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employer Name:&lt;/span&gt; Old Mutual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Industry:&lt;/span&gt;  Insurance&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Start Date:&lt;/span&gt;  June 1993  &lt;span style="font-weight: bold;"&gt;End Date:&lt;/span&gt; March 1996&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is current Job:&lt;/span&gt; No&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Description:&lt;/span&gt; Network administrator, Junior Developer, Developer, Senior Developer, Lead Developer and Project Leader. I started out at Old Mutual and worked my way up. OM had a very nice culture at that time and I learned a lot while I was there. (PS must say Project Leader position was because of attrition, I was the most senior person in that department at the time.)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reasons for leaving:&lt;/span&gt; OM started outsourcing its development to MicroSys.&lt;br /&gt;__________________________________&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-1210468006698438498?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1210468006698438498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/1210468006698438498'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/history.html' title='History'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-121762682291871533</id><published>2007-08-14T20:20:00.001+08:00</published><updated>2009-01-13T09:53:26.971+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB'/><category scheme='http://www.blogger.com/atom/ns#' term='PerfectApp'/><category scheme='http://www.blogger.com/atom/ns#' term='Junction'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='Linking'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Database design</title><content type='html'>Ok we need a real business problem to solve. Something simple, but that allows enough scope to not be simplistic. A recipe application, which stores nutritional information, user preferences and allergies, will do.&lt;br /&gt;&lt;br /&gt;Ok here is my first stab at the database design, it is still incomplete but at a point where we can start having a meaningful discussion about it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JHcNniNYPXo/RsGgVIQ83BI/AAAAAAAAAAk/UK5zERnHua0/s1600-h/DB+Diagram.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_JHcNniNYPXo/RsGgVIQ83BI/AAAAAAAAAAk/UK5zERnHua0/s320/DB+Diagram.JPG" alt="" id="BLOGGER_PHOTO_ID_5098532538016390162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Naming conventions: &lt;/span&gt;I feel that naming conventions are a good thing and when not overly implemented is very helpful. The naming convention that I use, is very simple and strait forward.&lt;br /&gt;“t_” = a table containing data&lt;br /&gt;“l_” = a table containing static data that would be needed in production. (e.g. Lookup tables )&lt;br /&gt;“j_” = a table contain relationship data. (I believe that this design is the most flexible and allows for future changes to be implemented, with minimal impact.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;LastModifiedBy, LastUpdates, Deleted:&lt;/span&gt; These columns are implemented only on tables that need auditing and/or consistency checking.&lt;br /&gt;&lt;br /&gt;Please review the design and comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-121762682291871533?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/121762682291871533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=121762682291871533' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/121762682291871533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/121762682291871533'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/database-design.html' title='Database design'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JHcNniNYPXo/RsGgVIQ83BI/AAAAAAAAAAk/UK5zERnHua0/s72-c/DB+Diagram.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4773008052255971421.post-646743948496170180</id><published>2007-08-14T16:36:00.001+08:00</published><updated>2007-08-17T20:08:37.586+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PerfectApp'/><title type='text'>"Perfect App"</title><content type='html'>I’ve been in IT for almost 13 years now, and know that there are many ways to skin a cat. I’ve worked for 4 major corporate companies and each had a distinctive way of implementing the same standards and SDLC principals.&lt;br /&gt;&lt;br /&gt;I have decided to take the best I have learned, &lt;span style="font-style: italic;"&gt;and will learn&lt;/span&gt;, and combine it into a “Perfect App”. The idea behind this is that each time I learn something new, or even just a better way of doing something, I would re-factor my “Perfect App”.&lt;br /&gt;&lt;br /&gt;To limit the scope to something realistic, the app would at least have to implement the 3 layers of n tier development, access a SQL database, have an ASP.Net front-end and expose some of it functionality via a web service. I will be using UML to document the design.&lt;br /&gt;&lt;br /&gt;To make things a little more interesting, and to learn the latest new technologies, I also would like to use AJAX, Silverlight, XAML, WPF &amp;amp; WCF, to name a few. I’m planning on getting myself an &lt;a href="http://www.pmptoday.com/2007/08/03/3g-meizu-m8-for-q2-2008-25-this-year/" target="_blank"&gt;M8 MiniOne&lt;/a&gt; when it becomes available (&lt;a href="http://en.meizu.com/userforum/forum_posts.asp?TID=1241"&gt;Meizu MiniOne M8&lt;/a&gt;), so a Windows Mobile 6 front-end is also on the wish list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4773008052255971421-646743948496170180?l=redcango.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://redcango.blogspot.com/feeds/646743948496170180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4773008052255971421&amp;postID=646743948496170180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/646743948496170180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4773008052255971421/posts/default/646743948496170180'/><link rel='alternate' type='text/html' href='http://redcango.blogspot.com/2007/08/test.html' title='&quot;Perfect App&quot;'/><author><name>RedCango</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_JHcNniNYPXo/TDpT3PUGkbI/AAAAAAAAAF0/esep76Ow1Jo/S220/avatar-dana.jpg'/></author><thr:total>0</thr:total></entry></feed>
