<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>/bill's House O Insomnia&lt;img src="http://www.williamgryan.com/images/originalcuckoo.jpg" alt="Bill Ryan" /&gt; : .NET General</title><link>http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx</link><description>Tags: .NET General</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>WF Persistence - Where [DataContract] != [Serializable]</title><link>http://msmvps.com/blogs/williamryan/archive/2008/11/01/wf-persistence-where-datacontract-serializable.aspx</link><pubDate>Sat, 01 Nov 2008 07:27:07 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652742</guid><dc:creator>William</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1652742</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1652742</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2008/11/01/wf-persistence-where-datacontract-serializable.aspx#comments</comments><description>&lt;p&gt;Let&amp;#39;s say you were using Workflow Foundation (WF) and Windows Communication Foundation (WCF). Assume you wanted to use WF&amp;#39;s Persistence mechanism (which requires types to be &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;Serializable&lt;/a&gt;). And assume that all the objects you were using in the workflow were decorated with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;[DataContract]&lt;/a&gt; attribute.&amp;nbsp; Would you expect any problems related to Serialization?&amp;nbsp; &lt;em&gt;(I can but to the chase really quickly here if you don&amp;#39;t want my belabored background information and explanation. If you&amp;#39;re creating a type to use w/ Workflow Foundation that will be saved via the Workflow Foundation Persistence Service which makes use of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.sqlworkflowpersistenceservice.aspx"&gt;SqlWorkflowPersistenceService&lt;/a&gt; class, marking the class as a &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;[DataContract]&lt;/a&gt; alone will not work for WF&amp;#39;s persistence mechanism. It does make the class &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;serializable&lt;/a&gt; in a literal sense and will suffice [provided you meet the other requirements of a &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;[DataContract]&lt;/a&gt;  for WCF&amp;#39;s serialization needs, but it is insufficient for WF (see the References section at the end of this post for more details on WF Serialization) - so make sure you use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;Serializable&lt;/a&gt; attribute on any type that&amp;#39;ll be consumed by the Persistence Service).&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;MSDN describes the &lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;&lt;strong&gt;DataContract class&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; the following way:&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p align="left"&gt;&lt;em&gt; Specifies that the type defines or implements a data contract and is serializable by a serializer, such as&amp;nbsp;&amp;nbsp; the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx"&gt;&lt;em&gt;DataContractSerializer&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. To make their type &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;serializable&lt;/a&gt;, type authors must define a data contract for their type.&lt;/em&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;If you spend a lot of time in WCF, you&amp;#39;d likely assume that b/c types decorated with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;DataContract&lt;/a&gt; attribute would satisfy any requirement for the type to be &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;Serializable&lt;/a&gt;.&amp;nbsp; But you&amp;#39;d likely be wrong. Yes, a type that is a &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;[DataContract]&lt;/a&gt;&amp;nbsp; is serializable in the literal sense, but it&amp;#39;s serialized by the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx"&gt;DataContractSerializer&lt;/a&gt; (see the &lt;em&gt;References&lt;/em&gt; section at the end of this post for more details on WF Serialization) &lt;p&gt;So why is this an issue and what do you do about it?&amp;nbsp; Often, non-trivial workflows span an amount of time that exceeds any given user&amp;#39;s session.&amp;nbsp; In fact, it&amp;#39;s not uncommon for a non-trivial workflow to span as much as 30 days.&amp;nbsp; Using a simple example, let&amp;#39;s say that you are writing a Workflow to manage new employees.&amp;nbsp; Further assume that there are several document requirements and that any deficiencies would result in severe penalties or liability risks.&amp;nbsp; Just to make it clear, assume that each of the following must be procured before a new employee can start working.&amp;nbsp; Further, assume that b/c of fees associated with each, if any previous one fails, that the whole process terminates (if someone&amp;#39;s reference checks don&amp;#39;t pass, there&amp;#39;s no need to spend the money for a full background investigation as you know you&amp;#39;re not going to hire them). [Also, this isn&amp;#39;t a post on workplace hiring guidelines and is solely used for illustration - no need to point out why &amp;#39;its bad business to drug test or whatever else]. &lt;ol&gt; &lt;li&gt;Employment Application&lt;/li&gt; &lt;li&gt;Proof of Citizenship or ability to work in the U.S.&lt;/li&gt; &lt;li&gt;State withholding form&lt;/li&gt; &lt;li&gt;Federal withholding form&lt;/li&gt; &lt;li&gt;Reference check&lt;/li&gt; &lt;li&gt;License check&lt;/li&gt; &lt;li&gt;Completed Drug Screen&lt;/li&gt; &lt;li&gt;Full Background check&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Implementation policies will vary from company to company but assume that all of these tasks wouldn&amp;#39;t be completed within the user session that first created the entity. If you couldn&amp;#39;t persist the workflow somehow and come back to it later, it would be of very little use.&amp;nbsp;&amp;nbsp; Workflow foundation provides an out-of-the-box solution named not surprisingly -&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/ms735722(VS.85).aspx"&gt;Windows Workflow Persistence Service&lt;/a&gt; to help with long running workflows&lt;/p&gt; &lt;p&gt;Since Workflow Foundation is still in its infancy in terms of user adoption, many shops don&amp;#39;t have well established design rules in place specifically for Workflow items.&amp;nbsp; This can have some profound (although easily addressed in most cases) effects on Workflow development. It&amp;#39;s common for a workflow to start out small in terms of steps and happen relatively quickly.&amp;nbsp; When this is the case, there&amp;#39;s little need for a persistence mechanism for the workflow.&amp;nbsp; But as people get comfortable with WF and are willing to try more involved solutions, steps get added that often increase the time span the workflow could run to a point that&amp;#39;s longer than the user session.&amp;nbsp; For people new to WF, adding that first activity that&amp;#39;ll possibly span a large amount of time is the first time they actually think seriously about the persistence service. And that&amp;#39;s the point at which they often go back and try to retrofit things.&amp;nbsp; In many cases, the number of &amp;quot;things&amp;quot; will be fairly substantial so it&amp;#39;s quite easy to overlook something.&amp;nbsp; Once you implement the persistence service, you&amp;#39;ll typically go through the testing phase and make sure everything persist and can be retrieved correctly.&amp;nbsp; And this is the time serialization problems with show themselves - often in a manner that&amp;#39;s hard to isolate b/c the number of items involved.&amp;nbsp; &lt;/p&gt; &lt;p&gt; In some cases, if there&amp;#39;s a serialization problem, a fault will result.&amp;nbsp; &lt;a href="http://odetocode.com/Blogs/scott/archive/2007/01/24/9943.aspx"&gt;Unhandled faults&lt;/a&gt; in WF cause behavior that deviates from what you&amp;#39;d typically expect. So depending on your logging and tracing, you may or may not find the issue quickly. in many cases, you&amp;#39;ll find the fault is related to serialization and you&amp;#39;ll address it on the specific type, then go back and try to find every other type and make it &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;serializable&lt;/a&gt; as well.&amp;nbsp; This is likely to be overkill though - b/c you&amp;#39;re likely to have some types that aren&amp;#39;t involved in anything that&amp;#39;s persisted and consequently don&amp;#39;t require persistence.&amp;nbsp; So you try to only make the items that will be persisted &lt;a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute(VS.71).aspx"&gt;serializable&lt;/a&gt;. Until you get to the point where you&amp;#39;re addressing everything in the planning and design stages, you&amp;#39;re likely to run into situations like this and the only way out typically involves a lot of trial-and-error.&amp;nbsp; That&amp;#39;s why this post is relevant. If you go back and define each type that will be persisted as a &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx"&gt;[DataContract]&lt;/a&gt; , it&amp;#39;ll take you some time to do, may necessitate you adding new references to some projects and ultimately, after all that&amp;#39;s done, won&amp;#39;t fix the problem. The following type may work all day long when just dealing with WCF&amp;#39;s serialization requirements...&lt;/p&gt; &lt;p&gt;namespace Ger911.HCStandard.Core.Shared&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MatrixItem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String EntityName { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String ContactName { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Int32 BedCount { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String HospitalStatus { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime ModifiedDateTime { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;But unless you modify it like this, you&amp;#39;ll be in for some unpleasant surprises in WF:&lt;/p&gt; &lt;p&gt;namespace Ger911.HCStandard.Core.Shared&lt;br /&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Serializable]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MatrixItem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String EntityName { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String ContactName { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Int32 BedCount { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String HospitalStatus { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime ModifiedDateTime { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt; &lt;p&gt;References:&lt;/p&gt; &lt;p&gt;Using &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Red Gate&amp;#39;s Reflector&lt;/a&gt;, here&amp;#39;s what you&amp;#39;ll see under the hood of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.workflowpersistenceservice.aspx"&gt;WorkflowPesistenceService&lt;/a&gt; class&amp;#39;s &lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.workflowpersistenceservice.restorefromdefaultserializedform.aspx"&gt;RestoreFromDefaultSerializedForm&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.workflowpersistenceservice.getdefaultserializedform.aspx"&gt;GetDefaultSerializedForm&lt;/a&gt;.&amp;nbsp; For further insight into this, use &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/a&gt; and examine the &lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.sqlworkflowpersistenceservice.aspx"&gt;SqlWorkflowPersistenceService&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.workflowpersistenceservice.restorefromdefaultserializedform.aspx"&gt;RestoreFromDefaultSerializedForm&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;protected static Activity RestoreFromDefaultSerializedForm(byte[] activityBytes, Activity outerActivity)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Activity activity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime now = DateTime.Now;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream stream = new MemoryStream(activityBytes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream.Position = 0L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (GZipStream stream2 = new GZipStream(stream, CompressionMode.Decompress, true))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; activity = Activity.Load(stream2, outerActivity);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TimeSpan span = (TimeSpan)(DateTime.Now - now);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, &amp;quot;Deserialized a {0} to length {1}. Took {2}.&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new object[] { activity, stream.Length, span }); return activity;&lt;br /&gt; } &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.workflow.runtime.hosting.workflowpersistenceservice.getdefaultserializedform.aspx"&gt;GetDefaultSerializedForm&lt;/a&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;protected static byte[] GetDefaultSerializedForm(Activity activity)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime now = DateTime.Now;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (MemoryStream stream = new MemoryStream(0x2800))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream.Position = 0L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; activity.Save(stream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (MemoryStream stream2 = new MemoryStream((int)stream.Length))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (GZipStream stream3 = new GZipStream(stream2, CompressionMode.Compress, true))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream3.Write(stream.GetBuffer(), 0, (int)stream.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivityExecutionContextInfo info = (ActivityExecutionContextInfo)activity.GetValue(Activity.ActivityExecutionContextInfoProperty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TimeSpan span = (TimeSpan)(DateTime.Now - now);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, &amp;quot;Serialized a {0} with id {1} to length {2}. Took {3}.&amp;quot;, new object[] { info, info.ContextGuid, stream2.Length, span });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] array = stream2.GetBuffer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.Resize&amp;lt;byte&amp;gt;(ref array, Convert.ToInt32(stream2.Length));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return array;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx"&gt;&lt;font size="3"&gt;&lt;strong&gt;DataContractSerializer&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;public sealed class DataContractSerializer : XmlObjectSerializer&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Fields&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private IDataContractSurrogate dataContractSurrogate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool ignoreExtensionDataObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal Dictionary&amp;lt;XmlQualifiedName, DataContract&amp;gt; knownDataContracts;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ReadOnlyCollection&amp;lt;Type&amp;gt; knownTypeCollection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal IList&amp;lt;Type&amp;gt; knownTypeList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int maxItemsInObjectGraph;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool needsContractNsAtRoot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool preserveObjectReferences;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private DataContract rootContract;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private XmlDictionaryString rootName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private XmlDictionaryString rootNamespace;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Type rootType;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Methods&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, IEnumerable&amp;lt;Type&amp;gt; knownTypes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, string rootName, string rootNamespace);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, XmlDictionaryString rootName, XmlDictionaryString rootNamespace);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, string rootName, string rootNamespace, IEnumerable&amp;lt;Type&amp;gt; knownTypes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, XmlDictionaryString rootName, XmlDictionaryString rootNamespace, IEnumerable&amp;lt;Type&amp;gt; knownTypes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, IEnumerable&amp;lt;Type&amp;gt; knownTypes, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences, IDataContractSurrogate dataContractSurrogate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, string rootName, string rootNamespace, IEnumerable&amp;lt;Type&amp;gt; knownTypes, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences, IDataContractSurrogate dataContractSurrogate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContractSerializer(Type type, XmlDictionaryString rootName, XmlDictionaryString rootNamespace, IEnumerable&amp;lt;Type&amp;gt; knownTypes, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences, IDataContractSurrogate dataContractSurrogate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal static DataContract GetDataContract(DataContract declaredTypeContract, Type declaredType, Type objectType);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override Type GetDeserializeType();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override Type GetSerializeType(object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal static Type GetSurrogatedType(IDataContractSurrogate dataContractSurrogate, Type type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Initialize(Type type, IEnumerable&amp;lt;Type&amp;gt; knownTypes, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences, IDataContractSurrogate dataContractSurrogate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Initialize(Type type, XmlDictionaryString rootName, XmlDictionaryString rootNamespace, IEnumerable&amp;lt;Type&amp;gt; knownTypes, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences, IDataContractSurrogate dataContractSurrogate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override bool InternalIsStartObject(XmlReaderDelegator reader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override object InternalReadObject(XmlReaderDelegator xmlReader, bool verifyObjectName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override void InternalWriteEndObject(XmlWriterDelegator writer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override void InternalWriteObject(XmlWriterDelegator writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override void InternalWriteObjectContent(XmlWriterDelegator writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal override void InternalWriteStartObject(XmlWriterDelegator writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override bool IsStartObject(XmlDictionaryReader reader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override bool IsStartObject(XmlReader reader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override object ReadObject(XmlReader reader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override object ReadObject(XmlReader reader, bool verifyObjectName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal static object SurrogateToDataContractType(IDataContractSurrogate dataContractSurrogate, object oldObj, Type surrogatedDeclaredType, ref Type objType);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteEndObject(XmlDictionaryWriter writer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteEndObject(XmlWriter writer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteObject(XmlWriter writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteObjectContent(XmlDictionaryWriter writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteObjectContent(XmlWriter writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteStartObject(XmlDictionaryWriter writer, object graph);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void WriteStartObject(XmlWriter writer, object graph);  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IDataContractSurrogate DataContractSurrogate { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IgnoreExtensionDataObject { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal Dictionary&amp;lt;XmlQualifiedName, DataContract&amp;gt; KnownDataContracts { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ReadOnlyCollection&amp;lt;Type&amp;gt; KnownTypes { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int MaxItemsInObjectGraph { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool PreserveObjectReferences { get; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private DataContract RootContract { get; }&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1652742" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WIndows+Communication+Foundation/default.aspx">WIndows Communication Foundation</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx">.NET 3.0 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Workflow/default.aspx">Workflow</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx">.NET 3.5 Framework</category></item><item><title>Looking for some .NET Developers</title><link>http://msmvps.com/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx</link><pubDate>Sat, 07 Jun 2008 02:19:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1632527</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1632527</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1632527</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx#comments</comments><description>&lt;p&gt;A client of mine located in the Aiken/Columbia South Carolina Area has asked me if I had any friends who are .NET Developers and looking for a job. They are looking for at least one Junior Developer, on Mid-Level Developer and several Senior developers.&amp;nbsp; I know these folks quite well and I can vouch for the following:&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;They pay extremely well&lt;/li&gt; &lt;li&gt;Generous benefits package&lt;/li&gt; &lt;li&gt;There&amp;#39;s plenty of cool people on their staff&lt;/li&gt; &lt;li&gt;They are growing at an explosive rate so there&amp;#39;s plenty of room for upward mobility. There&amp;#39;s also a very strong focus on learning/teaching and career development.&lt;/li&gt; &lt;li&gt;They are an Agile/SCRUM shop&lt;/li&gt; &lt;li&gt;Currently developing with the following technologies:&lt;/li&gt; &lt;ul&gt; &lt;li&gt; Visual Studio Team System 2008 / .NET 3.5 Framework&lt;/li&gt; &lt;li&gt;Windows Communication Foundation&lt;/li&gt; &lt;li&gt;Windows Presentation Foundation&lt;/li&gt; &lt;li&gt;ASP.NET&lt;/li&gt; &lt;li&gt;LINQ&lt;/li&gt; &lt;li&gt;Silverlight&lt;/li&gt; &lt;li&gt;Windows Mobile 5/ Windows Mobile 6/ .NET Compact Framework&lt;/li&gt; &lt;li&gt;Sql Server 2005 / Sql Server 2008&lt;/li&gt; &lt;li&gt;Windows Installer for XML&lt;/li&gt; &lt;li&gt;Sandcastle&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;If you&amp;#39;re in the area and looking for a job... if you know someone who looking for a job.... or if you&amp;#39;re willing to move, please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&amp;nbsp; They are looking to hire folks immediately so I can probably get you an interview within a few days.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Junior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ideal candidate will be a recent college graduate with a Computer Science of MIS degree.&amp;nbsp; No experience is necessary for this position. The main soft-skill qualifications for this position are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A true love for development&lt;/li&gt; &lt;li&gt;Strong desire to learn&lt;/li&gt; &lt;li&gt;A desire to stand out among one&amp;#39;s peers&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; The hard-skill qualifications include a good theoretical understanding of at least two of the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Object Oriented Design and Analysis&lt;/li&gt; &lt;li&gt;Relational Database theory&lt;/li&gt; &lt;li&gt;Design Patterns&lt;/li&gt; &lt;li&gt;Familiarity with at least two of the following:&amp;nbsp; C, C++, Java, C#, VB.NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This is essentially a dream job for recent college grads b/c the job is being offered &amp;quot;no experience required&amp;quot;.&amp;nbsp; Since they are a SCRUM/Agile shop, you&amp;#39;ll get to work extensively with their Senior and Mid level devs via Pair Programming.&amp;nbsp;&amp;nbsp; You&amp;#39;ll be able to pick&amp;nbsp; an area to specialize in which you will decide on for yourself. Additionally, you&amp;#39;ll be using some of the most sought after Microsoft technologies available.&amp;nbsp; Go to Monster.com or Dice.com and see for yourself how much demand there is for the above technologies and how much those jobs pay.&amp;nbsp; You&amp;#39;ll get to work with these on day 1 and essentially carve out a path for yourself using whichever technologies you like the best.&amp;nbsp; If you want to be a &amp;quot;UI&amp;quot; expert, that&amp;#39;s where you&amp;#39;ll be put. If you want to be a Web Services dev, again, that&amp;#39;s what you can focus on.&amp;nbsp; If you want to be an expert buildmaster who specializes in installers, that&amp;#39;s what you&amp;#39;ll get to do.&amp;nbsp; The company is looking for some excellent candidates and willing to offer a really fun and great paying job with plenty of training and career development available.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mid-Level Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will have a computer science or MIS degree and 1-3 years of development experience.&amp;nbsp; The ideal candidate will have two or more the following abilities:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Solid command of OOP/OOD using C++, C#, Java or VB.NET&lt;/li&gt; &lt;li&gt;Test Driven Design&lt;/li&gt; &lt;li&gt;Service Oriented Architecture&lt;/li&gt; &lt;li&gt;Familiarity with MySql, Sql Server (T-SQL), Oracle (PL/SQL)&lt;/li&gt; &lt;li&gt;Basic understanding of both Winforms and ASP.NET&lt;/li&gt; &lt;li&gt;Basic familiarity with Web Services, MSMQ, Enterprise Services/COM+, .NET Remoting, DCOM, J2EE, Java Beans&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Just like the Junior development positions, these ones will provide a great deal of flexibility to learn and specialize the area of your choice.&amp;nbsp; These are considered &amp;#39;fast track&amp;#39; positions to move into the Senior Developer or Architect roles&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Senior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will be someone with at least 4 years experience.&amp;nbsp; This person will love challenges and love coming up with solutions to problems that other people run from.&amp;nbsp; They will be people that love figuring out how to do things that everyone else said can&amp;#39;t be done.&amp;nbsp; They will be the stereotypical Alpha-Geek, Someone that spends their spare time &lt;a href="http://newtechusa.com/csharp-dotnet-quiz.asp"&gt;answering quiz questions like these&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;All of the requirements for the Mid-Level Developer as well as several of the following skills:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Proficiency with T-Sql or PL/SQL.&amp;nbsp; You should be able to write a 5 table join on your own. You should have written several stored procedures that were &amp;gt; 100 lines long.&lt;/li&gt; &lt;li&gt;Strong command of query tuning and ability to easily spot design flaws&lt;/li&gt; &lt;li&gt;Ability to design &amp;#39;real&amp;#39; objects.&amp;nbsp; &lt;/li&gt; &lt;ul&gt; &lt;li&gt;Someone who pays meticulous attention to the scope modifiers of their classes/functions/properties&lt;/li&gt; &lt;li&gt;Someone who understands the problems associated with coupling and strives to avoid it.&lt;/li&gt; &lt;li&gt;Someone who can write and use events in their classes without thinking twice about it.&lt;/li&gt; &lt;li&gt;Someone with a solid understanding of thread safety and thread synchronization&lt;/li&gt; &lt;li&gt;Someone who is comfortable using several different design patterns&lt;/li&gt; &lt;li&gt;Someone who is comfortable implementing several different interfaces in one object, using combinations of interface implementation and inheritance and someone who can use inheritance responsibly&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Keeps up with technology, reads computer books regularly, has favorite blogs in multiple disciplines and/or blogs themselves, attends or speaks at user&amp;#39;s groups, is active in one or more online forum or newsgroup&lt;/li&gt; &lt;li&gt;Someone who answers &amp;quot;Which is better, C# or VB.NET?&amp;quot; with &amp;quot;Either can be better depending on the circumstances but I&amp;#39;m comfortable writing in either of them&amp;quot; and then &amp;quot;But I&amp;#39;ve been learning F# lately and it&amp;#39;s really been growing on me&amp;quot;&lt;/li&gt; &lt;li&gt;Experience with .NET Remoting, Web Services &amp;amp; Web Services Enhancements, MSMQ, Enterprise Services and/or WCF&lt;/li&gt; &lt;li&gt;Ability to create syntactically correct UML diagrams (meaning they can do more than write the letters &amp;quot;UML&amp;quot; on their resume) and if not, they are willing to learn to do this.&lt;/li&gt; &lt;li&gt;Understands data structures solidly and could easily implement their own HashTable or LinkedList &lt;/li&gt; &lt;li&gt;Someone who&amp;#39;s always looking to come up with a newer, cooler, faster, and more secure way to do implement something&lt;/li&gt; &lt;li&gt;Experienced with either Biztalk server or Sharepoint&lt;/li&gt; &lt;li&gt;Takes pride in their code without falling in love with it or getting all defensive about it.&amp;nbsp; Ability to acknowledge the fact that everyone makes mistakes and can talk about their mistakes/bugs without getting defensive.&lt;/li&gt; &lt;li&gt;Someone who is the first to raise their hand whenever the boss says &amp;quot;I need someone to learn ____________, do I have any volunteers&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;Basically, if you love development, love creating new cutting edge solutions all the while making a lot of money and having a lot of fun you definitely should talk to these folks.&amp;nbsp; If you&amp;#39;re interested...... Please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1632527" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx">Compact Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Web+Services+_2F00_+WSE/default.aspx">Web Services / WSE</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+Basics/default.aspx">.NET Basics</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Biztalk/default.aspx">Biztalk</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx">.NET 3.0 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WIX/default.aspx">WIX</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+Integration+Services/default.aspx">Sql Server Integration Services</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server/default.aspx">Sql Server</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+2008/default.aspx">Sql Server 2008</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sharepoint/default.aspx">Sharepoint</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+To+ADO.NET/default.aspx">LINQ To ADO.NET</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx">.NET 3.5 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+Training/default.aspx">LINQ Training</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/ADO.NET+3.5/default.aspx">ADO.NET 3.5</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/C_2300_+3.5/default.aspx">C# 3.5</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Windows+Mobile/default.aspx">Windows Mobile</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Job+Stuff/default.aspx">Job Stuff</category></item><item><title>Free Silverlight Training</title><link>http://msmvps.com/blogs/williamryan/archive/2007/08/14/free-silverlight-training.aspx</link><pubDate>Tue, 14 Aug 2007 19:53:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1111448</guid><dc:creator>William</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1111448</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1111448</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/08/14/free-silverlight-training.aspx#comments</comments><description>&lt;p&gt;My friend &lt;a href="http://msmvps.com/blogs/brianmadsen/default.aspx" target="_blank"&gt;Brian Madsen&lt;/a&gt;&amp;nbsp;who owns &lt;a href="http://www.csharpzealot.com" target="_blank"&gt;CSharpZealot&lt;/a&gt;&amp;nbsp;has teamed up with &lt;a href="http://www.innerworkings.com/promotions/664b06ea-357c-4730-8cb0-44376cceb865/csharpzealot-silverlight-promotion" target="_blank"&gt;InnerWorkings&lt;/a&gt; to extend a really slick offer for &lt;a href="http://msmvps.com/blogs/brianmadsen/archive/2007/08/14/innerworkings-steps-up-and-offers-free-silverlight-training-for-csharpzealot-com-members.aspx" target="_blank"&gt;Free Silverlight Training for CSharpZealot members&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In addition, &lt;a href="http://adoguy.com/" target="_blank"&gt;Shawn Wildermuth&lt;/a&gt;&amp;nbsp;has been way ahead of the crowd when it comes to &lt;a href="http://silverlight.net/Default.aspx" target="_blank"&gt;Silverlight&lt;/a&gt; and has just created two more &lt;a href="http://adoguy.com/2007/08/10/Two_new_Silverlight_Videos!.aspx" target="_blank"&gt;Silverlight Videos&lt;/a&gt;.&amp;nbsp; His &lt;a href="http://www.adoguy.com" target="_blank"&gt;ADO Guy site&lt;/a&gt;&amp;nbsp;has an entire &lt;a href="http://adoguy.com/silverlight/" target="_blank"&gt;Section dedicated to Silverlight&lt;/a&gt;&amp;nbsp;and well, Shawn is gifted in many areas but when it comes to teaching, no one does it better.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;On a similar note, my company recently sponsored an internal Silverlight contest where our different offices are competing to build the best game written in Silverlight.&amp;nbsp; They put there money where their mouth is so the first place prize is pretty impressive.&amp;nbsp; I&amp;#39;ve had my nose in the keyboard for the past few weeks trying to help my team win.&amp;nbsp; If you&amp;#39;re interested in learning &lt;a href="http://silverlight.net/" target="_blank"&gt;Silverlight&lt;/a&gt;, one great place to get started is &lt;a href="http://silverlight.net/GetStarted/" target="_blank"&gt;Here&lt;/a&gt;.&amp;nbsp; Microsoft really did the right thing with &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx" target="_blank"&gt;Orcas (VS 2008)&lt;/a&gt; and even provides ready to run (almost anyway) &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx" target="_blank"&gt;VPC images&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Hopefully when I get some time I can start doing some more in depth &lt;a href="http://www.silverlight.net/" target="_blank"&gt;Silverlight&lt;/a&gt; blogging but let me make a few recommendations.&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Use the VPC images for Orcas.&amp;nbsp; The reasons are the same for any other alpha or beta product you&amp;#39;d want to install but outside of isolation and reducing risk, the time factor is huge.&amp;nbsp; Using the VPC images, you can be up and running in under 5 minutes once you have them downloaded.&amp;nbsp;Benefits like this are really hard to quantify but I can tell you personally that at times, getting my environment set up without VPC images was frustrating to say the least.&lt;/li&gt; &lt;li&gt;Although it&amp;#39;s often prudent to learn to code things without all the crutches that a powerful IDE provide, creating Silverlight with Intellisense and a designer is probably not a very effective way to start things.&amp;nbsp; Unless you are really familiar with WPF already, the syntax takes a little getting used to and there&amp;#39;s a lot of room to mess things up with typos.&lt;/li&gt; &lt;li&gt;In addition to &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx" target="_blank"&gt;Orcas&lt;/a&gt;, make sure you pull down &lt;a href="http://www.microsoft.com/Expression/products/download.aspx?key=blend2preview" target="_blank"&gt;Expression Blend and Design&lt;/a&gt;.&amp;nbsp; Blend allows you to create Graphics with &lt;a href="http://www.xaml.net/" target="_blank"&gt;XAML&lt;/a&gt;.&amp;nbsp; I&amp;#39;ve already had a few &lt;a href="http://www.getpaint.net/" target="_blank"&gt;Paint.NET&lt;/a&gt; and &lt;a href="http://www.adobe.com/products/photoshop/index.html" target="_blank"&gt;Photoshop&lt;/a&gt; fanatics get all over me for plugging Blend, but I think they are off base. I&amp;#39;m not advocating replacing Photoshop or Paint.NET with Blend. Blend however, allows one to create images with XAML.&amp;nbsp; You in turn can look at the XAML that is generated and use it to help understand and learn XAML.&amp;nbsp; If you did much Office automation, you more than likely &amp;#39;cheated&amp;#39; in the sense that you just ran a macro and saw the code that was generated and used this as a mechanism to learn VBA and get past sticking points.&amp;nbsp; Blend allows you to do the same thing.&amp;nbsp; Sure, hardcore &amp;#39;real&amp;#39; developers do everything in Notepad but if you want to get up to speed, using a tool to help you draw the effects you want and then being able to disassemble the XAML that was generated will get you where you want to be a LOT faster.&lt;/li&gt; &lt;li&gt;Pull down each of the items in the &lt;a href="http://silverlight.net/community/communitygallery.aspx" target="_blank"&gt;Gallery&lt;/a&gt;&amp;nbsp;and work through the &lt;a href="http://silverlight.net/quickstarts/" target="_blank"&gt;QuickStarts&lt;/a&gt;.&amp;nbsp; These encompass many common kick a55 effects and you can reverse engineer them to see learn how to do quite a bit.&lt;/li&gt; &lt;li&gt;I have some pretty strong opinions on the books out there but even if a book doesn&amp;#39;t address Silverlight specifically (most of them however have updated versions which do include Silverlight), you can still learn quite a bit because you are ultimately going to need to really understand WPF and XAML.&amp;nbsp; I really want to gather my thoughts a little better before making any more book recommendations because although all of the WPF books out there are pretty good, some are a lot more helpful than others when it comes to learning Silverlight&lt;/li&gt; &lt;li&gt;Read Shawn Wildermuth&amp;#39;s &lt;a href="http://www.adoguy.com/silverlight" target="_blank"&gt;Silverlight posts&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Personally, since I&amp;#39;m not&amp;nbsp; a designer and very challenged when it comes to graphics, I had a pretty rough time at the beginning of my learning curve. Little by little though, I&amp;#39;m getting through it and hopefully I&amp;#39;ll have some blogworthy material to post soon. As always, if you have any specific questions, please let me know and I&amp;#39;ll be glad to answer what I can.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1111448" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Life+in+General/default.aspx">Life in General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+Basics/default.aspx">.NET Basics</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx">Me</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx">.NET 3.0 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WPF_2F00_E/default.aspx">WPF/E</category></item><item><title>Pro WCF: Practical Microsoft SOA Implementation</title><link>http://msmvps.com/blogs/williamryan/archive/2007/02/18/pro-wcf-practical-microsoft-soa-implementation.aspx</link><pubDate>Sun, 18 Feb 2007 23:41:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:595155</guid><dc:creator>William</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=595155</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=595155</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/02/18/pro-wcf-practical-microsoft-soa-implementation.aspx#comments</comments><description>&lt;P&gt;I went on&amp;nbsp; a book binge this week and have had my nose buried in WCF all week.&amp;nbsp; There's a lot of really good stuff out there, but without a doubt, &lt;A href="http://www.amazon.com/Pro-WCF-Practical-Microsoft-Implementation/dp/1590597028/sr=8-1/qid=1171842173/ref=pd_bbs_sr_1/102-7496017-5356110?ie=UTF8&amp;amp;s=books"&gt;Pro WCF: Practical Microsoft SOA Implementation&lt;/A&gt;&amp;nbsp;by &lt;A href="http://www.chrispeiris.com/"&gt;Chris Peiris&lt;/A&gt;&amp;nbsp;is probably my favorite.&lt;/P&gt;
&lt;P&gt;Overall, the book is just over 400 pages but the author says quite a bit in those 400 pages.&amp;nbsp; The coolest part is that they go over just about every topic that the MSDN Documentation is short on.&amp;nbsp; I found that a lot of things that I stumbled my way through were covered there as well.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I can't find the link, but a while ago, &lt;A href="http://www.brains-n-brawn.com/"&gt;KC&lt;/A&gt; had a post where his server program uploaded&amp;nbsp;itself&amp;nbsp;his web server and ran itself. His comment was something to the effect about "What did the first Blacksmith use".&amp;nbsp; I was always really impressed with that program. And not just b/c &lt;A href="http://www.brains-n-brawn.com/"&gt;of the lower cased one&lt;/A&gt;'s coding skill. The idea itself was really cool.&amp;nbsp; So when&amp;nbsp;&amp;nbsp;&lt;A href="http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx"&gt;WSE 3.0&lt;/A&gt; came out and &lt;A href="http://en.wikipedia.org/wiki/MTOM"&gt;MTOM&lt;/A&gt;&amp;nbsp; was implemented, I tried to bite his style and accomplish the same thing with MTOM. It's an easy port so it didn't take much skill on my part.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Anyway, I've been trying to figure out how to port most of the WSE 3.0 code from&amp;nbsp; my 70-529 book over to WCF. I've been able to do most of it, however it's been frustrating at times.&amp;nbsp; I'm make a lot of typos and copy/paste errors and neither play well with .config files.&amp;nbsp; After wasting about 3 hours trying to get the MTOM port to work, I read through this book and Viola'. I was kinda mad at myself for overcomplicating things that much.&amp;nbsp; So I guess I really like the book in large part b/c I've had quite a few similar experiences with it.&lt;/P&gt;
&lt;P&gt;My favorite chapters are discussed below:&lt;/P&gt;
&lt;P&gt;Chapter 4 - It discusses installation and configuration.&amp;nbsp; This is the single most frustrating area when learning WCF.&amp;nbsp; Writing code instead of using .config files is lame so I try to avoid it. But getting some help in avoiding common mistakes is priceless..&lt;/P&gt;
&lt;P&gt;Chatper 6 discusses managing WCF Services. Not a glamorous subject but being able to monitor and troubleshoot your programs is critical.&amp;nbsp; Moreover, when you're first learning how to do things, it's easy to ignore performance. It's easy to overlook things that can kill performance.&amp;nbsp; After reading this chapter, I am in a lot better shape to find problems&lt;/P&gt;
&lt;P&gt;Chaper 7 discusses security. Obviously a pretty big issue when you're building services.&amp;nbsp; Just for good measure there's some CardSpace stuff at the end which was a nice touch.&lt;/P&gt;
&lt;P&gt;Chapter 9 discusses transactions. For obvious reasons, this is a subject you need to learn well and although I thought I was pretty familiar with them, I learned more than a few things from this chapter.&lt;/P&gt;
&lt;P&gt;-------------------&lt;/P&gt;
&lt;P&gt;All in all, this book was pretty impressive.&amp;nbsp; They do mostly real world stuff and while they certainly talk theory, they stick to stuff that you'll encounter in your day to day development.&amp;nbsp; You can only take so much theory and I've found that the documentation on MSDN is really heavy on theory and not enough implementation.&amp;nbsp; This book will bridge that gap. &lt;A href="http://www.amazon.com/Professional-WCF-Programming-Development-Communication/dp/0470089849/sr=1-1/qid=1171843376/ref=sr_1_1/102-7496017-5356110?ie=UTF8&amp;amp;s=books"&gt;Scott Klein's WCF book&lt;/A&gt;&amp;nbsp;will help quite a bit too but won't be out for another month or two. &lt;/P&gt;
&lt;P&gt;I also picked up &lt;A href="http://www.amazon.com/Microsoft-Windows-Communication-Foundation-Developer/dp/0735623368/sr=1-1/qid=1171843548/ref=sr_1_1/102-7496017-5356110?ie=UTF8&amp;amp;s=books"&gt;John Sharp's Microsoft Windows Communication Foundation &lt;EM&gt;Step by Step&lt;/EM&gt;&lt;/A&gt;.&amp;nbsp; So far, my impressions are quite favorable although I haven't went through it in quite the detail I did with this one.&amp;nbsp; I worked through each of the examples and found them pretty cool.&amp;nbsp; Should have a review of it up shortly.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=595155" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WIndows+Communication+Foundation/default.aspx">WIndows Communication Foundation</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx">.NET 3.0 Framework</category></item><item><title>Leviton, Microsoft's Z-Wave/Windows Solutions</title><link>http://msmvps.com/blogs/williamryan/archive/2007/01/28/leviton-microsoft-s-z-wave-windows-solutions.aspx</link><pubDate>Sun, 28 Jan 2007 22:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:525863</guid><dc:creator>William</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=525863</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=525863</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/01/28/leviton-microsoft-s-z-wave-windows-solutions.aspx#comments</comments><description>&lt;P&gt;This is &lt;A href="http://www.cepro.com/products/press/17506.html"&gt;very very cool.&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=525863" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/News/default.aspx">News</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx">Compact Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx">Mindless Babbling</category></item><item><title>Comment of the week - Sql Server Reporting Services vs. Crystal</title><link>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Comment-of-the-week-_2D00_-Sql-Server-Reporting-Services-vs.-Crystal.aspx</link><pubDate>Wed, 27 Sep 2006 05:27:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:142621</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=142621</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=142621</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Comment-of-the-week-_2D00_-Sql-Server-Reporting-Services-vs.-Crystal.aspx#comments</comments><description>&lt;p&gt;A while ago, I posted &lt;a href="http://msmvps.com/blogs/williamryan/archive/2004/11/07/18148.aspx?CommentPosted=true#commentmessage"&gt;this&lt;/a&gt;&amp;nbsp;about how much a55 I think Crystal Reports sucks.&amp;nbsp; A long time ago, back at like v.7, I thought Crystal was a decent product.&amp;nbsp; And to be honest, it still is a decent product.&amp;nbsp; But it comes with a lot of baggage and has a lot that just makes it lame.&amp;nbsp; So I had almost total consenus on the Crystal Reports w/ .NET sucks side, I think there are two people that disagree.&amp;nbsp;Ignoring the fact that SSRS is very new product and Crystal has been around forever, I think side by side it&amp;#39;s a slam dunk.&amp;nbsp; But one big mouth said this: (NOTE:&amp;nbsp; I&amp;#39;m only posting a comment that was publicly posted on my site.&amp;nbsp; So hopefully the guy won&amp;#39;t be a &lt;a href="http://www.charlescarroll.com"&gt;cry baby&lt;/a&gt; about it and throw a temper tantrum over it)&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;quot;Either you guys are idiots or you have never used Crystal and don&amp;#39;t realize the minimal functionality that SQL Reporting Services offers. I have spent the last week evaluating SSRS and am greatly dissapointed. I came up with a list of over 250 items that SSRS could not do. As for all you Access reporters, your probably the only people to ever purchase Microsoft&amp;#39;s &amp;quot;Bob&amp;quot; product. &amp;quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;So the guy claims to know enough about Crystal to have cataloged over 250 features that SSRS doesn&amp;#39;t have.&amp;nbsp; That means that including the features he&amp;#39;ll admit it does have, he knows way more than 250 features.&amp;nbsp; I think that would qualify you as a fairly advanced Crystal user if you&amp;#39;ll pardon the oxymoron.&amp;nbsp; And he spent one week with SSRS.&amp;nbsp; And the only conclusion he can draw is that SSRS is definitely lacking those features and that it couldn&amp;#39;t possibly be that he just doesn&amp;#39;t know how to use them, right?&amp;nbsp; And far be it from me to say anything positive about Access, but come on, being a hard core Crystal user still means you&amp;#39;re the report ***, and that gives you credentials to snob no one. Certainly not Access developers&amp;nbsp;and certainly not Bob users.&amp;nbsp; Is he really claiming Bob was lame but Crystal Reports isn&amp;#39;t?&amp;nbsp; Pulllleeezz.&amp;nbsp; But if you read the context of the comments, the people were pointing out that Access, as lame as it is, provides more effective funcionality.&amp;nbsp; The fact this can even be debated speaks volumes don&amp;#39;t you think?&amp;nbsp; Is Access supposed to be first and foremost a report writer?&amp;nbsp; Last time I looked it&amp;#39;s main purpose was as a relational database (more precisely, a database that anyone can build with, that causes major headaches for the people that will inevitably be brought in to clean up the mess it made) not a report writer.&amp;nbsp; Reports are one of its features but one would certainly expect that a mature product who&amp;#39;s sole purpose is report writing ought to be a little better than a RDBMS product with reports added in.&lt;/p&gt;&lt;p&gt;So I offered a challenge, I asked him to post just 20 of his 250 features that CR can do that SSRS can&amp;#39;t.&amp;nbsp; I&amp;#39;ll see if they really can&amp;#39;t be done and post the results. If I&amp;#39;m wrong, I&amp;#39;ll admit it.&amp;nbsp; If he&amp;#39;s wrong I&amp;#39;ll point out what an a33hat he is.&amp;nbsp; I actually believe there are probably 20 or so features missing, but certainly not major ones.&amp;nbsp; Even assuming there were really 250 features missing, how many times do you need 250 features for a report?&amp;nbsp; Typically you need Grouping, Subreporting, charts/graphs, conditional formatting, functions and the like. He didn&amp;#39;t comment as to his evaluation of how each stacked up there - for reasons that are obvious.&amp;nbsp; Anyway, I believe his 250+ number about as much as I believe in the easter bunny so although *someone* could probably post 20 things lacking, I doubt he can.&amp;nbsp; One of us is very wrong here and hopefully it&amp;#39;s not me. We&amp;#39;ll have to wait and see.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=142621" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Humor/default.aspx">Humor</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx">Mindless Babbling</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category></item><item><title>Could not complete the operation due to error 80041001</title><link>http://msmvps.com/blogs/williamryan/archive/2006/07/06/103983.aspx</link><pubDate>Thu, 06 Jul 2006 05:34:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:103983</guid><dc:creator>William</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=103983</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=103983</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/07/06/103983.aspx#comments</comments><description>Just as an FYI about this... If you are using the documentation for WSE 3.0 and trying opening it after installing IE7 - you get an error with the following message "Could not complete the operation due to error 80041001" This is a total drag b/c all...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/07/06/103983.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=103983" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Web+Services+_2F00_+WSE/default.aspx">Web Services / WSE</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category></item><item><title>Do you have any ideas about preparation for 70-529?</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/28/102989.aspx</link><pubDate>Wed, 28 Jun 2006 02:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:102989</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=102989</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=102989</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/28/102989.aspx#comments</comments><description>As you may know, I'm coauthoring http://www.microsoft.com/learning/exams/70-529.asp . In particular, I'm covering the following objectives: Create and configure an XML Web service method. Create a public method. Attach the WebMethodAttribute attribute...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/28/102989.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=102989" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Web+Services+_2F00_+WSE/default.aspx">Web Services / WSE</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+Basics/default.aspx">.NET Basics</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Certification/default.aspx">Certification</category></item><item><title>I'll be speaking at Speech Server Days</title><link>http://msmvps.com/blogs/williamryan/archive/2006/04/19/91657.aspx</link><pubDate>Wed, 19 Apr 2006 12:33:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:91657</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=91657</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=91657</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/04/19/91657.aspx#comments</comments><description>&lt;FONT face=Verdana size=2&gt;I'll be speaking at &lt;A href="http://www.thomscontent.com/speech/"&gt;Two Speech Server Days Events&lt;/A&gt;&amp;nbsp;.&amp;nbsp; I have one presentation on May 3 in Atlanta and one in Ft. Lauderdale on June 2nd.&amp;nbsp; &lt;A href="http://gotspeech.net/blogs/marshallharrison/archive/2006/04/18/315.aspx"&gt;Marshall Harrison&lt;/A&gt;&amp;nbsp;is going to be speaking as well at the Ft. Lauderdale event, so finally I get to meet him. If you're going to be around and are interested in Speech Server, by all means stop by.&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=91657" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Speech+Server/default.aspx">Speech Server</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx">Me</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category></item><item><title>Regular Expression Recipes for Windows Developers: A Problem-Solution Approach (A Problem-Solution Approach)</title><link>http://msmvps.com/blogs/williamryan/archive/2006/04/16/91262.aspx</link><pubDate>Sun, 16 Apr 2006 18:52:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:91262</guid><dc:creator>William</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=91262</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=91262</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/04/16/91262.aspx#comments</comments><description>&lt;font face="Verdana"&gt;&lt;font size="2"&gt;My buddy &lt;a href="http://www.knowdotnet.com/briandavis.html"&gt; Brian Davis &lt;/a&gt;is probably one of the most kick a55 regex gurus I've ever come across. That's created a little bit of a problem b/c whenever I need a regex, even a really complex one, he can usually whip it up in his head faster than I can describe it to him.&amp;nbsp; At work, we do a tremendous amount of document processing and manipulation and Regex's have made all the difference there. Before my old boss, got there, we had about 15k lines of VBA Word Macro code to handle all of our processing. It was icky, error prone and a nightmare to maintain (any time anyone wants to reminisce about the good old days, whip out the Visual Basic Editor in Word and have them create a simple class library that does anything useful. That should shut them up pretty quickly) and since we were invoking it through .NET, it was comparatively slow.&amp;nbsp; I started playing with Regex's but I was still learning them and there was just too much code to replace (not to mention that if you screw anything up, it causes big problems immediately). Then Brian started and fixed everything.&amp;nbsp; Code is so much easier to deal with and maintain now and accuracy and speed have increased so much it's hard to even believe we used to do anything else.&amp;nbsp; But that also means that we have some pretty sophisticated Regex's.&amp;nbsp; Being the only person there that is any good at Regex's is a little dangerous b/c Brian's the only one that can work with many of the more complex ones.&lt;br&gt;&lt;br&gt;So for a while, I've decided to learn Regex's well once and for all. I get all gung ho for a few days and then get caught up in other things.&amp;nbsp; Anyway, I'm back in one of the "I really need to learn this stuff once and for all" phases. So I just picked up &lt;a href="http://www.amazon.com/gp/product/1590594975/sr=8-11/qid=1145212849/ref=sr_1_11/104-3086594-1801569?%5Fencoding=UTF8"&gt;Regular Expression Recipes for Windows Developers: A Problem-Solution Approach (A Problem-Solution Approach)&lt;/a&gt;&lt;br&gt;and man, it's awesome.&amp;nbsp; I bought Dan Appleman's &lt;a href="http://www.amazon.com/gp/product/B0000632ZU/qid=1145214141/sr=1-1/ref=sr_1_1/104-3086594-1801569?s=books&amp;amp;v=glance&amp;amp;n=551440"&gt;Regular Expressions with .NET&lt;/a&gt; a while ago and it was a great reference book.&amp;nbsp; And while I can't speak well enough of Dan's book, this one is basically just example after example with in depth explanations about what's being done and why.&amp;nbsp; So it's not really a reference book but it's so heavy with examples (damned good ones for that matter) and explanations that you can pretty much figure out just about anything after using it. I've spent about 6 hours with it and am already a lot more confident in working with Regex's. I think it's going to be a work in progress with this, just keep working through them and see what happens and why - but this may be one of the best investments I've made in a long time.&lt;br&gt;&lt;br&gt;It's true that in many places knowing Regex's may be little more than a luxury, but in my case, Text Parsing is everything b/c it's at the core of everything important we do at my company.&amp;nbsp; I've come across quite a few great books lately and this ranks up there with the best of the.&amp;nbsp; If you need to get up to speed with Regular Expressions in .NET, a copy of Dan's book and this one will almost certainly get you anywhere you need to go.&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=91262" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Coming out of hybernation</title><link>http://msmvps.com/blogs/williamryan/archive/2006/03/26/87801.aspx</link><pubDate>Sat, 25 Mar 2006 23:04:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:87801</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=87801</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=87801</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/03/26/87801.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Recently I took a blog hiatus.&amp;nbsp; The main reason (if anyone cares) is b/c I've been stretched thin on time.&amp;nbsp; I have three books I'm working on, was working on a side contract, started working as a Moderator on the &lt;A href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=45&amp;amp;siteid=1"&gt;.NET Framework Data Access and Storage&lt;/A&gt;&amp;nbsp;and a whole lot more.&amp;nbsp; I'm basically living in between two cities and trying to hold down a job in the third.&amp;nbsp; I have a 45 minute commute each day to and from work, and a two hour commute two and from Kim's house.&amp;nbsp; Yes, it's a little difficult.&amp;nbsp; Anyway, I'm going to share some of my secrets on getting things done, which, believe it or not, many will find immensley helpful.&amp;nbsp; As is the case with everything I do, it involves a lot of technology and obsessive compulsive behavior, but it's gotten me through a time period I never thought I was going to get through.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I was at the Barnes and Noble in Greenville today and was really stoked.&amp;nbsp; Four copies of my books were there.&amp;nbsp; &lt;A href="http://codebetter.com/blogs/sahil.malik/"&gt;Sahil's&lt;/A&gt; book was featured prominently and I'm honored to be mentioned in it.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Anyway, one of the first things I'd like to announce is ...&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;A href="http://www.microsoft.com/mspress/books/9469.asp" target=_blank&gt;MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework 2.0—Application Development Foundation &lt;/A&gt;.&amp;nbsp; Yep, that's me right next to &lt;A href="http://www.adoguy.com/"&gt;Shawn Wildermuth&lt;/A&gt;&amp;nbsp;which is in and of itself a true honor. I'm doing a few more which, is not only cool, but has taught me more than I'd have ever imagined.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;My Speech Server book is coming along and it's going to be pretty good.&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=87801" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx">Me</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx">Mindless Babbling</category></item><item><title>Seasons Changing</title><link>http://msmvps.com/blogs/williamryan/archive/2006/02/26/84877.aspx</link><pubDate>Sun, 26 Feb 2006 15:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:84877</guid><dc:creator>William</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=84877</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=84877</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/02/26/84877.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Today one of my &lt;A href="http://codemilitia.com/blogs/tobin.titus/default.aspx"&gt;Tobin Titus&lt;/A&gt;&amp;nbsp;is packing up for his move to Microsoft.&amp;nbsp; At the same time, another good buddy, &lt;A href="http://geekswithblogs.net/cwilliams/"&gt;Chris Williams&lt;/A&gt;&amp;nbsp;is moving to Greenville.&amp;nbsp; Although I live in Augusta, I spend most of my time here in Greenville.&amp;nbsp; &lt;A href="http://www.charlescarroll.com/"&gt;Chump Change&lt;/A&gt; , since I know you're reading this, please make good on some of your threats - I'm up here enough that you can't plausibly claim I'm hard to find.&amp;nbsp; Anyway, Chris is going to work at &lt;A href="http://www.tibasolutions.com/"&gt;Tiba Solutions&lt;/A&gt; and he'll be a great asset there.&amp;nbsp; Hopefully we'll be getting together later today to chat.&amp;nbsp; However I'm in both Greenville and Redmond so often, i'll be seeing a lot of both of them.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I realized I've neglected my blog for a while.&amp;nbsp; Well, it's because I've been working on a few top secret projects with Microsoft that are keeping me busy, coupled with some contract work with Mark Dunn and Eric Marvets, coupled with my day job, coupled with my Speech Server book, exacerbated by the fact I have been utterly unable to get broadband access at my crib which is about 40 minutes away from where I work.&amp;nbsp; When I get home I'm on dial-up and while it works in an emergency, it's about as fast as my GRPS connection running on my KJam.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Let me digress into writing since I've gotten some experience in it.&amp;nbsp; What do you think the hardest part of writing is?&amp;nbsp; Content?&amp;nbsp; Relevant examples?&amp;nbsp; Cool code ideas?&amp;nbsp; Well they all take some work to do correctly, but I'd have to say the most difficult/frustrating part is dealing with Formatting and Screen Caps in particular.&amp;nbsp; One one project, I had 20 some Screen caps. I had&amp;nbsp; to redo all of them.&amp;nbsp; Each publisher has different formats and I'm not enough of a graphics guy to really understand the nuances.&amp;nbsp; But I sh1t you not, getting screen caps and formatting correct can be about the hardest part of writing. (Well, depending on who the publisher is, getting paid and reimbursed may be the hardest part, but that's not the case with anyone I'm working with &lt;STRONG&gt;NOW.&amp;nbsp; &lt;/STRONG&gt;Besides, not getting paid for money owed over 6 months late really isn't that big of a deal is it?)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Everything I'm working with now is like a dream come true.&amp;nbsp; &lt;A href="http://www.apress.com/"&gt;Apress&lt;/A&gt; is a dream to work with, I couldn't speak better of them without having Jenna Jameson as my product manager.&amp;nbsp; &lt;A href="http://www.marvets.com/blog/"&gt;Eric Marvets&lt;/A&gt;&amp;nbsp;has been my point of contact through &lt;A href="http://www.dunntraining.com/"&gt;Dunn Training&lt;/A&gt; and has been amazing.&amp;nbsp; We even have group meetings with &lt;A href="http://www.microsoft.com/office/uc/livemeeting/default.mspx"&gt;Microsoft Live Meeting&lt;/A&gt;, which totally rocks.&amp;nbsp; We're also using &lt;A href="http://www.sourcegear.com/sos/index.html"&gt;Source Offsite&lt;/A&gt;&amp;nbsp;for this and although my inital experience with it was horrific, things seem a lot better here.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I've been doing a lot with Microsoft as well but really shouldn't be saying too much about it.&amp;nbsp; Suffice to say if you ever have an opportunity to work with &lt;A href="http://www.microsoft.com/learning/default.mspx"&gt;Microsoft Learning&lt;/A&gt;&amp;nbsp; or &lt;A href="http://www.grandmasters.biz/"&gt;Grandmasters&lt;/A&gt; , hop all over it.&amp;nbsp; Yes, I'm biting off a lot, but at least I'll probably be able to buy that &lt;A href="http://images.google.com/images?q=tbn:aUcM9wSLqLHKiM:http://www.edmunds.com/media/roadtests/roadtest/06.porsche.boxster/06.porsche.boxster.f34.500.jpg"&gt;Porsche Boxster&lt;/A&gt; I've wanted by the end of the year.&amp;nbsp; Fortunately I'm too damn busy to spend anything so things should be good when it's all over.&amp;nbsp; If you're interested in getting involved with Microsoft Learning or MS Press, let me know privately and I'll put you in contact with some people.&amp;nbsp; Same goes for writing a book.&amp;nbsp; Just remember the golden rule, it's all about the screen cap.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So I have been going to work, going home, writing, going to bed, waking up, going to work, going home, writing, loop.&amp;nbsp; The upside is that currently I may be the most informed developer on the &lt;EM&gt;System.Configuration&lt;/EM&gt; namespace in the country, maybe universe.&amp;nbsp; And at this pace, I'm going to be the next &lt;A href="http://www.wintellect.com/about/instructors/instructorbios.aspx?id=2"&gt;John Robbins&lt;/A&gt;&amp;nbsp;when it comes to System.Diagnostics.&amp;nbsp;Hell, just hanging around Jeffrey and watching his technique gave me more than a few new ideas.&amp;nbsp; &amp;nbsp;No, I'll never has his game at debugging, but I may be able to come close at least with respect to Debugging .NET Framework 2.0 apps.&amp;nbsp; And I'm quickly earning guru status on Globalization.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;With respect to System.Configuration, there's a lot there and a lot to blog about.&amp;nbsp; I have to change the examples I've used so not to violate anything, but I promise a few articles on the pretty kick a33 new features associated with handling Connection Strings available with the 2.0 Framework.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;If I have some time today, I'll post some of the Configuration stuff.&amp;nbsp; Many find it a lame subject, I don't, particularly if you're using Remoting.&amp;nbsp; But even if you're not, the enhancements in 2.0 are so many that it's honestly something you really should take a look at.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Hopefully I'll be able to squeeze some time in this week to blog some more, I've got a ton to write about.&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=84877" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx">Me</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category></item><item><title>Lunch with Jeffrey Richter</title><link>http://msmvps.com/blogs/williamryan/archive/2006/02/26/84854.aspx</link><pubDate>Sun, 26 Feb 2006 01:14:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:84854</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=84854</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=84854</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/02/26/84854.aspx#comments</comments><description>&lt;FONT face=Verdana size=2&gt;Well, I've been so busy that I hardly realize how fast life is passing me by. Anyway, I had a chance to take off some time and do lunch with &lt;/FONT&gt;&lt;A href="http://www.wintellect.com/about/instructors/default.aspx#3"&gt;&lt;FONT face=Verdana size=2&gt;Jeffrey Richter&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;. Got to hang out with a lot of great people. &lt;/FONT&gt;&lt;A href="http://www.adoguy.com/"&gt;&lt;FONT face=Verdana size=2&gt;Shawn Wildermuth&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;, &lt;/FONT&gt;&lt;A href="http://www.gridviewgirl.com/GridViewGirl/"&gt;&lt;FONT face=Verdana size=2&gt;GridViewGirl&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;, Todd Fine, &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/dougturn/"&gt;&lt;FONT face=Verdana size=2&gt;Doug Turnure&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;, &lt;/FONT&gt;&lt;a href="http://msmvps.com/admin/blogs/Kirk%20Evans"&gt;&lt;FONT face=Verdana size=2&gt;Kirk Evans&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;, &lt;A href="http://devcow.com/blogs/adnrg/default.aspx"&gt;Brendon Schwartz&lt;/A&gt; ,&amp;nbsp;&lt;/FONT&gt;&lt;A href="http://www.dunntraining.com/"&gt;&lt;FONT face=Verdana size=2&gt;Mark Dunn&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt; &amp;nbsp;and a few more were all there. Very Very cool. Just hanging around him gives you an IQ Increase. &lt;BR&gt;&lt;BR&gt;I chilled out in Altanta for a while, realized that dependence on a GPS can be really dangerous and just hung out. Then went to the user's group meeting. Jeffrey was talking about AppDomains and Threading and it was amazing. Every 5 minutes he said something that set off a major a-ha moment. I'll fill in the details when I get a chance. &lt;BR&gt;&lt;BR&gt;As an aside... I had 5, yes 5 different people approach me &lt;/FONT&gt;&lt;A href="http://www.charlescarroll.com/"&gt;&lt;FONT face=Verdana size=2&gt;Chump Change&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp; about and thank me for standing up to him. It's pretty surprising to have people you don't even know come up and thank you for well... you know. Gotta lot to blog about there but &lt;/FONT&gt;&lt;A href="http://www.charlescarroll.com/"&gt;&lt;FONT face=Verdana size=2&gt;Chump Change&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt; will probably start his crying again so well, I better make it worth my while. Hey Chump Change, can you at least send me the password so I can see your secret little hate page that you made about me?&amp;nbsp; Honestly, I find it really flattering and standing up to you seems to be a great way to make new friends.&amp;nbsp; &lt;BR&gt;&lt;BR&gt;Anyway, here's some pics... more to come when I get some more time. &lt;BR&gt;&lt;BR&gt;Here they are: &lt;BR&gt;&lt;B&gt;Jeffrey Richter and Shawn Wildermuth at Houlihans&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt="Jeffrey Richter" src="http://www.williamgryan.com/images/Atlanta/JeffreyShawnMarcie.JPG" width=130&gt; &lt;BR&gt;&lt;B&gt;Doug Turnure, Andrew Duthie and Brendan atHoulihans&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt="Andrew Duthie" src="http://www.williamgryan.com/images/Atlanta/BrendanDougAndrew.JPG" width=130&gt; &lt;BR&gt;&lt;B&gt;Marcie Robillard - GridViewGirl- at Houlihans&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt=GridViewGirl src="http://www.williamgryan.com/images/Atlanta/marcie.JPG" width=130&gt; &lt;BR&gt;&lt;B&gt;Jeffrey Richter at Atlanta .NET Users Group&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt="Jeffrey Richter" src="http://www.williamgryan.com/images/Atlanta/JeffreyRichter.JPG" width=130&gt; &lt;BR&gt;&lt;B&gt;Jeffrey Chatting&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt="Jeffrey Richter" src="http://www.williamgryan.com/images/Atlanta/JeffreyChatting.JPG" width=130&gt; &lt;BR&gt;&lt;B&gt;Doug Turnure, Andrew Duthie and Brendan Houlihans&lt;/B&gt;&lt;BR&gt;&lt;IMG height=130 alt="Kirk and Matt" src="http://www.williamgryan.com/images/Atlanta/KirkAndMatt.JPG" width=130&gt;&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=84854" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Life+in+General/default.aspx">Life in General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx">Me</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category></item><item><title>Using the SqlConnectionStringBuilder to guard against Connection String Injection Attacks</title><link>http://msmvps.com/blogs/williamryan/archive/2006/01/15/81115.aspx</link><pubDate>Sun, 15 Jan 2006 14:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:81115</guid><dc:creator>William</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=81115</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=81115</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/01/15/81115.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;One new object in the ADO.NET 2.0 Library worth taking a look at is the &lt;A href="http://blogs.msdn.com/DataAccess/archive/2005/03/30/403926.aspx"&gt;SqlConnectionStringBuilder&lt;/A&gt;&amp;nbsp;.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Considering how late it is in the game, you are probably&amp;nbsp;aware of the dangers of &lt;A href="http://search.msn.com/results.aspx?q=Sql+injection+Attacks&amp;amp;FORM=QBHP"&gt;Sql Injection Attacks&lt;/A&gt;&amp;nbsp;.&amp;nbsp;&amp;nbsp;One&amp;nbsp;the off chance you aren't,&amp;nbsp;let me throw in my two cents and recommend that you familiarize yourself with them ASAP.&amp;nbsp; Anyway, injection attacks are possible when you use dynamic string concatenation to build your Sql Statements and you don't paramaterize them or escape all possible malicious input.&amp;nbsp; This presents a small problem b/c you need to employ user input in your applications in many cases, but every time you accept user input, you increase the surface are of an attack.&amp;nbsp; And regrettably, there are too many cases where people 'solve' this problem by employing a solution worse than the problem itself.&amp;nbsp; For instance, I've seen some people hell bent of using Dynamic Sql (and not parameters) solve the injection problem by disallowing all special characters.&amp;nbsp; While this does address the problem directly, it has the unintended consequence of forcing the users to use less strong passwords.&amp;nbsp; And most of the cases that I've seen where people implemented this rule, they increased the lenght of possible passwords to offset this vulnerability. Well, that 'solution' opens you up to other sorts of mischief.&amp;nbsp; After all, if you only allow people ten characters for their password, there's only so much malicious sql they can push off on you.&amp;nbsp; But assuming you don't increase the length of the password, you just pretty much hamstrung the user into have to adopt a weaker password scheme.&amp;nbsp; I've bitched about &lt;a href="http://msmvps.com/blogs/williamryan/archive/2004/03/20/4063.aspx"&gt;this alot in the past&lt;/A&gt;&amp;nbsp;and it's not really the focus of this article so I'll cut it short here.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So what about Connection String injection attacks?&amp;nbsp; Well, yes, it's something you should guard against.&amp;nbsp; When I was first learning .NET, I created this application that stored User Name/Password combinations in a Database, both of which were encrypted.&amp;nbsp; This was&amp;nbsp; a particularly sensitive application and I was still pretty naive about security.&amp;nbsp; So I came up with a solution that entailed a good bit of extra maintenance but which I believed would give me extra security.&amp;nbsp; What I did was create a Sql Server login for every user.&amp;nbsp; So to even create the connection in the first place, I used their username/password combo to open the connection and then I ran an query that would check the authentication table, decrypt the username and password and pass back an output parameter indicating if they authenticated correctly or not.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;This was not just a bad idea, it was terrible.&amp;nbsp; For one thing, it was a nightmare to administer.&amp;nbsp; Every time we added a user, I'd have to create a new Sql Server account and had to use a utility I wrote to hash the password.&amp;nbsp; Other than being a pain in the neck, this made it impossible to add a new user for use with many of our applications without having to use my utlity (which people were unable to find on multiple occassions).&amp;nbsp; Another problem was with connection pooling.&amp;nbsp; If you have different connection strings for every user, it can have a serious adverse affect with &lt;A href="http://www.sql-server-performance.com/sk_connection_pooling_myths.asp"&gt;Connection Pooling&lt;/A&gt;&amp;nbsp;. Anyway, I thought all of this was worth it all in all b/c of the extra security benefit.&amp;nbsp; Then &lt;A href="http://blogs.msdn.com/angelsb/"&gt;Angel Saenz-Badillos&lt;/A&gt;&amp;nbsp;saw a post I had&amp;nbsp;that described&amp;nbsp;what I was doing and he set me straight.&amp;nbsp; You see, my whole concept was based on the fact that I didn't realize you could hack the connection string (don't ask me why, it should have been clear to me from the get go).&amp;nbsp; But all it takes for someone to have caused some mischief for me was to add Max Pool Size 100000000; Min Pool Size 100000000 to the password field. Sure, we are used to limiting the field size in many cases for fields that we accept input from but it's not unheard of for someone to leave it the default size.&amp;nbsp; Another trick that they could do is add "; Trusted_Connection = true".&amp;nbsp; This will cause a 'last one wins' scenario so in the case of my app, the machine account would be used instead of the assigned user account and if it had more privileges than the user account did, well, there was just an escalation of privilege.&amp;nbsp; Combined with a Sql Injection attack, this could cause some problems.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The good news is that in order to do much damage, the attacker would need to know the username and password or the machine itself would have to have sufficient permissions with the Sql Server to allow something troublesome to happen.&amp;nbsp; But relying primarily on 'luck' to not get hacked is kind of a lame strategy.&amp;nbsp; The other thing about Connection String Injection attacks is that if everything else is handled correctly (no unparamaterized queries allowed) then the attack surface is pretty much limited to non-permanent items or things that are just annoyances (although depending on the nature of your data, these annoyances could get quite serious very quickly).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So how do you address this issue?&amp;nbsp; Fortunately the good folks on the &lt;A href="http://blogs.msdn.com/dataaccess/default.aspx"&gt;DataWorks Team&lt;/A&gt;&amp;nbsp;gave use the SqlConnectionStringBuilder.&amp;nbsp; Basically, it handles the escaping issues for you and has the side benefit of being easier to use.&amp;nbsp; For one thing you can use it just like you would you old connection strings if you're dead set on not changing your ways:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt; OldSchool = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt;(&lt;FONT color=#a52a2a&gt;"Data Source=Clock1;Initial Catalog=Pr0nStarz;User Id=CuckooBurd;Password=++dfjk33nmjKLLa;"&lt;/FONT&gt;);&lt;BR&gt;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnection&lt;/STRONG&gt;&lt;/FONT&gt; cn = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnection&lt;/STRONG&gt;&lt;/FONT&gt;(OldSchool.ToString());&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;Now you can use the SqlConnectionStringBuilder just like this, it's as easy as pie:&lt;/FONT&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;/CODE&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; DemoConnectionStringBuilder()&lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt; ConnectionBuilder = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;STRONG&gt;&lt;FONT color=#7fffd4&gt;SqlConnectionStringBuilder&lt;/FONT&gt;&lt;/STRONG&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp; ConnectionBuilder.DataSource = &lt;STRONG&gt;&lt;FONT color=#7fffd4&gt;SecurityUtil&lt;/FONT&gt;&lt;/STRONG&gt;.DecryptText&lt;FONT color=#a52a2a&gt;(@"#*a0-%%% ^889333"&lt;/FONT&gt;,&amp;nbsp;&amp;nbsp;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SecurityUtil&lt;/STRONG&gt;&lt;/FONT&gt;.CryptoProviders.TripleDES); &lt;BR&gt;&amp;nbsp; ConnectionBuilder.InitialCatalog = &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SecurityUtil&lt;/STRONG&gt;&lt;/FONT&gt;.DecryptText(&lt;FONT color=#a52a2a&gt;"pR9s4%~`"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//Here you can specify either&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; ConnectionBuilder.IntegratedSecurity = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//ConnectionBuilder.UserID = SecurityUtil.DecryptText("pR9s4%~`") ;&lt;BR&gt;&amp;nbsp; //ConnectionBuilder.Password =&amp;nbsp; SecurityUtil.DecryptText("!Cuck00zR~!e", SecurityUtil.CryptoProviders.TripleDES);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;using&lt;/FONT&gt;(&lt;FONT color=#7fffd4&gt;SqlConnection&lt;/FONT&gt; MainConnection = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;SqlConnection&lt;/FONT&gt;(ConnectionBuilder.ToString())){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainConnection.Open();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Do your thing&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainConnection.Close();&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/CODE&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;In the above example, I went with Integrated Security and commented out the username and password, but you can switch these back and forth.&amp;nbsp; All of the properties like Max Pool Size, Pooling, Workstation ID, PacketSize, everything you normally manipulate is there and since you have intellisense support, you have cues as to just about everything you may need.&amp;nbsp; Moreoever, if you want to be really safe, you can also create another wrapper class that exposes some of there properties but limits Max Pool Size or Min Pool Size in the accessors.&amp;nbsp; For instance it could check one vs the other and if you aren't comfortable with the numbers, you can throw an exception, change them to something you like, or do whatever you see fit. Same goes for the UserName/Password and Trusted Connection. Although it will escape any attempt to try to put Trusted_Connection = true as a value, you can use your class to manually ensure that only one or the other is chosen.&amp;nbsp; Right out of the Box the SqlConnectionStringBuilder is very powerful and can give you most of the functionality you'd ever want but there may be a case or two where you need everything to be even more granular - in which case you can easily implement such a scenario.&amp;nbsp; Sure, as far as features go, this is more evolutionary than revolutionary, but it's a nice touch.&amp;nbsp; If nothing else it will keep you from having to flip over to &lt;A href="http://www.connectionstrings.com/"&gt;http://www.connectionstrings.com&lt;/A&gt; over and over when you are building new applications&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;-----&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;As an aside, I've listed the two primary targets for a Connection String injection attack but I'm not convniced that there aren't any other ones. If you can think of any other mischief you can cause via the connection string, be a pal and shoot me your idea - I'll include it as an addendum to this post and give you the credit.&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=81115" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category></item><item><title>Pimping RowState in ADO.NET 2.0</title><link>http://msmvps.com/blogs/williamryan/archive/2006/01/14/81063.aspx</link><pubDate>Sat, 14 Jan 2006 23:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:81063</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=81063</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=81063</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/01/14/81063.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;There are two new methods for the &lt;A href="http://msdn2.microsoft.com/en-us/library/7f2d84ta(en-US,VS.80).aspx"&gt;DataRow&lt;/A&gt;&amp;nbsp;object in ADO.NET 2.0 that haven't gotten much coverage but can be quite useful.&amp;nbsp;The two methods are &lt;A href="http://msdn2.microsoft.com/en-us/library/system.data.datarow.setadded.aspx"&gt;SetAdded&lt;/A&gt;&amp;nbsp;and &amp;nbsp;&lt;A href="http://msdn2.microsoft.com/en-us/library/6ds359ak(en-US,VS.80).aspx"&gt;SetModified&lt;/A&gt;&amp;nbsp;.&amp;nbsp; I consider myself to be an ADO.NET afficionado and until last week, I wasn't aware of these (yes, lame on my part).&amp;nbsp; I was eating lunch with a few guys from the ADO.NET team and I mentioned to &lt;A href="http://www.microsoft.com/MSPress/books/authors/auth5354.asp"&gt;David Sceppa&lt;/A&gt;&amp;nbsp;that it would be really cool if there was a way to manually set &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatarowclassrowstatetopic.asp"&gt;RowState&lt;/A&gt;.&amp;nbsp;I've had the need to manually manipulate &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatarowclassrowstatetopic.asp"&gt;RowState&lt;/A&gt;&amp;nbsp;in the past and each solution was pretty lame.&amp;nbsp; Basically I'd go to the row, then change the value to itself.&amp;nbsp; This was really awkward b/c well, it looks screwy.&amp;nbsp; The thought of setting a variable to itself shouldn't sit well with anyone b/c with very limited exceptions, it's a totally useless operation.&amp;nbsp; But when it comes to Rowstate, it was sometimes necessary.&amp;nbsp; For the uninitiated, a &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatacommondataadapterclasstopic.asp"&gt;DataAdapter object&lt;/A&gt;&amp;nbsp;depends on &amp;nbsp;Rowstate exclusively to &lt;a href="http://msmvps.com/blogs/williamryan/archive/2005/01/21/33520.aspx"&gt;determine what action(s) it's going to take during a call to Update.&lt;/A&gt;&amp;nbsp;So let's say that you wanted to take the data from one table and move it to another one.&amp;nbsp; The 'right' way to do this is using DTS or &lt;a href="http://msmvps.com/blogs/williamryan/archive/2004/07/10/9890.aspx"&gt;SqlBulkCopy&lt;/A&gt;&amp;nbsp;(and yes, somehow I got ranked #1 on google for SqlBulkCopy ;-)&amp;nbsp; ) but that's another story.&amp;nbsp; Anyway, one of the other ways which was kind of a kluge albeit a pretty good one, was to set the &lt;A href="http://www.knowdotnet.com/articles/datasetmerge.html"&gt;AcceptChangesDuringFill&lt;/A&gt;&amp;nbsp;property of your adapter to false.&amp;nbsp; This would in effect fill your &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatatableclasstopic.asp"&gt;DataTable&lt;/A&gt;&amp;nbsp;with rows that had a &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatarowstateclasstopic.asp"&gt;DataRowState&lt;/A&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatarowclassrowstatetopic.asp"&gt;&lt;/A&gt;&amp;nbsp;of Added.&amp;nbsp; You could then configure a second adapter, pointing to your destination table and simply call the Update method on it, passing in your just filled DataTable.&amp;nbsp;Just as a note of caution - it's not typically advisable to use disconnected architecture to move data within the same database, after all&amp;nbsp; you are using network bandwidth and resources that aren't necessary, but that's another issue.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Well, if you want to do manipulations like these, you were very limited in the past.&amp;nbsp; That is no longer the case.&amp;nbsp; With the new SetAdded and SetModified methods, you can change the DataRowState of a given row to either added or modified without having to resort to setting a value back to itself.&amp;nbsp; Admittedly this is a really simple operation and doesn't need much explanation, but I figured if I missed the new features someone else might to.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;CODE&gt;&lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; button1_Click(&lt;FONT color=#0000ff&gt;object &lt;/FONT&gt;sender, &lt;FONT color=#7fffd4&gt;EventArgs&lt;/FONT&gt; e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; //Create a DataSet&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;DataSet&lt;/FONT&gt; DemoDataSet = &lt;FONT color=#0000ff&gt;new &lt;/FONT&gt;&lt;FONT color=#7fffd4&gt;DataSet&lt;/FONT&gt;(&lt;FONT color=#a52a2a&gt;"CuckoozDataSet"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Create a DataTable&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;DataTable&lt;/FONT&gt; DemoTable = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;DataTable&lt;/FONT&gt;(&lt;FONT color=#a52a2a&gt;"Cuckoo"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Add the Table to the DataSet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoDataSet.Tables.Add(DemoTable);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Add a new Column and Set its Autoincrement property to true&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //just so that it has a value in it.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;DataColumn&lt;/FONT&gt; KeyColumn = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; DataColumn(&lt;FONT color=#a52a2a&gt;"MainColumn"&lt;/FONT&gt;, &lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;(System.&lt;FONT color=#7fffd4&gt;Int32&lt;/FONT&gt;));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KeyColumn.AutoIncrement = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoTable.Columns.Add(KeyColumn);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Add a row&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;DataRow&lt;/FONT&gt; dro = DemoTable.NewRow();&lt;BR&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoTable.Rows.Add(dro);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000&gt;//Add 9 more so that we have 10 rows total&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (&lt;FONT color=#7fffd4&gt;Int32&lt;/FONT&gt; x = 0; x &amp;lt; 9; x++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dro = DemoTable.NewRow();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoTable.Rows.Add(dro);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Verify the Row Count&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;Debug&lt;/FONT&gt;.Assert(DemoTable.Rows.Count == 10, &lt;FONT color=#a52a2a&gt;"Row Count is screwy"&lt;/FONT&gt;); &lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Verify that there are changes present&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;Debug&lt;/FONT&gt;.Assert(DemoDataSet.HasChanges(), &lt;FONT color=#a52a2a&gt;"No Changes are present"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Call AcceptChanges to reset the Rowstate of each row&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; DemoTable.AcceptChanges();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;//Verify that there are no changes present&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;Debug&lt;/FONT&gt;.Assert(!DemoDataSet.HasChanges(), &lt;FONT color=#a52a2a&gt;"Changes are present but shouldn't be"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; //Call the SetAdded method on first 3 rows&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; (&lt;FONT color=#7fffd4&gt;Int32&lt;/FONT&gt; i = 0; i &amp;lt; 3; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoTable.Rows[i].SetAdded();&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; //Call the SetModified method on the next 3 rows&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; (&lt;FONT color=#7fffd4&gt;Int32&lt;/FONT&gt; z = 3; z &amp;lt; 6; z++)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DemoTable.Rows[z].SetModified();&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; //Show the rowstate for each row&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; for&lt;/FONT&gt; (&lt;FONT color=#7fffd4&gt;Int32&lt;/FONT&gt; y = 0; y &amp;lt; DemoTable.Rows.Count; y++)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;Debug&lt;/FONT&gt;.WriteLine(DemoTable.Rows[y].RowState.ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Show output&lt;BR&gt;&amp;nbsp;&amp;nbsp; //0 - Added&lt;BR&gt;&amp;nbsp;&amp;nbsp; //1 - Added&lt;BR&gt;&amp;nbsp;&amp;nbsp; //2 - Added&lt;BR&gt;&amp;nbsp;&amp;nbsp; //3 - Modified&lt;BR&gt;&amp;nbsp;&amp;nbsp; //4 - Modified&lt;BR&gt;&amp;nbsp;&amp;nbsp; //5 - Modified&lt;BR&gt;&amp;nbsp;&amp;nbsp; //6 - Unchanged&lt;BR&gt;&amp;nbsp;&amp;nbsp; //7 - Unchanged&lt;BR&gt;&amp;nbsp;&amp;nbsp; //8 - Unchanged&lt;BR&gt;&amp;nbsp;&amp;nbsp; //9 - Unchanged&lt;BR&gt;&amp;nbsp;&amp;nbsp; //Verify that there are changes present&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;Debug&lt;/FONT&gt;.Assert(DemoDataSet.HasChanges(), &lt;FONT color=#a52a2a&gt;"There aren't changes but should be"&lt;/FONT&gt;);&lt;BR&gt;}&lt;BR&gt;&lt;/CODE&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=81063" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category></item><item><title>The Data Diva's new Blog</title><link>http://msmvps.com/blogs/williamryan/archive/2005/12/18/79343.aspx</link><pubDate>Sun, 18 Dec 2005 06:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:79343</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=79343</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=79343</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2005/12/18/79343.aspx#comments</comments><description>&lt;FONT face=Verdana size=2&gt;Was just checking through the referrers and saw &lt;A href="http://blog.ziffdavis.com/devlife"&gt;a link from Julia's other blog&lt;/A&gt;&amp;nbsp;.&amp;nbsp; I've been a big &lt;A href="http://thedatafarm.com/blog/"&gt;Julia Lerman&lt;/A&gt;&amp;nbsp;since I &lt;A href="http://www.google.com/search?sourceid=navclient&amp;amp;ie=UTF-8&amp;amp;rls=GGLG,GGLG:2005-34,GGLG:en&amp;amp;q=Julia+Lermen"&gt;first misspelled her name&lt;/A&gt;, plain and simply put, she rocks.&amp;nbsp; She's got a great article on &lt;A href="http://blog.ziffdavis.com/devlife/archive/2005/12/09/39428.aspx?Pending=true"&gt;DevLife&lt;/A&gt;&amp;nbsp;and well, I couldn't agree more.&amp;nbsp; Anyway, if you haven't checked out her &lt;A href="http://blog.ziffdavis.com/devlife"&gt;ZD Blog&lt;/A&gt;, like everything Julia, it's way cool.&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=79343" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category></item><item><title>Sahil goes big time.</title><link>http://msmvps.com/blogs/williamryan/archive/2005/12/17/KeystoneElMaliko.aspx</link><pubDate>Sat, 17 Dec 2005 23:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:79327</guid><dc:creator>William</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=79327</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=79327</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2005/12/17/KeystoneElMaliko.aspx#comments</comments><description>&lt;FONT face=Verdana size=2&gt;Well I knew it was coming for a while, but all I can say is &lt;A href="http://206.190.35.122/s/prweb/20051211/bs_prweb/prweb320922"&gt;it couldn't happen to a more deserving guy&lt;/A&gt;&amp;nbsp;.&amp;nbsp; Congrats &lt;A href="http://codebetter.com/blogs/sahil.malik/"&gt;Sahil&lt;/A&gt;.&amp;nbsp; If they're half as good as &lt;A href="http://www.amazon.com/gp/product/1590595122/qid=1134863987/sr=8-1/ref=pd_bbs_1/104-1614793-6215953?n=507846&amp;amp;s=books&amp;amp;v=glance"&gt;good as his book&lt;/A&gt;&amp;nbsp;that's resplendent in every way, they'll be a must have for any serious ADO.NET developer.&amp;nbsp; Nicely done El Maliko!&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=79327" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category></item><item><title>Misc Observations on Biztalk</title><link>http://msmvps.com/blogs/williamryan/archive/2005/11/30/77270.aspx</link><pubDate>Wed, 30 Nov 2005 15:36:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:77270</guid><dc:creator>William</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=77270</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=77270</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2005/11/30/77270.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Yesterday, to my surprise, there was quite a bit of hype about Biztalk 2006.&amp;nbsp; As far as the marketing hype went, I'll go so far as to say that it was featured almost as prominently as Visual Studio 2005 and Sql Server 2005.&amp;nbsp; There were a few differences though.&amp;nbsp; The main one is that you got a coupon for a copy of it, they didn't actually distribute a copy of it there.&amp;nbsp; big friggin deal though - most folks have it w/ MSDN or Technet and if you're using it professionally, well, then you probably already have access to it.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;I've had a pretty positive relationship with Biztalk to date and think that it's really cool.&amp;nbsp;&amp;nbsp; I also tend the think it's tragically overpriced and has a rather schizophrenic relationship with the marketplace.&amp;nbsp; Why do I say that?&amp;nbsp;How many people do you know that have successful Biztalk installs and aren't scared up from getting it running?&amp;nbsp; They're out there, but compared to the number of people that have problems with it, well, the ratio is fugly.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Over and over I heard/overhead the same theme - &amp;#8220;Yeah, if you want to seamlessly map a text file to your database, Biztalk is great, but not for 50k&amp;#8221;.&amp;nbsp; Ok, that's not an exact quote but that captures the essence of it.&amp;nbsp; I also heard a lot of &amp;#8220;Ok, I see the slick demos but where are the people out there that have used it and say it's a good value?&amp;#8221;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Now all of this is anecdotal evidence, but I didn't hear anything but glowing reviews of Visual Studio 2005.&amp;nbsp; I heard almost 100% positive stuff about Sql Server 2005 - except I heard a good bit of carping about creating maintenance plans - go figure.&amp;nbsp; So you have three products that are featured with approximately the same degree of prominence, and two of the products are so well recieved by the market people are giddy over them, and the other is recieved with, well, less than impressive ado.&amp;nbsp; Yes, I know Biztalk is a very targeted tool not applicable to many people's day to day routines.&amp;nbsp; But something just seems 'wrong' with respect to how it's recieved.&amp;nbsp; Mention ASP.NET 2.0 and people are ecstatic.&amp;nbsp; Mention Service Broker and people are giddy.&amp;nbsp; Mention Biztalk and you hear stuff like &amp;#8220;I can write my own tool to map a text file to my database.&amp;#8221;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Before BTS 2004, I only knew two people that actually used Biztalk and they spoke very well of it but said it was quite a bit of work.&amp;nbsp; With Biztalk 2004, I've seen both the good and the bad with it - &lt;A href="http://www.codemilitia.com/blogs/tobin.titus/default.aspx"&gt;Tobin&lt;/A&gt; can speak to it a little better than I can.&amp;nbsp; I have a handful of friends like &lt;A href="http://www.scottcreynolds.com/"&gt;Scott&lt;/A&gt;&amp;nbsp;that have used it and I know &lt;A href="http://www.dunntraining.com/"&gt;Mark&lt;/A&gt; does quite a bit of training with it, but that's about it.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Anyway, is it&amp;nbsp;me or does BTS have a little bit of an image problem.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=77270" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category></item><item><title>If you want to prove you're a real programmer</title><link>http://msmvps.com/blogs/williamryan/archive/2005/11/07/74648.aspx</link><pubDate>Mon, 07 Nov 2005 22:51:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:74648</guid><dc:creator>William</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=74648</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=74648</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2005/11/07/74648.aspx#comments</comments><description>&lt;FONT face=Tahoma size=2&gt;Benchmarking things like &lt;A href="http://rolandboon.net/WSBeanRSS/Comment.aspx?day=2005-11-6&amp;amp;id=1"&gt;this&lt;/A&gt;&amp;nbsp;and &lt;A href="http://rolandboon.net/WSBeanRSS/Comment.aspx?day=2005-11-3&amp;amp;id=2"&gt;this&lt;/A&gt;&amp;nbsp;is definitely one way to do it.&amp;nbsp;&amp;nbsp;I shouldn't be surprised though, &amp;nbsp;Roland has been rolling in cool posts and projects recently.&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=74648" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Remoting/default.aspx">Remoting</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Overriding ToString()</title><link>http://msmvps.com/blogs/williamryan/archive/2005/07/31/60033.aspx</link><pubDate>Sun, 31 Jul 2005 05:28:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:60033</guid><dc:creator>William</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=60033</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=60033</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2005/07/31/60033.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;I had mentioned reading &lt;A href="http://www.amazon.com/exec/obidos/tg/detail/-/0321245660/qid=1122781265/sr=8-1/ref=pd_bbs_1/002-3152385-1817625?v=glance&amp;amp;s=books&amp;amp;n=507846"&gt;Effective C#, 50 Specific Ways to Improve Your C#&lt;/A&gt;&amp;nbsp; back a few &lt;A href="http://msmvps.com/williamryan/archive/2005/07/18/58016.aspx"&gt;posts ago&lt;/A&gt;.&amp;nbsp; So&amp;nbsp;I decided to show off a few of the techniques there as well as some new C# features&amp;nbsp;and &lt;A href="http://msmvps.com/williamryan/archive/2005/07/25/59599.aspx"&gt;began with this post.&lt;/A&gt;&amp;nbsp;.&amp;nbsp; Anyway,&amp;nbsp;when I started writing out the examples, I&amp;nbsp;kept adding new things and&amp;nbsp;it started to turn into a really long piece.&amp;nbsp; Well, I need&amp;nbsp;to start at the beginning&amp;nbsp;and just let things go from there, otherwise I'll never get finished.&amp;nbsp; So let's start at the absolute beginning.&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;I ran through a bunch of my existing code and looked for the number of times I did an&amp;nbsp; override on the ToString() method.&amp;nbsp; Except for a few times when I had&amp;nbsp;a specific need to do so, I didn't find many. Well, if you look at the Framework, it's obvious that many of the&amp;nbsp;classes have an override on the ToString() method and when they do, it's usually quite helpful.&amp;nbsp; I know, this is such an easy thing to do that it barely warrants discussion but I think that the fact that I (and&amp;nbsp;the majority of developers I know as well as the majority of code I've seen) so seldom&amp;nbsp;do it makes it worth emphasizing.&amp;nbsp; If you don't ever do&amp;nbsp;it, it won't have&amp;nbsp;ANY notable&amp;nbsp;effect on the&amp;nbsp;way your code runs.&amp;nbsp; However, it can (and does) make a difference in how user friendly your libraries are to developers using your code.&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Stated simply, you don't have to use XML Comments in your class libraries (and&amp;nbsp;until recently, if you used VB.NET, you couldn't unless you wired them in yourself or bought an&amp;nbsp;Add-In), you don't have to use enums to assist users with intellisense, you don't have to overload your constructors or other methods, but it sure makes your code a lot nicer to use if you do.&amp;nbsp; Well,&amp;nbsp;if you look at the original &lt;A href="http://msmvps.com/williamryan/archive/2005/07/25/59599.aspx"&gt;Shocker Class I wrote&lt;/A&gt;,&amp;nbsp;I&amp;nbsp;have a override&amp;nbsp;for ToString().&amp;nbsp;&amp;nbsp;Assuming you passed in &amp;#8220;Stink&amp;#8221; and &amp;#8220;Pink&amp;#8221; respectively to the&amp;nbsp;overloaded constructor, you'll&amp;nbsp;see &amp;#8220;One in the&amp;nbsp;Stink, Two in the Pink&amp;#8221; as the output.&amp;nbsp; However if you comment out the override, you'll &lt;A href="http://www.jjbresearch.org/acs/blogs/optionsscalper/archive/2005/07/21/DoubleIComments.aspx"&gt;DoubleI&lt;/A&gt;.TheShocker.Shocker.&amp;nbsp; Outside of the fact that this class was contrived and a bit flippant, the point should be obvious, namely, that you can provide a LOT more useful information than the Namespace.Class. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Outside of the Override though - you can overload the ToString() method and with a little footwork, have a much more user friendly&amp;nbsp;class (the intellisense support alone is worth the price of admission)&amp;nbsp; Anyway, I know this is pretty lame but I'm trying to formulate as many things as I can with a simple example though.&amp;nbsp; By taking full advantage of the XML Comments you can do quite a bit and just a combination like this, of two really simple techniques can make your class a lot more user friendly.&amp;nbsp; And before you call me a l4mer for posting this - hold your horses, I'm going somewhere with this.:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#800000&gt;
&lt;P&gt;&lt;FONT size=2&gt;///&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;summary&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; Method to provide a more granular feedback mechanism&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; for the user by specifying what is returned by the ToString()&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; method.&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/summary&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;param name=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"formatOptions"&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;gt;&amp;lt;see cref=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"DoubleI.TheShocker.OutPutOptions"&lt;/FONT&gt;&lt;FONT color=#800000&gt;/&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt; value&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; allowing the user to specify what they want to show.&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/param&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;returns&amp;gt;&amp;lt;see cref=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"System.String"&lt;/FONT&gt;&lt;FONT color=#800000&gt;/&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt; value showing the&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;see cref=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"System.String"&lt;/FONT&gt;&lt;FONT color=#800000&gt;/&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt; representation corresponding&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; to the &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;see cref=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"DoubleI.TheShocker.OutPutOptions"&lt;/FONT&gt;&lt;FONT color=#800000&gt;/&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt; specified&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; by the user&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/returns&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;remarks&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; Values for the &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;see cref=&lt;/FONT&gt;&lt;FONT color=#808080&gt;"DoubleI.TheShocker.OutPutOptions"&lt;/FONT&gt;&lt;FONT color=#800000&gt;/&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; parameter are specified below:&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;list&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.None = 0&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.PrivateMembers = 1&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.ProtectedMembers = 2&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.PublicMembers = 3&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.All = 4&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;item&amp;gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;OutPutOptions.Silliness = 5&lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/item&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/list&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/remarks&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;example&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; Shocker ShockerSample = new Shocker("Stink", "Pink");&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; Console.WriteLine(ShockerSample.ToString(OutPutOptions.Silliness);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; //Will yeild "One in the Stink, Two in the Pink&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#800000&gt;///&lt;/FONT&gt;&lt;FONT color=#808080&gt; &lt;/FONT&gt;&lt;FONT color=#800000&gt;&amp;lt;/example&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#008080&gt;String&lt;/FONT&gt; ToString(&lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; formatOptions)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; (formatOptions)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.None:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#800000&gt;"Nice Going A55Munch, this is a useless overload and call"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.PrivateMembers:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#008080&gt;String&lt;/FONT&gt;.Format(&lt;FONT color=#800000&gt;"_oneValue: {0}, _twoValue {1}"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;._oneValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;._twoValue);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.ProtectedMembers:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return&lt;/FONT&gt; &lt;FONT color=#800000&gt;"Bill was lazy and didn't create any protected members yet"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.PublicMembers:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#008080&gt;String&lt;/FONT&gt;.Format(&lt;FONT color=#800000&gt;"OneValue: {0}, TwoValue {1}"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.OneValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.TwoValue); &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.All:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/FONT&gt; &lt;FONT color=#008080&gt;String&lt;/FONT&gt;.Format(&lt;FONT color=#800000&gt;"_oneValue: {0}, _twoValue {1}"&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + &lt;/FONT&gt;&lt;FONT face="Courier New" color=#800000&gt;", OneValue: {2}, TwoValue{3}"&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;._oneValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;._twoValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.OneValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.TwoValue ); &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#008080&gt;OutPutOptions&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Silliness: &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#008080&gt;String&lt;/FONT&gt;.Format(&lt;FONT color=#800000&gt;"One in the {0}, Two in the {1}"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.OneValue,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face="Courier New" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.TwoValue);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=60033" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Humor/default.aspx">Humor</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item></channel></rss>