<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9581590</id><updated>2011-10-26T03:28:20.656-07:00</updated><title type='text'>Dotnet Fox</title><subtitle type='html'>Life, coding, and the elimination of curly braces</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9581590.post-2139244870805072617</id><published>2007-03-27T13:19:00.000-07:00</published><updated>2007-03-27T13:22:30.185-07:00</updated><title type='text'>I've Moved...</title><content type='html'>I'm now posting on MSDN. &lt;a href="http://blogs.msdn.com/bethmassi/"&gt;Check it out here&lt;/a&gt;. Please update your &lt;a href="http://blogs.msdn.com/bethmassi/rss.xml"&gt;RSS&lt;/a&gt; or &lt;a href="http://blogs.msdn.com/bethmassi/atom.xml"&gt;ATOM &lt;/a&gt;feeds!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-2139244870805072617?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/2139244870805072617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=2139244870805072617' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/2139244870805072617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/2139244870805072617'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/03/my-blog-moved.html' title='I&apos;ve Moved...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-8663263654285613196</id><published>2007-03-08T14:09:00.000-08:00</published><updated>2007-03-08T14:20:47.423-08:00</updated><title type='text'>EastBay.NET Launch Event -- TONIGHT</title><content type='html'>I'll be speaking tonight on WCF in Pleasanton (a.k.a "P-town") for the &lt;a href="http://www.baynetug.org/DesktopDefault.aspx?tabindex=2&amp;tabid=26"&gt;EastBay.NET UG's&lt;/a&gt; Vista launch event along with Deborah Kurata and David Klitzke. Bring your appetites for Vista, WPF and WCF presentations as well as REAL FOOD! Yes folks, we'll have dinner tonight from &lt;a href="http://www.eriksdelicafe.com/"&gt;Erik's Deli&lt;/a&gt;. :-) &lt;br&gt;&lt;br&gt;

For more information &lt;a href="http://www.baynetug.org/DesktopModules/DetailXEvents.aspx?ItemID=266&amp;mid=143"&gt;check this out&lt;/a&gt;. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-8663263654285613196?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/8663263654285613196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=8663263654285613196' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8663263654285613196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8663263654285613196'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/03/eastbaynet-launch-event-tonight.html' title='EastBay.NET Launch Event -- TONIGHT'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-217484346627058494</id><published>2007-03-05T09:12:00.000-08:00</published><updated>2007-03-05T10:12:36.722-08:00</updated><title type='text'>Upgrade your May CTP VB LINQ Samples to Orcas March CTP</title><content type='html'>If you are playing with LINQ in Visual Basic, you'll probably want to check out &lt;a href="http://devauthority.com/blogs/jwooley/default.aspx"&gt;Jim Wooley's&lt;/a&gt; post on &lt;a href="http://devauthority.com/blogs/jwooley/archive/2007/03/04/29684.aspx"&gt;how to convert a VB LINQ project from the May 2006 LINQ CTP to the March 2007 Orcas CTP&lt;/a&gt;. The syntax has changed including the order of the Order By and Select clauses. Even though it may look weird to the SQL people, there is a good reason for it, actually. Putting the Order By clause fixes a scoping issue where you now don't have to select the fields you want to order by. There's also now no need to put a := for named parameters, you can use the more normal =. Anonymous types also have a new syntax. Better intellisense should help you out. &lt;a href="http://www.thedatafarm.com/blog/"&gt;Julie&lt;/a&gt; also has some &lt;a href="http://www.thedatafarm.com/blog/2007/03/02/AFewOfTheManySyntaxChangesInVBAndLinqForSQLQueries.aspx"&gt;good information as well&lt;/a&gt; so check her (I mean her blog) out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-217484346627058494?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/217484346627058494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=217484346627058494' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/217484346627058494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/217484346627058494'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/03/upgrade-your-may-ctp-vb-linq-samples-to.html' title='Upgrade your May CTP VB LINQ Samples to Orcas March CTP'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-4349737727712243920</id><published>2007-03-01T05:23:00.000-08:00</published><updated>2007-03-05T09:21:46.122-08:00</updated><title type='text'>Orcas March CTP Now Available</title><content type='html'>If you haven't seen it yet, &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;here it is&lt;/a&gt;. VPC images and regular install packages are both available. (Though the &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa948851.aspx"&gt;specific feature list&lt;/a&gt; doesn't look like it's updated yet, you can &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=281fcb3d-5e79-4126-b4c0-8db6332de26e&amp;displaylang=en#Overview"&gt;read the overview&lt;/a&gt;.) A lot of things are finally coming together but I'm personally excited about LINQ. This CTP has the same features as the May LINQ CTP including LINQ to SQL and VB's XML literals. I'm off to download!......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-4349737727712243920?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/4349737727712243920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=4349737727712243920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/4349737727712243920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/4349737727712243920'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/03/orcas-february-ctp-now-available.html' title='Orcas March CTP Now Available'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-8690656505774891283</id><published>2007-02-20T10:46:00.000-08:00</published><updated>2007-02-20T13:51:36.890-08:00</updated><title type='text'>VB WCF template in Visual Studio 2005 extensions for .NET Framework 3.0</title><content type='html'>Just an FYI to anyone that is playing with WCF 2005 extensions in Visual Basic. When you create a WCF Service Library in VB, the code for the DataContract1 class it provides does not have &amp;lt;DataMember()&amp;gt; attributes on the properties FirstName and LastName, so when you try to generate a proxy it doesn't generate correctly and the sample doesn't work. &lt;br&gt;&lt;br&gt; 

New Project --&gt; pick template VB/.NET Framework 3.0/WCF Service Library &lt;br&gt;&lt;br&gt;
 
You'll see that the code for the DataContract1 at the bottom of the file doesn't have any &amp;lt;DataMember()&amp;gt; attributes. This has been fixed in the Orcas CTP that's due out very soon. So for now just pop those attributes in there and then follow the rest of the directions in the template to set up a host and config files. &lt;br&gt;&lt;br&gt;

&lt;pre&gt;
&amp;lt;DataContract()&amp;gt; _
Public Class DataContract1
    Private m_firstName As String
    Private m_lastName As String

    &lt;b&gt;&amp;lt;DataMember()&amp;gt;&lt;/b&gt; _
    Public Property FirstName() As String
        Get
            Return m_firstName
        End Get
        Set(ByVal value As String)
            m_firstName = value
        End Set
    End Property

    &lt;b&gt;&amp;lt;DataMember()&amp;gt;&lt;/b&gt; _
    Public Property LastName() As String
        Get
            Return m_lastName
        End Get
        Set(ByVal value As String)
            m_lastName = value
        End Set
    End Property
End Class
&lt;/pre&gt;
&lt;br&gt;
The template doesn't tell you directly how to set up a client to call it, but there is a VB example that shows you how. It's provided in the Program Files\Microsoft SDKs\Windows\6.0\Samples\ then extract the WCFSamples.zip and locate the \TechnologySamples\Basic\GettingStarted\VB\GetingStarted.sln. Here you can see a sample client and how to add the proper MetaData Exchange (mex) endpoint and service behavior so that you can generate the service proxy on the client side using "Add Service Reference" from the project menu.   &lt;br&gt;&lt;br&gt;

If you're following the instructions in the template, to add the endpoint to the host console application you need to put this in your app.config (note, if your host is a web server then you will place this in the web.config): &lt;br&gt;&lt;br&gt;

&lt;pre&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;configuration&amp;gt;
&amp;lt;system.serviceModel&amp;gt;
 &amp;lt;services&amp;gt;
  &amp;lt;service 
   name="WCFServiceLibrary1.Service1"
   behaviorConfiguration="metadataSupport"&amp;gt;
   &amp;lt;host&amp;gt;

&amp;lt;!-- Stick this in here if you remove the baseAddress 
        in the StartService method it creates for you. It's a 
        good idea to change that to use this config file instead.

 &amp;lt;baseAddresses&amp;gt;
   &amp;lt;add baseAddress="http://localhost:8080/ConsoleApplicationVB/service1" /&amp;gt;
 &amp;lt;/baseAddresses&amp;gt;
--&amp;gt;

   &amp;lt;/host&amp;gt;
   &amp;lt;endpoint
    address=""
    binding="wsHttpBinding"
    contract="WCFServiceLibrary1.IService1" /&amp;gt;

&amp;lt;!-- Adds a WS-MetadataExchange endpoint at 
        "http://localhost:8080/SampleService/mex" --&amp;gt;
   &amp;lt;endpoint
    address="mex"
    binding="mexHttpBinding"
    contract="IMetadataExchange" /&amp;gt;
  &amp;lt;/service&amp;gt;
 &amp;lt;/services&amp;gt;
 &amp;lt;behaviors&amp;gt;
  &amp;lt;serviceBehaviors&amp;gt;
 &amp;lt;behavior name="metadataSupport"&amp;gt;

&amp;lt;!-- Enables the IMetadataExchange endpoint in services that
        use "metadataSupport" in their behaviorConfiguration attribute.
        In addition, the httpGetEnabled and httpGetUrl attributes publish 
        Service metadata for retrieval by HTTP/GET at the address 
        "http://localhost:8080/SampleService?wsdl" --&amp;gt;

  &amp;lt;serviceMetadata httpGetEnabled="true" /&amp;gt;

 &amp;lt;/behavior&amp;gt;
  &amp;lt;/serviceBehaviors&amp;gt;
 &amp;lt;/behaviors&amp;gt;
&amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;

&lt;/pre&gt;

Then start the service (this is important) and in your client select from the project menu "Add Service Reference" and put the MetaData Exchange endpoint as the service URI and it will generate the client code for you with no problems.
&lt;br&gt;&lt;br&gt;
&lt;a href="http://3.bp.blogspot.com/_bk-OnFLmcjY/RdtMa1xOXbI/AAAAAAAAAAs/15iYE-C3j5M/s1600-h/mex.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_bk-OnFLmcjY/RdtMa1xOXbI/AAAAAAAAAAs/15iYE-C3j5M/s400/mex.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5033701032510512562" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-8690656505774891283?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/8690656505774891283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=8690656505774891283' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8690656505774891283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8690656505774891283'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/vb-wcf-template-in-visual-studio-2005.html' title='VB WCF template in Visual Studio 2005 extensions for .NET Framework 3.0'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bk-OnFLmcjY/RdtMa1xOXbI/AAAAAAAAAAs/15iYE-C3j5M/s72-c/mex.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-4648459353758419323</id><published>2007-02-20T10:44:00.000-08:00</published><updated>2007-03-08T14:02:48.959-08:00</updated><title type='text'>How to check the executing Type from the base class</title><content type='html'>Occasionally when designing base classes we need to know the type of the inheriting class executing the method (i.e. like when you're loading types from other assemblies dynamically or when it's not possible to change the inherited classes). You can either use the TypeOf operator in VB or use the GetType method that is available in the CLR to accomplish this. 
 &lt;br&gt;&lt;br&gt;
&lt;pre&gt;
Module Module1
    Sub Main()
        Dim a As New A
        Console.WriteLine(a.Method1())
 
        Dim b As New B
        Console.WriteLine(b.Method1())
 
        Dim c As New C
        Console.WriteLine(c.Method1())
 
        Console.ReadLine()
    End Sub
End Module
 
Public MustInherit Class Base
 
    Function Method1() As String

        If TypeOf Me Is A Then
            Return "Hello from A"

        ElseIf TypeOf Me Is B Then
            Return "Hello from B"

        Else
            Return String.Format("Hello from {0}", Me.GetType.ToString)
        End If

    End Function
End Class

Public Class A
    Inherits Base

End Class

Public Class B
    Inherits Base

End Class

Public Class C
    Inherits Base

End Class

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-4648459353758419323?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/4648459353758419323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=4648459353758419323' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/4648459353758419323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/4648459353758419323'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/how-to-check-executing-type-from-base.html' title='How to check the executing Type from the base class'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-8892975430849327509</id><published>2007-02-16T11:08:00.000-08:00</published><updated>2007-02-16T11:14:27.654-08:00</updated><title type='text'>SOA Facts</title><content type='html'>One of my favorite sites on the web is a &lt;a href="http://www.chucknorrisfacts.com/"&gt;Chuck Norris fact site&lt;/a&gt;. If you've never seen it it's hilarious. Well they now have &lt;a href="http://www.soafacts.com/"&gt;SOA facts&lt;/a&gt; which is equally amusing. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-8892975430849327509?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/8892975430849327509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=8892975430849327509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8892975430849327509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8892975430849327509'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/soa-facts.html' title='SOA Facts'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-8835945030084143809</id><published>2007-02-13T07:52:00.000-08:00</published><updated>2007-02-12T15:55:21.528-08:00</updated><title type='text'>Sync Services for ADO.NET</title><content type='html'>If you haven't seen it yet, the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=75FEF59F-1B5E-49BC-A21A-9EF4F34DE6FC&amp;displaylang=en"&gt;Sync Services CTP&lt;/a&gt; was released a couple weeks ago. Today they released the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=02989F70-49AA-43D7-81B8-A651120F8D65&amp;displaylang=en#filelist"&gt;documentation and samples&lt;/a&gt;. The sync services for ADO.NET enable you to develop occasionally connected clients much much easier. The sync framework provides easy detection of all the types of data concurrency and conflict handling issues you encounter when developing offline clients and makes it easy to code resolutions. Best of all it uses SQLce and the deploymemt package is under 2Meg. For more information see &lt;a href="http://blogs.msdn.com/stevelasker/default.aspx"&gt;Steve's&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/synchronizer/default.aspx"&gt;Rafik's&lt;/a&gt; blogs. &lt;br&gt;&lt;br&gt;

BTW, I'll be speaking at &lt;a href="http://www.devteach.com"&gt;DevTeach in May&lt;/a&gt; on the sync services and architectures of occasionally connected clients.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-8835945030084143809?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/8835945030084143809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=8835945030084143809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8835945030084143809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/8835945030084143809'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/sync-services-for-adonet.html' title='Sync Services for ADO.NET'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-816419659818603360</id><published>2007-02-12T13:56:00.000-08:00</published><updated>2007-02-12T13:28:44.029-08:00</updated><title type='text'>EDM and LINQ</title><content type='html'>In doing some more research on &lt;a href="http://msdn2.microsoft.com/en-us/library/aa697428(vs.80).aspx"&gt;ADO.NET's Entity Data Model (EDM)&lt;/a&gt; I came across some videos &lt;a href="http://datajunkies.net/screencasts/adonet_vnext_part1/adonet_vnext_part1.html"&gt;here&lt;/a&gt; and &lt;a href="http://datajunkies.net/screencasts/adonet_vnext_part2/adonet_vnext_part2.html"&gt;here&lt;/a&gt; by Shyam Pather, Dev Lead on the ADO.NET Team. The videos are from last summer but they do a really great job of describing the EDM as a conceptual model of your data, describing properties, associations/relationships, even inheritance -- using much a richer type system to model the entities. It separates the actual normalized data schema away from your application so that when underlying schema changes happen, your application is safe as long as the entity model hasn't changed. With ADO.NET 3.0 you can write queries (with a new 'entity SQL' eSQL query syntax) against the EDM and the data access stack automatically translates them to the database -- instead of getting rows back you get entities. Of course, any changes you make can be tracked and persisted back to the database automatically for you as well. 
&lt;br&gt;&lt;br&gt;

What I really love about the ADO.NET team is that they pay attention to the backward compatibility and migration issues. What I like here is the easy migration path of current code by using the new Mapping Provider (instead of the Sql Provider). The provider is different but the key is that you can use the connections, commands, readers, etc. in the same manner as you are accustomed to. However if you are writing new code you can create a strongly-typed query using the new Query class that returns the objects instead. &lt;br&gt;&lt;br&gt;

This is all really really really great, however, I'm not too jazzed about learning yet another query syntax just to query these entities. Here's where LINQ comes in. You can query the EDM directly with LINQ, (very similar to how DLinq looks, actually). Let's take a couple examples. Here's how you would access data today:&lt;br&gt;&lt;br&gt;

&lt;pre&gt;
Using cnn As New SqlConnection(MyConnectionString)
    Using cmd As SqlCommand = cnn.CreateCommand()
        cmd.CommandText = "SELECT Employee.Name, Region.Name " &amp; _
                "FROM SalesPeople " &amp; _
                "INNER JOIN Employees ON SalesPeople.EmployeeId = Employees.EmployeeId " &amp; _
                "INNER JOIN Region ON SalesPeople.RegionId = Region.RegionId"

        Using dr As SqlDataReader = cmd.ExecuteReader()
            'Process DataReader.....
        End Using
    End Using
End Using
&lt;/pre&gt;&lt;br&gt;

Say I created an EDM with an entity called SalesPeople, here's what the query could look like using Entity SQL (eSQL):

&lt;pre&gt;
Using cnn As New MapConnection(MyConnectionString)
    Using cmd As MapCommand = cnn.CreateCommand()
        cmd.CommandText = "SELECT Name, Region FROM SalesPeople"

        Using dr As IDataReader = cmd.ExecuteReader()
            'Process DataReader.....
        End Using
    End Using
End Using
&lt;/pre&gt;&lt;br&gt;

Finally (using the same EDM) here's what it could look like with LINQ:

&lt;pre&gt;
Using edm as New MyModel()
 
    Dim sales = From s In edm.SalesPeople Select s
    
    For Each person As SalesPerson In sales
        'Do something with the SalesPerson objects
        Console.WriteLine(person.Name)
    Next

End Using
&lt;/pre&gt;&lt;br&gt;

All this makes me think... why do we need DLinq (LINQ to SQL) at all? Hmmmmmmm????? Seriously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-816419659818603360?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/816419659818603360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=816419659818603360' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/816419659818603360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/816419659818603360'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/edm-and-linq.html' title='EDM and LINQ'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-128528476402291225</id><published>2007-02-11T07:31:00.000-08:00</published><updated>2007-02-11T08:02:15.749-08:00</updated><title type='text'>The History and Future of ADO</title><content type='html'>If you haven't seen it, Mike &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0" onclick="BLOG_clickHandler(this)"&gt;Pizzo&lt;/span&gt;, an Architect for Data &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1" onclick="BLOG_clickHandler(this)"&gt;Programmabilty &lt;/span&gt;at Microsoft, &lt;a href="http://blogs.msdn.com/data/default.aspx"&gt;has a series of blog posts&lt;/a&gt; describing the interesting history and evolution of ADO into what it is today.&lt;br&gt;&lt;br&gt;

&lt;a href="http://blogs.msdn.com/data/archive/2007/01/23/Data-Access-API-of-the-Day-_2800_Part-IV_2900_.aspx"&gt;In his last post&lt;/a&gt; he describes the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa697428(vs.80).aspx"&gt;Entity Data Model (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2" onclick="BLOG_clickHandler(this)"&gt;EDM&lt;/span&gt;)&lt;/a&gt; and how client views are exposed through an ADO.NET data provider extended to support a query tree &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;representation&lt;/span&gt;. He also explains what happened to &lt;a href="http://msdn2.microsoft.com/en-us/library/ms971512.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4" onclick="BLOG_clickHandler(this)"&gt;ObjectSpaces&lt;/span&gt;&lt;/a&gt;, which I found particularly interesting. He goes on explaining how &lt;a href="http://msdn.microsoft.com/XML/linqproject/default.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5" onclick="BLOG_clickHandler(this)"&gt;LINQ&lt;/span&gt;&lt;/a&gt; is supported in the Entity Framework (&lt;a href="http://msdn2.microsoft.com/en-us/data/aa937723.aspx"&gt;ADO vNext&lt;/a&gt;) and that they both will be featured together in the next &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6" onclick="BLOG_clickHandler(this)"&gt;Orcas&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7" onclick="BLOG_clickHandler(this)"&gt;CTP&lt;/span&gt; (due in Feb/March). One thing that I asked Mike is what kind of guidance can he give on using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8" onclick="BLOG_clickHandler(this)"&gt;EDM&lt;/span&gt; over &lt;a href="http://download.microsoft.com/download/4/7/0/4703eba2-78c4-4b09-8912-69f6c38d3a56/dlinq.wmv"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9" onclick="BLOG_clickHandler(this)"&gt;DLinq&lt;/span&gt;&lt;/a&gt; and when we can see tooling for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10" onclick="BLOG_clickHandler(this)"&gt;EDM&lt;/span&gt; in Visual Studio.
&lt;br&gt;&lt;br&gt;
This next &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11" onclick="BLOG_clickHandler(this)"&gt;Orcas&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12" onclick="BLOG_clickHandler(this)"&gt;CTP&lt;/span&gt; is very exciting because it will have all the pieces finally together. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13" onclick="BLOG_clickHandler(this)"&gt;LINQ&lt;/span&gt;, ADO &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14" onclick="BLOG_clickHandler(this)"&gt;vNext&lt;/span&gt;, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15" onclick="BLOG_clickHandler(this)"&gt;WPF&lt;/span&gt; tooling are my personal interests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-128528476402291225?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/128528476402291225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=128528476402291225' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/128528476402291225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/128528476402291225'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/history-and-future-of-ado.html' title='The History and Future of ADO'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-2711744910331780587</id><published>2007-02-08T08:40:00.000-08:00</published><updated>2007-02-06T10:06:01.476-08:00</updated><title type='text'>Relaxed Delegates in Visual Basic 8</title><content type='html'>&lt;a href="http://www.theproblemsolver.nl/contact.htm"&gt;Maurice&lt;/a&gt; posted a &lt;a href="http://msmvps.com/blogs/theproblemsolver/archive/2007/02/08/relaxed-delegates-in-visual-basic-8.aspx"&gt;workaround for relaxed delegates in Visual Basic 8&lt;/a&gt;. Relaxed delegates are described in the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms364068(vs.80).aspx"&gt;Visual Basic 9 Overview on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0" onclick="BLOG_clickHandler(this)"&gt;MSDN&lt;/span&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-2711744910331780587?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/2711744910331780587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=2711744910331780587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/2711744910331780587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/2711744910331780587'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/relaxed-delegates-in-visual-basic-8.html' title='Relaxed Delegates in Visual Basic 8'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-7515157195390439999</id><published>2007-02-05T12:45:00.000-08:00</published><updated>2007-02-06T09:04:05.680-08:00</updated><title type='text'>Ready for a New Day?</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_bk-OnFLmcjY/RceaAItzC1I/AAAAAAAAAAU/SlxgGtIy1Nc/s1600-h/newday2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5028156836112698194" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_bk-OnFLmcjY/RceaAItzC1I/AAAAAAAAAAU/SlxgGtIy1Nc/s320/newday2.jpg" border="0" /&gt;&lt;/a&gt;
&lt;div&gt;I attended the &lt;a href="http://www.microsoft.com/business/launch2007/signup/default.mspx"&gt;Vista Launch event&lt;/a&gt; at &lt;a href="http://www.moscone.com/directions/index.shtml"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0" onclick="BLOG_clickHandler(this)"&gt;Moscone&lt;/span&gt; Center in SF &lt;/a&gt;on Tuesday. It was a large event but nothing compared to the &lt;a href="http://www.microsoft.com/windowsserversystem/applicationplatform/launch2005/default.mspx"&gt;Visual Studio 2005 launch &lt;/a&gt;that was here back in November 2005. &lt;/div&gt;
&lt;div&gt;The first debacle of the day was that the event details and announcements all pointed you to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1" onclick="BLOG_clickHandler(this)"&gt;Moscone&lt;/span&gt; West (same building where the VS launch was held) but it turned out the doors were locked and not even one poster was on the wall inside. I was standing around with a few other scratching heads thinking "Where's the 'Wow'?" Finally a guard came to the window and told us the event was taking place in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2" onclick="BLOG_clickHandler(this)"&gt;Moscone&lt;/span&gt; North. So all morning you had large groups of nerds walking across 4&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3" onclick="BLOG_clickHandler(this)"&gt;th&lt;/span&gt; street over to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4" onclick="BLOG_clickHandler(this)"&gt;Moscone&lt;/span&gt; North entrance. &lt;/div&gt;
&lt;div&gt;The &lt;a href="http://www.engadget.com/2007/01/29/live-at-the-windows-vista-launch-event/"&gt;main launch for Vista&lt;/a&gt; was in New York City and looked huge but in SF they still had both &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5" onclick="BLOG_clickHandler(this)"&gt;Moscone&lt;/span&gt; North and South halls dedicated to three separate IT Pro tracks, one Developer track and one &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;Decision&lt;/span&gt; Maker track. I helped out with the Ask the Experts area and in between that I popped into a couple sessions on the Developer track. &lt;/div&gt;
&lt;div&gt;SF wasn't cool enough to get &lt;a href="http://www.networkworld.com/news/2007/012907-ballmer-gates-speak-at-vista.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7" onclick="BLOG_clickHandler(this)"&gt;BillG&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8" onclick="BLOG_clickHandler(this)"&gt;Balmer&lt;/span&gt; for the keynote&lt;/a&gt;, instead it was done by &lt;a href="http://www.microsoft.com/presspass/exec/jeff/default.mspx"&gt;Jeff &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9" onclick="BLOG_clickHandler(this)"&gt;Raikes&lt;/span&gt;, President Microsoft Business Division&lt;/a&gt;. He presented a lot of business cases for moving to Vista and had people demo the new OS as well as Office 2007 showcasing the new &lt;a href="http://office.microsoft.com/en-us/help/HA101679411033.aspx"&gt;task oriented interfaces&lt;/a&gt;. My personal high point of the keynote was when he introduced the CEO of &lt;a href="http://www.sierranevada.com/index2.asp"&gt;Sierra Nevada Brewing Company&lt;/a&gt; to discuss how Vista has made his &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10" onclick="BLOG_clickHandler(this)"&gt;QA&lt;/span&gt; department more productive (so that they can drink more beer, of course).&lt;/div&gt;
&lt;div&gt;Among the local developer evangelists and Microsoft presenters, &lt;a href="http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=3&amp;amp;tabid=5"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11" onclick="BLOG_clickHandler(this)"&gt;Juval&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12" onclick="BLOG_clickHandler(this)"&gt;Lowy&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.insteptech.com/h_whoweare.htm"&gt;Deborah &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13" onclick="BLOG_clickHandler(this)"&gt;Kurata&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://blogs.vertigosoftware.com/scott/"&gt;Scott Stanfield&lt;/a&gt; also presented the new technologies in &lt;a href="http://www.netfx3.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14" onclick="BLOG_clickHandler(this)"&gt;Fx&lt;/span&gt; 3.0&lt;/a&gt;, giving demos on &lt;a href="http://wpf.netfx3.com/"&gt;Windows Presentation Foundation&lt;/a&gt;, &lt;a href="http://wcf.netfx3.com/"&gt;Windows Communication Foundation&lt;/a&gt; and &lt;a href="http://wf.netfx3.com/"&gt;Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15" onclick="BLOG_clickHandler(this)"&gt;Workflow&lt;/span&gt; Foundation&lt;/a&gt;. I also caught &lt;a href="http://nimad.wordpress.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16" onclick="BLOG_clickHandler(this)"&gt;Nima&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17" onclick="BLOG_clickHandler(this)"&gt;Dilmaghani&lt;/span&gt;&lt;/a&gt; (local evangelist and all around nice guy) presenting on the new &lt;a href="http://office.microsoft.com/en-us/sharepointserver/FX100492001033.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18" onclick="BLOG_clickHandler(this)"&gt;SharePoint&lt;/span&gt;&lt;/a&gt; integration. All in all it was an informative track for developers to get a taste of what is possible with &lt;a href="http://www.microsoft.com/windows/products/windowsvista/default.mspx"&gt;Windows Vista&lt;/a&gt; and &lt;a href="http://office.microsoft.com/en-us/default.aspx"&gt;Office 2007&lt;/a&gt;. I assume it was equally beneficial for the IT pros (comments anyone?). I recommend &lt;a href="http://www.microsoft.com/business/launch2007/signup/default.mspx"&gt;attending a launch in your area&lt;/a&gt;. &lt;em&gt;[UPDATE: I forgot to mention for filling out session evaluations, attendees received a free copy of Office 2007. So if anything else, it's worth it to attend just for that.]&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-7515157195390439999?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/7515157195390439999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=7515157195390439999' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/7515157195390439999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/7515157195390439999'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/02/ready-for-new-day.html' title='Ready for a New Day?'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bk-OnFLmcjY/RceaAItzC1I/AAAAAAAAAAU/SlxgGtIy1Nc/s72-c/newday2.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-116845008522898892</id><published>2007-01-10T08:27:00.000-08:00</published><updated>2007-01-10T14:44:47.240-08:00</updated><title type='text'>I've Been Tagged! Five things about me....</title><content type='html'>Okay, I suppose I can't ignore this anymore since both &lt;a href="http://www.markusegger.com/blog/Travel.aspx?messageid=c407da9f-1f6c-4ac3-b3ee-f4d3ccf7dd18 "&gt;Markus&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2007/01/02/Tag_2C00_-I_2700_m-It_2100_.aspx"&gt;Sam&lt;/a&gt; tagged me this week. It was only inevitable I suppose. Okay so here it goes -- five things you didn't know about me.
&lt;br&gt;&lt;br&gt;
1. I'm a car fanatic and I have a 2003 Subaru WRX-ESX Stage 4 built by &lt;a href="http://www.esxmotorsports.com/"&gt;EasyStreet&lt;/a&gt; and &lt;a href="http://www.gruppe-s.com/"&gt;Gruppe-S&lt;/a&gt;. Once in a while I race it at &lt;a href="http://www.sacramentoraceway.com/"&gt;Sacramento Raceway&lt;/a&gt;. It does a 12.7 quarter mile. Next project is a rear swaybar, endlinks and a new clutch :-)&lt;br&gt;&lt;br&gt;
2. I used to race mountain bikes, now I just ride them. I have a 2003 &lt;a href="http://www.specialized.com/bc/SBCBkModel.jsp?sid=07FSRxc"&gt;Specialized FSR-Disc&lt;/a&gt;. I love to ride many of the thousands of miles of trails on &lt;a href="http://www.parks.ca.gov/?page_id=517"&gt;Mt. Diablo&lt;/a&gt;. We have a beautiful view of the mountian from our bedroom.&lt;br&gt;&lt;br&gt;
3. I have an XBox 360 and I am addicted to any car/motorcycle games. I play almost every night if I'm not watching Battlestar Galactica DVDs. We just got my dad who's retired an XBox 360 for Christmas so I'm hoping he sets it up and gets his online profile so I can kick his butt.&lt;br&gt;&lt;br&gt;
4. I love wine and beer to the point where we're considering building a wine cellar. Exposure to great wines is easy living in the Bay Area. We go to festivals once or twice a month, even in the winter. This weekend we're headed to the &lt;a href="http://www.wineroad.com/events/winterwineland.asp"&gt;15th Annual Winter Wineland&lt;/a&gt;. I also belong to &lt;a href="http://www.worldbeerdirect.com/shopping/beer_jb.asp"&gt;World Beer Direct's Beer of the Month Club&lt;/a&gt; where they send me three bottles each of two different international beers and two different American microbrews to my door every month.&lt;br&gt;&lt;br&gt;
5. I'm a pro Baseball and Football fan (it goes well with the beer :-)). I'll watch college football this time of year for the bowl games (Holy Crap, Boise State!). We have season tickets to the &lt;a href="http://www.oaklandathletics.com"&gt;Oakland A's&lt;/a&gt; and we're considering going to &lt;a href="http://oakland.athletics.mlb.com/NASApp/mlb/spring_training/tickets.jsp?c_id=oak&amp;year=2007&amp;partnerID=2006hp_tixcomponent_oak_tab1&amp;affiliateID=2006hp_tixcomponent_oak_tab1"&gt;spring training in phoenix&lt;/a&gt; this year. I'm an &lt;a href="http://www.raiders.com/"&gt;Oakland Raider&lt;/a&gt; fan too but that's a little bit embarrassing to say right now! I've been a Raider fan since they won the 1984 superbowl when I was 12 years old. My family lived in the Los Angeles area (San Pedro) back then.&lt;br&gt;&lt;br&gt;
Okay now for the lucky winners who get tagged by me!&lt;br&gt;&lt;br&gt;
- &lt;a href="http://blogs.msdn.com/yag/"&gt;YAG&lt;/a&gt;&lt;br&gt;
- &lt;a href="http://codebetter.com/blogs/rodpaddock/Default.aspx"&gt;Rod Paddock&lt;/a&gt;&lt;br&gt;
- &lt;a href="http://www.geekswithblogs.com/takenote"&gt;Duffy&lt;/a&gt;&lt;br&gt;
- &lt;a href="http://blogs.iona.com/newcomer/"&gt;Eric Newcomer&lt;/a&gt;&lt;br&gt;
- &lt;a href="http://msmvps.com/blogs/bill/Default.aspx"&gt;Bill McCarthy&lt;/a&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-116845008522898892?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/116845008522898892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=116845008522898892' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/116845008522898892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/116845008522898892'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2007/01/ive-been-tagged-five-things-about-me.html' title='I&apos;ve Been Tagged! Five things about me....'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-116620350285046930</id><published>2006-12-15T09:24:00.000-08:00</published><updated>2006-12-15T09:25:02.863-08:00</updated><title type='text'>Visual Studio 2005 SP1 Released</title><content type='html'>&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc&amp;displaylang=en"&gt;Get it here!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-116620350285046930?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/116620350285046930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=116620350285046930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/116620350285046930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/116620350285046930'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/12/visual-studio-2005-sp1-released.html' title='Visual Studio 2005 SP1 Released'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-115887597205295426</id><published>2006-09-21T13:37:00.000-07:00</published><updated>2006-09-21T15:34:21.280-07:00</updated><title type='text'>Explicit Impersonation and Async Thread Identity in ASP.NET</title><content type='html'>I've been doing some asynchronous thread programming in our server components and last night ran into a gotcha that took me a few hours to figure out so I thought I'd post this one to save people some trouble. &lt;br&gt;&lt;br&gt;
I've implemented a Fire and Forget asynchronous pattern similar to &lt;a href="http://www.bearcanyon.com/dotnet/#FireAndForget"&gt;Mike Woodring's sample&lt;/a&gt; so that I could execute longer running processes than the typical web request on a spearate thread and return back to the client immediately. These processes connect to a SQL database using windows integrated security. &lt;br&gt;&lt;br&gt;

All was working just dandy on my development XP box running without impersonation. In this scenario the components run under the default ASPNET identity and connect to a local database. (In Windows 2003/IIS6 the default identity is NETWORK SERVICE.) However when I went to deploy it on our testing servers I ran into a problem with the asynchronous thread identities. They were throwing exceptions trying to connect to the database. &lt;br&gt;&lt;br&gt;

Our test rig is set up as two Windows 2003 servers, one app server and one database server on their own little domain. We set the app server's web.config with explicit impersonation of a least priveledged domain account that is windows authenticated to the database. All works fine for client request threads, however the identity of the async threads were that of the application pool, not the explicit domain user and was therefore causing problems connecting to the database. I figured I could change the application pool identity, but I wasn't satisfied with having to remember another configuration setting. I really wanted the Web.config to be the only place for this and I was perplexed as to why the main thread's identity wasn't getting propagated. &lt;br&gt;&lt;br&gt;

I still am not sure as to why this is the case since the documentation for &lt;a href="http://msdn2.microsoft.com/en-us/library/4yd16hza.aspx"&gt;ThreadPool.QueueUserWorkItem&lt;/a&gt; makes it seem like this should work in .NET 2.0. I ended up augmenting the AsynHelper class to impersonate a WindowsIdentity. Here's the code and it's usage (comments/suggestions welcome!):

&lt;pre&gt;
Imports System.Threading
Imports System.Security

Friend Class AsyncHelper

    Private Shared wc As New WaitCallback(AddressOf CallMethod)

    Public Shared Sub FireAndForget(ByVal d As [Delegate], _
            ByVal wi As Principal.WindowsIdentity, _
            ByVal ParamArray args As Object())

        ThreadPool.QueueUserWorkItem(wc, New TargetInfo(d, args, wi))
    End Sub

    Private Shared Sub CallMethod(ByVal o As Object)
        Dim ti As TargetInfo = DirectCast(o, TargetInfo)

        &lt;b&gt;'This is necessary so this thread impersonates the 
        'calling thread's identity. This is important when 
        'running under ASP.NET explicit impersonation.
        ti.Identity.Impersonate()&lt;/b&gt;

        'Invoke the method, passing the arguments
        ti.Target.DynamicInvoke(ti.Args)
    End Sub

    Private Class TargetInfo
        Private m_target As [Delegate]
        Private m_args As Object()
        Private m_wi As Principal.WindowsIdentity

        ReadOnly Property Target() As [Delegate]
            Get
                Return m_target
            End Get
        End Property

        ReadOnly Property Args() As Object()
            Get
                Return m_args
            End Get
        End Property

        ReadOnly Property Identity() As Principal.WindowsIdentity
            Get
                Return m_wi
            End Get
        End Property

        Sub New(ByVal d As [Delegate], _
            ByVal args As Object(), _
            ByVal wi As Principal.WindowsIdentity)

            m_target = d
            m_args = args
            m_wi = wi
        End Sub
    End Class

End Class
&lt;/pre&gt;

And here's a usage example:

&lt;pre&gt;
Private Delegate Sub ExecuteQueryDelegate(ByVal personID As Integer) 

Public Sub BeginFetch(ByVal personID As Integer)
    Dim dlgt As New ExecuteQueryDelegate(AddressOf ExecuteQuery)

    ' Initiate the asynchronous call.
    AsyncHelper.FireAndForget(dlgt, Principal.WindowsIdentity.GetCurrent(), personID)
End Sub

'This method runs on an asynchronous thread
Private Sub ExecuteQuery(ByVal personID As Integer) 
    Dim resultSet As DataTable = Me.LongRunningProcesses()
    Me.SaveResults(resultSet)
End Sub
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-115887597205295426?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/115887597205295426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=115887597205295426' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115887597205295426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115887597205295426'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/09/explicit-impersonation-and-async.html' title='Explicit Impersonation and Async Thread Identity in ASP.NET'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-115315188563320533</id><published>2006-07-17T08:45:00.000-07:00</published><updated>2006-07-17T08:58:05.693-07:00</updated><title type='text'>Linq's the Word</title><content type='html'>Many thanks to all those who came out on Thursday to play with &lt;a href="http://msdn.microsoft.com/data/ref/linq/"&gt;the latest Linq CTP &lt;/a&gt;at the &lt;a href="http://www.baynetug.org"&gt;East Bay.NET User's Group&lt;/a&gt; in Pleasanton! Here's the &lt;a href="http://www.baynetug.org/uploads/LinqsTheWord.zip"&gt;link to all the presentation code&lt;/a&gt;. &lt;br&gt;&lt;br&gt;
The presentation went really well and the samples sparked a lot of discussion and interest with the group who had never seen language integrated query. Most of the attendees were very excited and anxious for it to release, as am I. &lt;br&gt;&lt;br&gt;
Linq changes the way you think about solving problems in your code. That coupled with Visual Basic's dynamic interfaces and XML literals you definately have the most flexible language I have ever seen. &lt;a href="http://msdn.microsoft.com/vbasic/Future/default.aspx?pull=/library/en-us/dnvs05/html/vb9overview.asp"&gt;Read here for an overview&lt;/a&gt; of these features coming in the next version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-115315188563320533?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/115315188563320533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=115315188563320533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115315188563320533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115315188563320533'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/07/linqs-word.html' title='Linq&apos;s the Word'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-115110623119532938</id><published>2006-06-23T16:36:00.000-07:00</published><updated>2006-06-23T16:43:51.213-07:00</updated><title type='text'>Bay.NET UG presentation code</title><content type='html'>Many thanks to all those who came out on Tuesday to see me speak at the &lt;a href="http://www.baynetug.org"&gt;Bay.NET User's Group&lt;/a&gt; in San Fransisco! Those of you who missed it, I did a more in-depth presentation of the Data Sources and Data Binding in VS2005 session that I gave at DevTeach. Here's the &lt;a href="http://www.baynetug.org/uploads/DataBinding-BethMassi.zip"&gt;link to all the presentation code&lt;/a&gt;. Have Fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-115110623119532938?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/115110623119532938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=115110623119532938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115110623119532938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/115110623119532938'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/06/baynet-ug-presentation-code.html' title='Bay.NET UG presentation code'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114840191155600581</id><published>2006-05-23T08:56:00.000-07:00</published><updated>2006-07-19T16:14:14.596-07:00</updated><title type='text'>Debugging Windows Services in Visual Studio</title><content type='html'>Last week I started writing a Windows Service in Visual Studio for some build and test automation programs. What I have always found annoying (but understandable) about windows services is the debugging. Because your code is set up to run as a service when you select the Windows Service template in VS that means you have to install the service, start it, and then attach to the process in the debugger instead of being able to click the "start debugging" button on the debugger toolbar like I'm used to with other project types. &lt;br&gt;&lt;br&gt;

Previously, I followed the advice &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvsdev05/html/vs05d1.asp"&gt;in this article&lt;/a&gt; by creating a setup program that easily allowed me to install and uninstall the service directly from the Solution Explorer in VS. However I still have to either call System.Diagnostics.Debugger.Break() in my code (and remember to remove it when I'm done!) or attach to the process in order to debug it.  &lt;br&gt;&lt;br&gt;

There's an easier way. If you look in the Main entry point of the service you will see how the service is loaded. (In C# this is in the Program.cs file that's created for you and in VB.NET this code resides in the service's Designer.vb file.) You can modify this code by adding a DEBUG compiler directive to control how the process starts:

&lt;pre&gt;
    &amp;ltMTAThread()&amp;gt _
    Shared Sub Main()
#If DEBUG Then
        ' Start the process as a non-service for debugging only.
        ' Stop the debugger to stop the process.

        Dim service As New MyService 
        service.Execute() 

        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite)
#Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
#End If
    End Sub
&lt;/pre&gt;

Now when your configuration is set to debug, you can hit F5 to debug like normal. Stop the debugger to stop the process. Keep in mind that the OnStart and OnStop methods of your service will not run so you should break your functionality into a callable method on your service class (in this example, I called it "Execute()"). Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114840191155600581?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114840191155600581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114840191155600581' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114840191155600581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114840191155600581'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/05/debugging-windows-services-in-visual.html' title='Debugging Windows Services in Visual Studio'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114792693808098847</id><published>2006-05-17T19:35:00.000-07:00</published><updated>2006-05-17T22:12:53.840-07:00</updated><title type='text'>Programming Computers</title><content type='html'>Today I spoke to some of my mom's computer students about programming &lt;a href="http://www.stisidore.org/classrooms/teacher_pages_total/amassi.html"&gt;at the school where she teaches&lt;/a&gt;. What a change from last week where I'm teaching other developers advanced programming topics at DevTeach. Today I'm encouraging 14 year olds to get into the field and demo-ing &lt;a href="http://msdn.microsoft.com/vstudio/express/vb/"&gt;Visual Basic 2005 Express&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/vstudio/express/vb/starterkit/default.aspx"&gt;starter kits&lt;/a&gt;. We had a blast poking around the &lt;a href="http://msdn.microsoft.com/vstudio/express/vb/starterkit/default.aspx#blackjack"&gt;black jack starter kit&lt;/a&gt;. &lt;br&gt;&lt;br&gt;
I started the presentation by introducing myself and telling them the kind of software products we write at &lt;a href="http://www.giftrapcorp.com"&gt;GiftRAP Corporation&lt;/a&gt;. I told them that I worked at Microsoft a couple years ago on the &lt;a href="http://msdn.microsoft.com/vfoxpro/"&gt;Visual FoxPro&lt;/a&gt; team in the developer division. Then I explained what a &lt;a href="http://mvp.support.microsoft.com/"&gt;Microsoft MVP&lt;/a&gt; is and that I still get to contribute ideas to Microsoft even though I don't work there. &lt;br&gt;&lt;br&gt;
Since I wanted to encourage them to start programming, I went through some of my history as a kid learning to program. I showed them my first computer, &lt;a href="http://oldcomputers.net/atari400.html"&gt;the Atari 400&lt;/a&gt;, and &lt;a href="http://www.atariarchives.org/basic/showpage.php?page=cover"&gt;my first programming language&lt;/a&gt;; it was 1980 and I was 8 years old. I got some bright eyes in a couple kids when I said that. I got some gasps when I told them it retailed for $595.00. I realize now that my parents really sacrificed to buy that computer for me; they didn't spend that type of money back then. Then I skipped to 1986, the year I was in 8th grade and showed them the &lt;a href="http://www.old-computers.com/MUSEUM/computer.asp?c=63"&gt;Amiga 2000 HD&lt;/a&gt;. I think HD meant that you got a hard drive, something I didn't have on my Franklin "IBM PC clone". I wanted to draw all day when I was a young teen but I loved computers, so I begged my mom for an Amiga; the best in computer graphics at the time. And as a bonus, it came with an 8086 motherboard so I could run &lt;a href="http://en.wikipedia.org/wiki/Microsoft_BASIC"&gt;MS-BASIC&lt;/a&gt;. With 1MB RAM I was cooking with gas. Finally I showed them a picture of a few of the machines I have today including my 2 year old &lt;a href="http://www.shopping.com/xPF-Audiovox_SMT5600"&gt;SmartPhone&lt;/a&gt;. I waved it in the air and told them it had 32 times more memory than my Amiga 2000. A couple kids laughed and a couple wanted me to cut to the chase -- let's program already!&lt;br&gt;&lt;br&gt;
I opened up VS and selected the card game starter kit template and we started tweaking it. I changed the card skins to a snoopy face and made Player 1 a picture of the president. They laughed, they stared, they asked questions. I'd say they seemed pretty darn interested (for teenagers). I pointed them to a &lt;a href="http://www.upgradeyourgame.com/"&gt;VS Express Edition game programming site&lt;/a&gt; that looked pretty fun. I think I proved to them that programming is not only a scientific process but also a creative one. Mom said to save the presentation and she wants me back earlier in the year next year. I'm really glad I had the opportunity to do this with the kids today, it's almost harder to do these types of lessons than the professional sessions I do. It's cool, I think some things I was saying to them sunk in and hopefully will make a tiny impression on their future career choices. It was a very rewarding talk for me.
&lt;br&gt;&lt;br&gt;
Here's the links I gave them. This is VB Express free edition:&lt;br&gt; 
&lt;a href="http://msdn.microsoft.com/vstudio/express/vb/"&gt;http://msdn.microsoft.com/vstudio/express/vb/&lt;/a&gt;&lt;br&gt;
These are the starter kits:&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/vstudio/express/vb/starterkit/default.aspx"&gt;http://msdn.microsoft.com/vstudio/express/vb/starterkit/default.aspx&lt;/a&gt;&lt;br&gt;
Here's the sweepstakes and more games:&lt;br&gt;
&lt;a href="http://www.upgradeyourgame.com/"&gt;http://www.upgradeyourgame.com/&lt;/a&gt;
&lt;br&gt;
Links to beginer videos and learning links:&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/vstudio/express/vb/next/default.aspx"&gt;http://msdn.microsoft.com/vstudio/express/vb/next/default.aspx&lt;/a&gt;&lt;br&gt;&lt;a href="http://msdn.microsoft.com/vstudio/express/vb/learning/default.aspx"&gt;http://msdn.microsoft.com/vstudio/express/vb/learning/default.aspx&lt;/a&gt;&lt;br&gt;
Here's the community forum:&lt;br&gt;
&lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=24&amp;siteid=1"&gt;http://forums.microsoft.com/msdn/showforum.aspx?forumid=24&amp;siteid=1&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114792693808098847?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114792693808098847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114792693808098847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114792693808098847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114792693808098847'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/05/programming-computers.html' title='Programming Computers'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114781637643917447</id><published>2006-05-16T14:45:00.000-07:00</published><updated>2006-05-16T14:52:56.460-07:00</updated><title type='text'>"Best and Worst of .NET" Interviews at DevTeach</title><content type='html'>&lt;a href="http://www.mariocardinal.com/"&gt;Mario Cardinal&lt;/a&gt; interviewed the speakers at DevTeach on what we thought were the best and worst parts of Microsoft .NET. Mario snuck up on me and put me on the spot. If he asked me again today I would probably have thought of completely different things to say. There's just so much I like ;-).  &lt;a href="http://www.mariocardinal.com/blog/Posts/20060516.html"&gt;Check it out here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114781637643917447?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114781637643917447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114781637643917447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114781637643917447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114781637643917447'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/05/best-and-worst-of-net-interviews-at.html' title='&quot;Best and Worst of .NET&quot; Interviews at DevTeach'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114753620276259367</id><published>2006-05-13T09:01:00.000-07:00</published><updated>2006-05-13T09:17:31.026-07:00</updated><title type='text'>Amazing Countrysides</title><content type='html'>So now that &lt;a href="http://www.DevTeach.com"&gt;DevTeach&lt;/a&gt; is over, Alan and I are in beautiful Vermont staying with &lt;a href="http://www.thedatafarm.com/blog/"&gt;Julie Lerman&lt;/a&gt; and her husband Rich. What a great feel this countryside has, rolling green hills and birch trees everywhere. Living in the East Bay Area of California we have lots of rolling green hills but the grass is very different; much longer, and dies in the summer. We also have oak trees, not these white wood birch so it's so cool to see a different countryside. (Although all this birch is a little &lt;a href="http://www.blairwitch.com/"&gt;Blair Witch&lt;/a&gt;-y for me at night ;-P) It's my first time in Vermont but I'm sure I'll be back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114753620276259367?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114753620276259367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114753620276259367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114753620276259367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114753620276259367'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/05/amazing-countrysides.html' title='Amazing Countrysides'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114753608805989044</id><published>2006-05-13T08:33:00.000-07:00</published><updated>2006-05-13T09:01:28.073-07:00</updated><title type='text'>Wonderful Montreal in May</title><content type='html'>&lt;a href="http://www.DevTeach.com"&gt;DevTeach&lt;/a&gt; is over; what a great time! Montreal was absolutely beautiful. No rain, nice and warm, in the 70s. I couldn't have asked for anything more. My sessions went very well and I got great feedback from the attendees on the conference as a whole. For session coverage &lt;a href="http://www.utcoverage.com/DevTeach/2006/"&gt;check out the UT&lt;/a&gt;. The focus was on Data and &lt;a href="http://blogs.msdn.com/yag"&gt;Alan&lt;/a&gt; gave a great keynote on &lt;a href="http://msdn.microsoft.com/data/ref/linq/"&gt;LINQ&lt;/a&gt;. If you haven't done it already, &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&amp;displaylang=en"&gt;download the latest CTP&lt;/a&gt; and start playing with it now. It really will change the way you program... everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114753608805989044?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114753608805989044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114753608805989044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114753608805989044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114753608805989044'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/05/wonderful-montreal-in-may.html' title='Wonderful Montreal in May'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114438148697663773</id><published>2006-04-06T19:57:00.000-07:00</published><updated>2006-04-06T20:44:49.616-07:00</updated><title type='text'>Another MVP year!</title><content type='html'>Yahooo! I was awarded &lt;a href="https://mvp.support.microsoft.com/default.aspx/profile=8df4eef4-89a1-4c5b-8895-e4688b11ffdb"&gt;Microsoft Solutions Architecture MVP&lt;/a&gt; again this year. Thanks to everyone involved over at Microsoft and to all the readers of my blog in this awesome community. Hope to see you all next month in  &lt;a href="http://www.devteach.com"&gt;Montreal&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114438148697663773?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114438148697663773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114438148697663773' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114438148697663773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114438148697663773'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/04/another-mvp-year.html' title='Another MVP year!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114356943700869154</id><published>2006-03-28T09:58:00.000-08:00</published><updated>2006-03-28T10:10:37.026-08:00</updated><title type='text'>The best definition of software architecture I've heard</title><content type='html'>My friend and fellow Architect MVP, &lt;a href="http://www.iona.com/info/aboutus/management/eric_newcomer.htm"&gt;Eric Newcomer&lt;/a&gt; mentioned in a &lt;a href="http://www.iona.com/blogs/newcomer/archives/000276.html"&gt;blog post&lt;/a&gt; something I said when we were having dinner last week in SF and it ended up in &lt;a href="http://webservices.sys-con.com/read/198903.htm"&gt;SOA Web Services Journal&lt;/a&gt;. I'm glad all my ranting pays off once in a while ;-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114356943700869154?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114356943700869154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114356943700869154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114356943700869154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114356943700869154'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/03/best-definition-of-software.html' title='The best definition of software architecture I&apos;ve heard'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114356383446144067</id><published>2006-03-28T08:33:00.000-08:00</published><updated>2006-03-28T08:38:00.710-08:00</updated><title type='text'>I'm speaking at DevTeach 2006</title><content type='html'>I'm speaking again this year at &lt;a href="http://www.DevTeach.com"&gt;DevTeach 2006 &lt;/a&gt;in Montreal May 8th-12th.  &lt;br&gt;&lt;br&gt;
 
I'm doing three sessions this year, one called "VS2005 Data Sources and Data Binding" and a two part session on "Designing Applications for Multiple Smart Client UIs". That one also demonstrates a server architecture that supports windows clients as well as mobile devices against the same centralized data. We'll also discuss occasionally connected scenarios and architecture options we have today and in the future. You can see all the speakers and sessions listed &lt;a href="http://www.devteach.com/Session.asp"&gt;here&lt;/a&gt;. Hope you can make it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114356383446144067?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114356383446144067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114356383446144067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114356383446144067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114356383446144067'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/03/im-speaking-at-devteach-2006.html' title='I&apos;m speaking at DevTeach 2006'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114339273843652604</id><published>2006-03-26T08:34:00.000-08:00</published><updated>2006-03-26T09:08:21.836-08:00</updated><title type='text'>Allowing impersonated accounts to write to your custom event log</title><content type='html'>Here's a little tid-bit of information that I've had laying around for a while that I'd thought I'd share. .NET lets us easily create our own custom event logs with:

&lt;pre&gt;
EventLog.CreateEventSource(source, logname)
&lt;/pre&gt;

As long as your an administrator running this code, it will create a custom event log. On a Windows 2003 machine only interactive users, services, batch accounts, admins, and server operators can read and write to this log. If you have components impersonating a least privileged user account then you will not be able to write to your event log. There's a couple ways I know of that you can do to fix this. You can allow any authenticated user write access to your log or you can allow the specific user SID write access. Open up the registry editor to your event log CustomSD key:

&lt;pre&gt;
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\MyLogName\CustomSD
&lt;/pre&gt;

To allow all authenticated users write access add the following security permission:

&lt;pre&gt;
(A;;0x0002;;;AU)
&lt;/pre&gt;

To allow a specific user write access you would specify their SID:

&lt;pre&gt;
(A;;0x0002;;;&lt;i&gt;SID-OF-USER-ACCOUNT&lt;/i&gt;)
&lt;/pre&gt;

For more information see &lt;i&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure06122003.asp"&gt;Development Impacts of Security Changes in Windows Server 2003&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114339273843652604?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114339273843652604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114339273843652604' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114339273843652604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114339273843652604'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/03/allowing-impersonated-accounts-to.html' title='Allowing impersonated accounts to write to your custom event log'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114201975335886042</id><published>2006-03-10T11:35:00.000-08:00</published><updated>2006-03-10T16:50:17.870-08:00</updated><title type='text'>Connecting to SQL-Server Express on a remote XP SP2 machine</title><content type='html'>If you are experiencing problems connecting to a SQL-Server Express database on an XP SP2 remote box via Remote Desktop - there's a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;896613"&gt;HotFix here&lt;/a&gt; you can get to resolve the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114201975335886042?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114201975335886042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114201975335886042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114201975335886042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114201975335886042'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/03/connecting-to-sql-server-express-on.html' title='Connecting to SQL-Server Express on a remote XP SP2 machine'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114166385732566942</id><published>2006-03-06T08:41:00.000-08:00</published><updated>2006-03-06T08:53:16.326-08:00</updated><title type='text'>New text rendering in .NET 2.0 WinForms</title><content type='html'>Winforms 2.0 added support for drawing GDI text with the new TextRenderer class available in the Systems.Windows.Forms namespace. Using this class to draw strings is now the preferred way instead of using the previous Graphics.DrawString method. So not to break previous WinForms applications, there is a new property on controls called UseCompatibleTextRendering, and if set to True this will draw text as it used to in 1.1.&lt;br&gt;&lt;br&gt;

On application startup, you can globally set this on all controls with: &lt;pre&gt;Application.SetCompatibleTextRenderingDefault(False)&lt;/pre&gt;
 
This draws all the labels in the system much clearer than previous versions especially when using the Tahoma 8.25pt font. When using this font at design time and dragging fields from your datasources window, the labels will line up using the new 2.0 behavior, but if you forget to set this at runtime using the above code, you may notice your labels not lining up properly.&lt;br&gt;&lt;br&gt;
 
If drawing strings manually, like from paint handlers on controls, you'll want to use the new TextRenderer. &lt;br&gt;&lt;br&gt;
 
So instead of:
&lt;pre&gt;Graphics.DrawString(someText, Me.Font, New SolidBrush(Me.ForeColor), rect)&lt;/pre&gt;

Use this code instead:
&lt;pre&gt;TextRenderer.DrawText(Graphics, someText, Me.Font, rect, Me.ForeColor, TextFormatFlags.Left)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114166385732566942?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114166385732566942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114166385732566942' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114166385732566942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114166385732566942'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/03/new-text-rendering-in-net-20-winforms.html' title='New text rendering in .NET 2.0 WinForms'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-114011109274598059</id><published>2006-02-16T09:16:00.000-08:00</published><updated>2006-02-16T09:31:32.776-08:00</updated><title type='text'>ActiveNick is coming to townnnnnnnn...</title><content type='html'>...he knows when your phone is sleeping, he know when your PDA is awake, he knows what's bad and good about the Compact Framework, so come to &lt;a href="http://www.infusionblogs.com/blogs/activenick/archive/2006/02/16/308.aspx"&gt;his sessions&lt;/a&gt; for goodness sake! Oh, you better watch out... &lt;br&gt;&lt;br&gt;

Yep, that's right, &lt;a href="http://www.infusionblogs.com/blogs/activenick/default.aspx"&gt;Nick Landry (a.k.a. ActiveNick)&lt;/a&gt; is coming to San Francisco on March 8th to speak at the &lt;a href="http://www.baynetug.org/DesktopModules/DetailXEvents.aspx?ItemID=220&amp;mid=49"&gt;Bay.NET User group&lt;/a&gt;. &lt;br&gt;&lt;br&gt;

Nick is a good friend of mine and a very dynamic speaker. He'll be giving us a crash course on developing mobility solutions so come on out and see us if you're in town!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-114011109274598059?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/114011109274598059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=114011109274598059' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114011109274598059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/114011109274598059'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/02/activenick-is-coming-to-townnnnnnnn.html' title='ActiveNick is coming to townnnnnnnn...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113824577942557406</id><published>2006-01-25T18:39:00.000-08:00</published><updated>2006-01-26T14:45:49.436-08:00</updated><title type='text'>Binary Serialization of DataSets in .NET 2.0</title><content type='html'>&lt;a href="http://bethmassi.blogspot.com/2006/01/serializing-data-across-time-zones-in.html"&gt;Last week I mentioned&lt;/a&gt; that I would post some test results on the different options we now have with serializing DataSets; Binary (new in 2.0), XML, and custom serialization surrogate. First, let me direct your attention to &lt;a href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=8310A1B6-D3D5-4795-AAE0-F813D11372FC"&gt;an updated surrogate class&lt;/a&gt; that I used in the test that can handle the new DateTimeMode property on columns. 
&lt;BR&gt;&lt;BR&gt;
Now before you read these numbers I'd like to be clear about the scenarios I tested. To make it easy on me I set up the internet test to work with one of our current product's test beds already set up with some real test data. There are two servers in this test bed, one is the application server hosting remote components in IIS (HttpChannel) and accessed by the client using the BinaryFormatter. The second server is the database server. So what I was measuring was also including the time it took to select the records from the database through the components (no business logic, just filling an untyped dataset from a stored proc simple select -- about 19 columns with various data types). The servers are in Florida and I work from home in California where I was running the client. I was accessing them over a cable modem. In the local test I had the exact same code and databse running in all tiers on my local development machine to simulate no network latency. &lt;BR&gt;&lt;BR&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt"&gt;
That said, we don't want look at the numbers per se, look at the trend -- that is what is important here. There are also a lot of factors that affect serialization over the internet on a cable modem and you'll notice that there are a few anomalies
    in the local numbers with small sets of data, probably because my dev machine hiccupped
    at that moment.&lt;/p&gt;
&lt;br /&gt;
So to recap, this is what we're measuring;&lt;br&gt;&lt;br&gt; 
1) The time it takes to make the remote call to activate the component, &lt;br&gt;
2) The time it takes to select the records from the database and create the dataset,&lt;br&gt;
3) In the case of the surrogate class, the time it takes to convert the dataset to a series of byte arrays,&lt;br&gt;
4) The time it takes to transmit the data,&lt;br&gt;
5) In the case of the surrogate class, the time it takes to convert the byte arrays back into a dataset.
&lt;br&gt;
&lt;br /&gt;
My conclusion is that native Binary serialization of datasets is only better over
a long wire when
the number of rows are in the thousands. Our application is 99% data entry forms
so we would never be returning that much data. The surrogate class
does have a slight overhead if your network is not congested/not the internet,
however nothing that the user would notice. Therefore, for now, I'm sticking with the surrogate
class for our application. I'll let you know if I change my mind later
based on more formal load testing.&lt;br /&gt;
&lt;br&gt;
Okay here are the performance numbers:&lt;br&gt;&lt;br&gt;
&lt;table  border="1" cellpadding="0" cellspacing="0" style="width: 620px; font-size: 10pt; font-family: Verdana, Arial;" id="TABLE1"&gt;
  &lt;tr  &gt;
  &lt;td style="background-color: yellow" colspan="7" &gt;LOCAL
  TEST (Low Network Latency) &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td style="width: 76px"  &gt;# Records&lt;/td&gt;
  &lt;td colspan="3"&gt;Size (bytes)&lt;/td&gt;
  &lt;td colspan="3"&gt;Transmission Time (ms)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr  &gt;
  &lt;td   align="center" style="width: 76px"&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td align="center" style="background-color: aqua"&gt;Surrogate&lt;/td&gt;
  &lt;td align="center" style="background-color: lime"&gt;Binary&lt;/td&gt;
  &lt;td align="center" style="background-color: fuchsia"&gt;XML&lt;/td&gt;
  &lt;td align="center" style="background-color: aqua"&gt;Surrogate&lt;/td&gt;
  &lt;td align="center" style="background-color: lime"&gt;Binary&lt;/td&gt;
  &lt;td align="center" style="background-color: fuchsia"&gt;XML&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: fuchsia" &gt;2&lt;/td&gt;
  &lt;td align="right" &gt;13,761&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;56,198&lt;/td&gt;
  &lt;td align="right" style="background-color: fuchsia" &gt;11,673&lt;/td&gt;
  &lt;td align="right" &gt;15.63&lt;/td&gt;
  &lt;td align="right" &gt;31.25&lt;/td&gt;
  &lt;td align="right" style="background-color: fuchsia" &gt;15.63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr  &gt;
  &lt;td   align="right" style="height: 16px; background-color: aqua;"  &gt;10&lt;/td&gt;
  &lt;td align="right" style="height: 16px; background-color: aqua" &gt;15,261&lt;/td&gt;
  &lt;td align="right" style="color: red; height: 16px;" &gt;57,419&lt;/td&gt;
  &lt;td align="right" style="height: 16px" &gt;15,754&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;15.63&lt;/td&gt;
  &lt;td align="right" style="height: 16px" &gt;31.25&lt;/td&gt;
  &lt;td align="right" style="height: 16px" &gt;15.63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr &gt;
  &lt;td   align="right" style="height: 16px; background-color: fuchsia;"  &gt;20&lt;/td&gt;
  &lt;td align="right" style="height: 16px; background-color: aqua"  &gt;17,133&lt;/td&gt;
  &lt;td align="right" style="color: red"  &gt;58,972&lt;/td&gt;
  &lt;td align="right"  &gt;21,018&lt;/td&gt;
  &lt;td align="right"  &gt;31.25&lt;/td&gt;
  &lt;td align="right"  &gt;31.25&lt;/td&gt;
  &lt;td align="right" style="background-color: fuchsia"  &gt;15.63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr  &gt;
  &lt;td   align="right" style="height: 16px; background-color: aqua;"  &gt;100&lt;/td&gt;
  &lt;td align="right" style="height: 16px; background-color: aqua" &gt;32,233&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;71,626&lt;/td&gt;
  &lt;td align="right" &gt;63,434&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;31.25&lt;/td&gt;
  &lt;td align="right"  &gt;31.25&lt;/td&gt;
  &lt;td align="right"  &gt;31.25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="height: 16px; background-color: lime;"  &gt;500&lt;/td&gt;
  &lt;td align="right" style="height: 16px;" &gt;107,336&lt;/td&gt;
  &lt;td align="right" style="color: red; background-color: lime;" &gt;134,641&lt;/td&gt;
  &lt;td align="right" &gt;276,350&lt;/td&gt;
  &lt;td align="right"  &gt;62.50&lt;/td&gt;
  &lt;td align="right" style="background-color: lime" &gt;46.88&lt;/td&gt;
  &lt;td align="right"  &gt;62.50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="height: 16px; background-color: lime;"  &gt;1000&lt;/td&gt;
  &lt;td align="right" style="height: 16px;"  &gt;203,943&lt;/td&gt;
  &lt;td align="right" style="color: red; background-color: lime;"  &gt;216,285&lt;/td&gt;
  &lt;td align="right"  &gt;550,832&lt;/td&gt;
  &lt;td align="right"  &gt;93.75&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;78.13&lt;/td&gt;
  &lt;td align="right"  &gt;109.38&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime;"  &gt;2000&lt;/td&gt;
  &lt;td align="right"  &gt;392,296&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;374,665&lt;/td&gt;
  &lt;td align="right"  &gt;1,087,187&lt;/td&gt;
  &lt;td align="right" &gt;171.88&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;125.00&lt;/td&gt;
  &lt;td align="right"  &gt;250.00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime;"  &gt;4000&lt;/td&gt;
  &lt;td align="right"  &gt;772,451&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;694,776&lt;/td&gt;
  &lt;td align="right"  &gt;2,174,403&lt;/td&gt;
  &lt;td align="right"  &gt;343.75&lt;/td&gt;
  &lt;td align="right" style="background-color: lime" &gt;265.63&lt;/td&gt;
  &lt;td align="right"  &gt;515.63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime;"  &gt;8000&lt;/td&gt;
  &lt;td align="right" &gt;1,521,110&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;1,323,693&lt;/td&gt;
  &lt;td align="right"  &gt;4,383,707&lt;/td&gt;
  &lt;td align="right"  &gt;734.38&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;531.25&lt;/td&gt;
  &lt;td align="right"  &gt;968.75&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td style="width: 76px"  &gt;&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr    &gt;
  &lt;td style="background-color: yellow" colspan="7"  &gt;INTERNET TEST (High Network Latency) &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td style="width: 76px"  &gt;# Records&lt;/td&gt;
  &lt;td colspan="3"&gt;Size (bytes)&lt;/td&gt;
  &lt;td colspan="3"&gt;Transmission Time (ms)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="center" style="width: 76px"&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td align="center" style="background-color: aqua"&gt;Surrogate&lt;/td&gt;
  &lt;td align="center" style="background-color: lime"&gt;Binary&lt;/td&gt;
  &lt;td align="center"&gt;XML&lt;/td&gt;
  &lt;td align="center" style="background-color: aqua"&gt;Surrogate&lt;/td&gt;
  &lt;td align="center" style="background-color: lime"&gt;Binary&lt;/td&gt;
  &lt;td align="center"&gt;XML&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr    &gt;
  &lt;td   align="right" style="width: 76px; background-color: aqua"  &gt;2&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;13,761&lt;/td&gt;
  &lt;td align="right" style="color: red"  &gt;56,198&lt;/td&gt;
  &lt;td align="right"  &gt;11,673&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;312.50&lt;/td&gt;
  &lt;td align="right" &gt;578.13&lt;/td&gt;
  &lt;td align="right"  &gt;312.50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr    &gt;
  &lt;td align="right" style="width: 76px; background-color: aqua"  &gt;10&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;15,261&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;57,419&lt;/td&gt;
  &lt;td align="right" &gt;15,754&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;328.13&lt;/td&gt;
  &lt;td align="right"  &gt;640.63&lt;/td&gt;
  &lt;td align="right" &gt;390.63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: aqua"  &gt;20&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;17,133&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;58,972&lt;/td&gt;
  &lt;td align="right" &gt;21,018&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;343.75&lt;/td&gt;
  &lt;td align="right"  &gt;655.43&lt;/td&gt;
  &lt;td align="right"  &gt;343.75&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: aqua"  &gt;100&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;32,233&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;71,626&lt;/td&gt;
  &lt;td align="right" &gt;63,434&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;421.88&lt;/td&gt;
  &lt;td align="right" &gt;671.88&lt;/td&gt;
  &lt;td align="right"  &gt;593.75&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: aqua"  &gt;500&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;107,336&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;134,641&lt;/td&gt;
  &lt;td align="right" &gt;276,350&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua"  &gt;906.25&lt;/td&gt;
  &lt;td align="right" &gt;1078.13&lt;/td&gt;
  &lt;td align="right"  &gt;1875.00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: aqua"  &gt;1000&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;203,943&lt;/td&gt;
  &lt;td align="right" style="color: red" &gt;216,285&lt;/td&gt;
  &lt;td align="right" &gt;550,832&lt;/td&gt;
  &lt;td align="right" style="background-color: aqua" &gt;1484.38&lt;/td&gt;
  &lt;td align="right"  &gt;1562.50&lt;/td&gt;
  &lt;td align="right"  &gt;3531.25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime"  &gt;2000&lt;/td&gt;
  &lt;td align="right"&gt;392,296&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;374,665&lt;/td&gt;
  &lt;td align="right" &gt;1,087,187&lt;/td&gt;
  &lt;td align="right" &gt;2640.63&lt;/td&gt;
  &lt;td align="right" style="background-color: lime" &gt;2515.63&lt;/td&gt;
  &lt;td align="right"  &gt;6750.00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime"  &gt;4000&lt;/td&gt;
  &lt;td align="right" &gt;772,451&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;694,776&lt;/td&gt;
  &lt;td align="right" &gt;2,174,403&lt;/td&gt;
  &lt;td align="right"  &gt;5312.50&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;4500.00&lt;/td&gt;
  &lt;td align="right"  &gt;13312.50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr   &gt;
  &lt;td   align="right" style="width: 76px; background-color: lime"  &gt;8000&lt;/td&gt;
  &lt;td align="right" &gt;1,521,110&lt;/td&gt;
  &lt;td align="right" style="background-color: lime" &gt;1,323,693&lt;/td&gt;
  &lt;td align="right" &gt;4,383,707&lt;/td&gt;
  &lt;td align="right"  &gt;9687.50&lt;/td&gt;
  &lt;td align="right" style="background-color: lime"  &gt;8406.25&lt;/td&gt;
  &lt;td align="right" &gt;26609.38&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113824577942557406?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113824577942557406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113824577942557406' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113824577942557406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113824577942557406'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/01/binary-serialization-of-datasets-in.html' title='Binary Serialization of DataSets in .NET 2.0'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113786256600509035</id><published>2006-01-21T08:07:00.000-08:00</published><updated>2006-02-16T09:36:53.060-08:00</updated><title type='text'>I LOVE SQL-EXPRESS</title><content type='html'>One of the key features of our products is the ability to support multiple deployment scenarios without recompilation. Scenarios ranging from desktop single user to few user workgroup to client-server to web-based n-tier with the option of NLB. This is all done with configuration files. All of our deployments up to now have been web-based n-tier against SQL-Server 2005. So yesterday the owner of the company asks me to load a single user demo system on his laptop. No problem, this should be fun and a good test of SQL-Express. &lt;br&gt;&lt;br&gt;
I didn't realize how easy this was going to be. First thing was to load &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=220549b5-0b07-4448-8848-dcc397514b41&amp;displaylang=en"&gt;SQL-Server Express edition&lt;/a&gt; on his machine (which also loads .NET Fx 2.0). Since he wanted some demo data, I needed to grab the database on our test DB server. I fired up SSMS, connected to the the test server, detached the database, took a copy the physical Mdf file, then reattached the database. I placed the copy of the database file in the same folder with all our application files and then changed the application connection string to:

&lt;pre&gt;
Data Source=.\SQLEXPRESS;AttachDbFilename=C:\MyAppFolder\DBNAME_Data.mdf;Integrated Security=True;User Instance=True
&lt;/pre&gt;

This sets up a single user file-based connection string. That's it! You don't have to perform an attach or run any sql scripts if you just want single user file-based access. Wow. I love it! This is a REALLY REALLY REALLY nice feature of SQL-Server. This same database file can be attached to a SQL-Server 2005 database server as the scalabiltiy needs of our customers change. Added with our own application deployment options, our product provides solutions for a very broad customer base. Good job Microsoft!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113786256600509035?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113786256600509035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113786256600509035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113786256600509035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113786256600509035'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/01/i-love-sql-express.html' title='I LOVE SQL-EXPRESS'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113768858818159011</id><published>2006-01-19T07:46:00.000-08:00</published><updated>2006-01-19T08:36:28.206-08:00</updated><title type='text'>Serializing data across time zones in .NET 2.0</title><content type='html'>This week I've been implementing support in our framework for the new DateTimeMode setting on the DataColumn class. This property is used on DateTime columns to determine a couple things; 1) it specifies how dates should be stored in the column and 2) how a date should be serialized when marshalling across time zones. Setting the DateTimeMode to Local or Utc will not only affect serialization but will also affect how the data is stored in the column. Setting to Unspecified or UnspecifiedLocal does not affect the storage, just the serialization. In .NET 1.x the dataset would always serialize dates as UnspecifiedLocal. This means it would apply the appropriate local time offset when it deserialized. So if you entered the value 12/1/2005 00:00:00 in Florida and passed that dataset to California it would show up as 11/30/2005 21:00:00. This can be a problem depending on the meaning of the datetime value. If you are say storing this in a database and/or not using the time part, when you display the date part to the user you have a problem. 
&lt;br&gt;&lt;br&gt;
One way to solve this in 1.x is to use a &lt;a href="http://bethmassi.blogspot.com/2004/12/binary-serialization-of-datasets.html#comments"&gt;surrogate class&lt;/a&gt; which also provides the added ability to serialize the data as true binary. When wrapping the dates up in the surrogate before serialization, you can have it not apply the offset to the DateTime columns. However this approach works across the entire set of columns in the dataset; there's no granularity.
&lt;br&gt;&lt;br&gt;
So here comes the DateTimeMode in .NET 2.0. You can set each individual column to the mode you want and the serialization will behave exactly how you want. Great. So lets start designing our typed datasets and you'll notice a DateTimeMode property in the property sheet in the designer. Set that to the mode you want and regenerate your typed datasets... right? WRONG. There's a bug in the designer (and XSD.EXE) where it refuses to code spit the DateTimeMode even though it's properly declared in the xsd file. Well that totally sucks. For more info &lt;a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=8f40940d-ec75-4910-95b8-535757d4e3e9"&gt;see the bug report&lt;/a&gt;. 
&lt;br&gt;&lt;br&gt;
So the work around is that you have to set the DateTimeMode at runtime before serializing. Also be careful if your merging an untyped dataset into a typed dataset because the DateTimeMode on the typed dataset will prevail in that case. (See the documentation on compatible merges.)
&lt;br&gt;&lt;br&gt;
So with all the workaround code I now have running I turn my attention to the new binary serialization support in the 2.0 DataSet. My initial performance numbers are NOT impressive at all. In fact, the Xml serialization is much faster for small sets of data. This is in drastic contrast to the surrogate class I was using in 1.x. The surrogate class performs better in all cases. I'm updating the surrogate to include the new DateTimeMode support and once I have it all tested I'll post a new GotDotNet sample. I'll also post some more formal numbers once I finish my tests. 
&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113768858818159011?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113768858818159011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113768858818159011' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113768858818159011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113768858818159011'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/01/serializing-data-across-time-zones-in.html' title='Serializing data across time zones in .NET 2.0'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113711806290349268</id><published>2006-01-12T17:46:00.000-08:00</published><updated>2006-01-12T18:07:42.930-08:00</updated><title type='text'>Happy New Year and all that jazz....</title><content type='html'>HAPPY NEW YEAR! 
&lt;br&gt;&lt;br&gt;
Okay I know it's a little late. Sorry I haven't posted in a long while but lots of things were going on for me during the holidays. 
&lt;br&gt;&lt;br&gt;
For one, I was heads down for the last month upgrading our framework to take advantage of .NET 2.0 and Visual Studio 2005. Things like generics, custom events, ADO.NET enhancements, new WinForms data binding stuff to mention a few. I've also been playing around with the Visual Studio Team System Tester load test tools. Love it. &lt;br&gt;&lt;br&gt;
Also, I was busy in December prepping for my first Christmas dinner. Thank god for my sister. She's a Martha Stewart Wonder Woman. I couldn't have done it without her. She's a scientist (a real one, not computers) and she had the entire Christmas prep and dinner planned out in an Excel spreadsheet. The roast leaving the oven was T-minus zero and everything before the roast was negative minutes and everything after the roast was positive numbers. Of course, at time of execution we ended up drinking too much champagne and the whole planning spreadsheet went out the window and the "Force" took over. We did great though; even Nona said it was a wonderful dinner. I love cooking but I need to watch more Emeril.
&lt;br&gt;&lt;br&gt;
Finally, Alan and I threw a NYE party and it was off the hook (do people say that anymore?). Anyways, it was a lot of fun. All the neighbors came and we all got drunk on ice wine martinis my sister was shaking. Some got a little too drunk. Luckily I'm a beer drinker and maintained my cool (and my dinner unlike some people who used my bathroom). Only two broken glasses and no one in the hospital so it was a success. &lt;br&gt;&lt;br&gt;
Resolutions this year? Blog more, read more, get an Xbox 360 and set up media center, get new furnaces, and find a landscaper before the weeds outside grow to "Land of the Lost" size this spring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113711806290349268?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113711806290349268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113711806290349268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113711806290349268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113711806290349268'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2006/01/happy-new-year-and-all-that-jazz.html' title='Happy New Year and all that jazz....'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113157017263063999</id><published>2005-11-09T12:55:00.000-08:00</published><updated>2005-11-09T13:08:29.800-08:00</updated><title type='text'>Boy, were they ready!</title><content type='html'>What an exciting launch. Microsoft spent a ton of money on this marketing campaign and it showed! They had the guys from the show &lt;a href="http://dsc.discovery.com/fansites/amchopper/amchopper.html"&gt;American Choppers&lt;/a&gt; build a motorcycle and Paul Sr. drove it into the crowd and allowed all the attendies to take a photo with him and Mikey. (I love that show so it was exciting for me!) They also got the rock band &lt;a href="http://www.cheaptrick.com/"&gt;Cheap Trick&lt;/a&gt; to play a concert that evening - they rocked. &lt;br&gt;&lt;br&gt;

I was stationed at the Ask The Experts lounge, the Enterprise Developer cabana and helped out over in the Hands on Lab. I had a lot of positive customer experiences and interesting conversations. &lt;br&gt;&lt;br&gt;
 
Everyone at the event received a full licensed copy of SQL-Server 2005 Standard edition and Visual Studio 2005 Professional edition packaged to look like two platinum record albums. I ended up with a backstage pass and on my copy I got autographs of Paul Sr. and Mikey as well as the lead singer of Cheap Trick, Robin Zander.&lt;br&gt;&lt;br&gt;
 
If you can make it to one of the &lt;a href="http://www.msdnevents.com/launch/"&gt;Launch events in your area &lt;/a&gt;I would highly recommend attending. Thank you Microsoft for a great day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113157017263063999?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113157017263063999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113157017263063999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113157017263063999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113157017263063999'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/11/boy-were-they-ready.html' title='Boy, were they ready!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-113112595252142402</id><published>2005-11-04T09:30:00.000-08:00</published><updated>2005-11-04T09:40:11.146-08:00</updated><title type='text'>Are you ready to rock!?</title><content type='html'>&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?culture=en-US&amp;eventid=1032280970#ggviewer-offsite-nav-9056552"&gt;Visual Studio 2005 Launch Event - San Francisco&lt;/a&gt;&lt;br&gt;
This Monday is the SF launch event! I'll be hanging out in the Ask The Experts lounge from 10am-12:30pm and then at the Enterprise Developer copa-cabana from 1:30-2:45pm. Come by and say hello!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-113112595252142402?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/113112595252142402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=113112595252142402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113112595252142402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/113112595252142402'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/11/are-you-ready-to-rock.html' title='Are you ready to rock!?'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112827629946113043</id><published>2005-10-02T10:27:00.000-07:00</published><updated>2005-10-02T11:04:59.473-07:00</updated><title type='text'>MVP Summit is over...</title><content type='html'>Ahhhh... I'm still recovering from the MVP Summit "social activities". ;-) It was a great summit. I learned a lot and saw a ton of amazing stuff coming from the Microsoft camp. I'm really excited about the future. &lt;br&gt;&lt;br&gt;

In my search for the answer to the question "What is an Architect?" I realized that even the other architects I spoke with had the same question. It was interesting to hear different views on what an architect is and what the architect MVPs actually did. I don't think there really is a clear definition of what an architect is or does exactly, however, I did learn that all architects have a couple things in common. &lt;br&gt;&lt;br&gt;

Architects are open minded people that can accept other people's solutions to particular problems. As long as the solution meets the problem's performance and scalability needs and the solution is easily maintainable then an architect will buy into your design. Architects balance the needs of the business and the needs of the system. They are sensitive to construction costs and maintenance costs based on the people designing and maintaining the system. They understand (or are at least aware of) the proven patterns of not only software solutions but also business processes. &lt;br&gt;&lt;br&gt;

Regardless of whether you are an enterprise connected systems architect or a software product architect or an infrastructure architect, you are sensitive to the construction and maintenance costs of your solution with your particular group of people and your particular business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112827629946113043?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112827629946113043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112827629946113043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112827629946113043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112827629946113043'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/10/mvp-summit-is-over.html' title='MVP Summit is over...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112784039929920437</id><published>2005-09-27T09:34:00.000-07:00</published><updated>2005-09-27T10:02:47.436-07:00</updated><title type='text'>MVP Summit here I come!</title><content type='html'>I'm working from a downtown Seattle hotel with a beautiful view today -- tomorrow the MVP Summit starts. Someone forgot to tell Seattle that summer is over, it's absolutely gorgeous here! &lt;br&gt;&lt;br&gt;

I'm really looking forward to meeting my fellow architect MVPs. I'm interested to see exactly what other "architects" actually do. Connected systems, business applications, products, infrastructure, databases, all of the above? How much code do they actually write? How many developers do they direct? How much influence do they have on the business? Are they typically consultants or employees? What is an architect anyway? &lt;a href="http://www.microsoft.com/architecture/default.aspx?pid=share.vision&amp;abver=FEEB2E89-4412-4C58-A7F8-9B2CA0E0BDAC"&gt;Microsoft's vision for architecture&lt;/a&gt; sounds a little fluffy to me. I'm hoping to walk away from the summit with a much clearer picture. &lt;br&gt;&lt;br&gt;

Of course, I'm also excited about seeing the new &lt;a href="http://www.xbox.com/en-US/news/2005/0914-xbox360launchdates.htm"&gt;XBox 360&lt;/a&gt; ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112784039929920437?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112784039929920437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112784039929920437' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112784039929920437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112784039929920437'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/09/mvp-summit-here-i-come.html' title='MVP Summit here I come!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112723008737139797</id><published>2005-09-20T08:05:00.000-07:00</published><updated>2005-09-20T08:28:07.380-07:00</updated><title type='text'>Tragedy Hits the Fox Community</title><content type='html'>On Friday Drew Speedie and his son, Brent, fell a few hundred feet to their deaths from a bridge in Yellowstone Park while vacationing there. My heart goes out to Irene his wife. Drew was a Visual FoxPro MVP and regular conference speaker and writer. &lt;br&gt;&lt;br&gt;
I remember the first time I ever met Drew was at the Visual FoxPro 6.0 DevCon in May 1998 in Orlando. I remember how funny and engaging he was showing off the VFP Grid. Drew was great at showing you the ins and outs and tips and tricks of a particular feature -- things you never thought of. &lt;br&gt;&lt;br&gt;
The first time I ever met Brent was at an Essential Fox conference (I think 3 years ago) in Kansas City. The first thing that came to mind when talking with him was "Wow, this kid is smart. And just like his father." He was very engaging and had the same wit as Drew during our conversation about Arizona. The last time I spoke with Drew he told me about some beautiful places to visit in Arizona -- I think I'll have to go see them now.&lt;br&gt;&lt;br&gt;

For more information please &lt;a href="http://fox.wikis.com/wc.dll?Wiki~DrewSpeedieTragedy"&gt;visit the FoxWiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112723008737139797?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112723008737139797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112723008737139797' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112723008737139797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112723008737139797'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/09/tragedy-hits-fox-community.html' title='Tragedy Hits the Fox Community'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112682233689372698</id><published>2005-09-15T14:57:00.000-07:00</published><updated>2005-09-16T10:37:38.266-07:00</updated><title type='text'>The exciting future of Visual Basic</title><content type='html'>Make sure you check out the &lt;a href="http://msdn.microsoft.com/vbasic/future/"&gt;Future Versions&lt;/a&gt; section of the VB site for information on LINQ. You can even &lt;a href="http://download.microsoft.com/download/2/a/4/2a405b66-1b1c-4fca-bfbf-007aad63d307/LINQ VB Preview.msi"&gt;download a preview of this technology&lt;/a&gt; which works with the release candidate of Visual Studio! And if you haven't read this yet, &lt;a href="http://msdn.microsoft.com/vbasic/future/default.aspx?pull=/library/en-us/dnvs05/html/vb9overview.asp"&gt;this MSDN paper is a great overview of Visual Basic 9.0&lt;/a&gt;. Man! VS 2005 isn't even released yet and I'm drooling over the features of the next version after that! Sigh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112682233689372698?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112682233689372698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112682233689372698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112682233689372698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112682233689372698'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/09/exciting-future-of-visual-basic.html' title='The exciting future of Visual Basic'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112671417697408061</id><published>2005-09-14T08:30:00.000-07:00</published><updated>2005-09-14T09:12:47.990-07:00</updated><title type='text'>A fundamental shift in programming for most, a sigh of relief and a breath of excitement for us!</title><content type='html'>&lt;a href="http://www.panopticoncentral.net/"&gt;Paul Vick&lt;/a&gt; formally announced &lt;a href="http://www.panopticoncentral.net/archive/2005/09/13/10501.aspx"&gt;Project LINQ&lt;/a&gt; yesterday at &lt;a href="http://msdn.microsoft.com/events/pdc/"&gt;PDC&lt;/a&gt;. LINQ stands for "Language Integrated Query". LINQ brings standard query operations into the .NET platform. Wow, an object oriented language with rich query syntax... hmmmm... sounds vaguely familiar ;-). This is what I've personally been waiting for ever since I moved into .NET programming from Visual FoxPro work. Paul is right; this does represent a fundamental shift in programming for most developers. When you have a language that supports this style of programming, the architecture of your applications change. You start to think about dynamic data (and metadata) as the engine of your application. It's not to say you can't create dynamic data-driven applications right now in .NET, it's just a lot harder. When you can write elegant queries directly into the editor you tend to favor that expressive style when working with data instead of a rigid strongly-typed object approach. For instance you could write a function that performs some complex operations on changing data but apply it inside of a select query for only the matching pieces of data; and you can do it in 5-10 lines of code instead of 100 lines of for each's and if statements. &lt;br&gt;&lt;br&gt;

Now for the people of the Fox this is the only logical way to work with data inside of an application so I think that's one of the major reasons people stay working with Visual FoxPro. However, VFP is not a strongly-typed language, it's execution is slower and it's based on COM. But because VFP is loosely-typed you can get away with a lot of slick dynamic, scripting-style programming. &lt;br&gt;&lt;br&gt;

What the architects of LINQ are doing is amazing. They are bringing query comprehension to a strongly-typed environment. However, I'm personally excited about the future of VB.NET. VB.NET is strongly-typed AND loosely-typed at the same time. In my opinion that will make VB.NET the preferred data-oriented programming language and the language of the future -- especially for information systems. &lt;br&gt;&lt;br&gt;

I hope that Visual FoxPro programmers will take a hard look at VB.NET if they haven't already. There is a lot of opportunity for you here because we already know how data-based applications should be written using query in the language and we can provide invaluable feedback to the architects of LINQ and VB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112671417697408061?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112671417697408061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112671417697408061' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112671417697408061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112671417697408061'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/09/fundamental-shift-in-programming-for.html' title='A fundamental shift in programming for most, a sigh of relief and a breath of excitement for us!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112602378799581649</id><published>2005-09-06T09:08:00.000-07:00</published><updated>2005-09-06T09:23:45.416-07:00</updated><title type='text'>I'm speaking at the Bay.NET UG on Thursday</title><content type='html'>&lt;a href="http://www.baynetug.org/DesktopModules/DetailXEvents.aspx?ItemID=179&amp;mid=143"&gt;I'm speaking on Thursday&lt;/a&gt; for the &lt;a href="http://www.baynetug.org/DesktopDefault.aspx?tabindex=1&amp;tabid=26"&gt;Bay.NET user group&lt;/a&gt; down in Pleasanton. So if you rather see me than the Raiders vs. Patriots game (I know it's a tough decision) then come on out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112602378799581649?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112602378799581649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112602378799581649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112602378799581649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112602378799581649'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/09/im-speaking-at-baynet-ug-on-thursday.html' title='I&apos;m speaking at the Bay.NET UG on Thursday'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112492554692055565</id><published>2005-08-24T15:59:00.000-07:00</published><updated>2005-08-24T16:19:39.216-07:00</updated><title type='text'>The Fox is out of the bag</title><content type='html'>In the &lt;a href="http://msdn.microsoft.com/vfoxpro/letters/"&gt;Visual FoxPro August Newsletter&lt;/a&gt; in a paragraph regarding the SouthwestFox conference Ken mentions: "Calvin's presentation will be on great demos of new language features being added to a future version of Visual Basic for data-centric .NET programming significantly based on Visual FoxPro technology." &lt;br&gt;&lt;br&gt; 

On a related note, &lt;a href="http://www.panopticoncentral.net/archive/2005/08/03/10281.aspx"&gt;Paul Vick punches up the abstract&lt;/a&gt; on his PDC topic &lt;a href="http://commnet.microsoftpdc.com/content/sessionview.aspx?TopicID=1c6872c8-7968-44d1-983c-eb36b3032426"&gt;Visual Basic: Future Directions in Language Innovation&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
Hip hip, HOORAY!!!! And the crowd goes wild......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112492554692055565?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112492554692055565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112492554692055565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112492554692055565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112492554692055565'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/08/fox-is-out-of-bag.html' title='The Fox is out of the bag'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112432429570900696</id><published>2005-08-17T17:18:00.000-07:00</published><updated>2005-08-17T17:18:15.716-07:00</updated><title type='text'>Back from vacation</title><content type='html'>Ahhhh. I love summer. This year we drove up the west coast from San Francisco to Seattle. The first day we made our way through the redwoods up to &lt;a href="http://www.redwoods.info/"&gt;Humboldt County&lt;/a&gt;. We stopped in Eureka and stayed at the &lt;a href="http://www.carterhouse.com/"&gt;Carter House Inn&lt;/a&gt;. It was beautiful and lots of fun. It was foggy in the morning but it cleared up and was sunny and mild in the afternoon- typical Northern California costal weather for August. &lt;br&gt;&lt;/br&gt;

We then headed up the coast into Oregon, stopping at every tourist trap along the way -- &lt;a href="http://www.confusionhill.com/"&gt;Confusion Hill&lt;/a&gt;, &lt;a href="http://www.treesofmystery.net/"&gt;Trees of Mystery&lt;/a&gt;, and the Enchanted Forest (complete with concrete dinosaurs). We made our way up to a camground near Dune City, OR - 8 miles south of Florence - and camped there for two nights. We hiked to the beach in the morning -- pretty easy walk, actually -- and collected shells and played on the beach with the seal lions. It was just me, Alan and the lions -- no one else for miles. A man did come out of nowhere and strolled up to us. But he gave me some cool agate stones and a whole sand dollar he found on the beach. He was cool. &lt;br&gt;&lt;br&gt;

After our relaxing two days we headed up to Seattle via I-5 through Portland. We needed to meet a friend who was flying in that night for Alan's birthday. Of course the flight was delayed 2 hours (because she flew Alaska Airlines) and she missed the dinner party. I should have figured. Alaska is ALWAYS delayed no matter what time of year. You're better off flying SouthWest (if you don't mind being hearded like cattle). &lt;br&gt;&lt;br&gt;

The rest of the week we spent visiting friends in Seattle and going up to Victoria, Canada (yes we went to &lt;a href="http://www.butchartgardens.com/main.php"&gt;Butchart Gardens &lt;/a&gt;;-)). It was cold and overcast in Seattle (naturally!) but Victoria was nice and sunny. &lt;br&gt;&lt;br&gt;

It's nice to be back home. Visiting other places really makes me appreciate where I live. Summer is still in full swing here in the East Bay and I'm looking forward to spending the rest of it at home. Well, maybe I'll go camping on &lt;a href="http://www.parks.ca.gov/default.asp?page_id=517"&gt;Mount Diablo&lt;/a&gt; one weekend with my sister, but that's only a 20 minute drive ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112432429570900696?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112432429570900696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112432429570900696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112432429570900696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112432429570900696'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/08/back-from-vacation.html' title='Back from vacation'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-112109885887537398</id><published>2005-07-11T09:03:00.000-07:00</published><updated>2005-07-11T09:20:58.883-07:00</updated><title type='text'>VB.NET as a dynamic, data language</title><content type='html'>Personally, I am &lt;em&gt;very&lt;/em&gt; excited about what &lt;a href="http://www.panopticoncentral.net/archive/2005/07/08/10032.aspx"&gt;Paul says in his post here&lt;/a&gt;. This is one of the biggest reasons why I love VB.NET (and VFP), and it looks like there will be some very exciting things to look forward to after VS2005. Make sure to check out &lt;a href="http://pico.vub.ac.be/~wdmeuter/RDL04/papers/Meijer.pdf"&gt;this paper&lt;/a&gt; (which Paul links to from his post) by Erik Meijer and Peter Drayton.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-112109885887537398?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/112109885887537398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=112109885887537398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112109885887537398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/112109885887537398'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/07/vbnet-as-dynamic-data-language.html' title='VB.NET as a dynamic, data language'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111992448651997802</id><published>2005-06-27T19:02:00.000-07:00</published><updated>2005-06-27T19:08:06.530-07:00</updated><title type='text'>Back Home from DevTeach</title><content type='html'>Well I'm back home from &lt;a href="http://www.devteach.com"&gt;DevTeach&lt;/a&gt; which was held in beautiful Montreal. If anyone was looking for the rest of the presentation demos and slides they are all up on the DevTeach site now. I met lots of new friends this trip that I hope to keep for a long time to come. Thanks to everyone at DevTeach for a wonderful conference!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111992448651997802?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111992448651997802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111992448651997802' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111992448651997802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111992448651997802'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/06/back-home-from-devteach.html' title='Back Home from DevTeach'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111825051176162050</id><published>2005-06-08T10:02:00.000-07:00</published><updated>2005-06-08T10:18:41.176-07:00</updated><title type='text'>VS/SQL-Server 2005 Release Date Announced</title><content type='html'>The release dates for the next versions of Visual Studio, BizTalk and SQL-Server were announced at Tech Ed to be the week of Nov. 7th. A few places to read about it are &lt;a href="http://www.informationweek.com/story/showArticle.jhtml?articleID=164301022&amp;tid=13692"&gt;here&lt;/a&gt;, &lt;a href="http://www.integratedmar.com/ECL.cfm?item=DLY060705-05"&gt;here&lt;/a&gt; and &lt;a href="http://www.theregister.co.uk/2005/06/08/_visual_studio_launch/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111825051176162050?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111825051176162050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111825051176162050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111825051176162050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111825051176162050'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/06/vssql-server-2005-release-date.html' title='VS/SQL-Server 2005 Release Date Announced'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111764591637663061</id><published>2005-06-01T10:06:00.000-07:00</published><updated>2005-06-01T10:11:56.390-07:00</updated><title type='text'>Bonus Session at DevTeach</title><content type='html'>If you're coming to &lt;a href="http://www.devteach.com"&gt;DevTeach&lt;/a&gt;, you should definately check out the &lt;a href="http://www.devteach.com/BonusSession.asp"&gt;architecture bonus session&lt;/a&gt;. I'll be sitting on a panel with a bunch of really cool architecture dudes. Plus &lt;a href="http://www.activenick.net/"&gt;Nick Landry&lt;/a&gt; is going to be the animator so it should be a lot of fun! Hope to see you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111764591637663061?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111764591637663061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111764591637663061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111764591637663061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111764591637663061'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/06/bonus-session-at-devteach.html' title='Bonus Session at DevTeach'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111638227517093288</id><published>2005-05-17T18:03:00.000-07:00</published><updated>2005-05-17T19:11:15.216-07:00</updated><title type='text'>Make your .NET demos better with a TraceListener</title><content type='html'>Last night I was writing a sample application for one of my &lt;a href="http://www.devteach.com/"&gt;DevTeach&lt;/a&gt; sessions and I thought I'd share this little trick. If you've ever tried to fiqure out a speaker's sample code after the conference when you got home you'd appreciate this as well. Usually I just write copious amounts of comments in my code to help people but last night it dawned on me how I could add a very simple TraceListener to my application to easily display the application's sequence of events in a list box. This way the developer could see exactly what was going on at runtime without having to debug the code.&lt;br&gt;&lt;br&gt;

If you're unfamiliar with TraceListeners have a &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticstraceclasslistenerstopic.asp"&gt;read here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;

Trace listeners monitor the output of the Debug and Trace messages in an application. You can create custom listeners and then add them to the Debug or Trace Listeners collection on application startup quite easily:
&lt;pre&gt;
Imports System.Diagnostics

Public Class Main
 ''' --------------------------------------------------------------
 ''' &amp;lt;summary&amp;gt;
 ''' Main enrty point for the application.
 ''' &amp;lt;/summary&amp;gt;
 ''' &amp;lt;remarks&amp;gt;
 ''' &amp;lt;/remarks&amp;gt;
 ''' &amp;lt;history&amp;gt;
 '''  [Beth] 5/16/2005 Created
 ''' &amp;lt;/history&amp;gt;
 ''' --------------------------------------------------------------
 Shared Sub Main()
  '-- Registers a trace listener 
  &lt;b&gt;Debug.Listeners.Add(New DemoAppTraceListener)&lt;/b&gt;

  Application.Run(New MainForm)
 End Sub
End Class
&lt;/pre&gt;

The idea for the DemoAppTraceListener class is very simple. I just want to globally broadcast the trace messages so that they could be displayed by the application anywhere. We can do this by declaring a Shared (static) event:

&lt;pre&gt;
Imports System.Diagnostics

''' -----------------------------------------------------------------------------
''' Project  : DataCachingStrategies
''' Class  : DemoAppTraceListener
''' 
''' -----------------------------------------------------------------------------
''' &amp;lt;summary&amp;gt;
''' Globally broadcasts the trace messages in this demo which are displayed in the UI.
''' &amp;lt;/summary&amp;gt;
''' &amp;lt;remarks&amp;gt;
''' &amp;lt;/remarks&amp;gt;
''' &amp;lt;history&amp;gt;
'''  [Beth] 5/16/2005 Created
''' &amp;lt;/history&amp;gt;
''' -----------------------------------------------------------------------------
Public Class DemoAppTraceListener
 Inherits TraceListener

 &lt;b&gt;Public Shared Event MessageReceived(ByVal e As MessageEventArgs)&lt;/b&gt;

 Public Overloads Overrides Sub Write(ByVal message As String)
  RaiseEvent MessageReceived(New MessageEventArgs(message))
 End Sub

 Public Overloads Overrides Sub WriteLine(ByVal message As String)
  RaiseEvent MessageReceived(New MessageEventArgs(message))
 End Sub

End Class

''' -----------------------------------------------------------------------------
''' Project  : DataCachingStrategies
''' Class  : MessageEventArgs
''' 
''' -----------------------------------------------------------------------------
''' &amp;lt;summary&amp;gt;
''' This EventArg is used to broadcast messages from the DemoAppTraceListener.
''' &amp;lt;/summary&amp;gt;
''' &amp;lt;remarks&amp;gt;
''' &amp;lt;/remarks&amp;gt;
''' &amp;lt;history&amp;gt;
'''  [Beth] 5/16/2005 Created
''' &amp;lt;/history&amp;gt;
''' -----------------------------------------------------------------------------
Public Class MessageEventArgs
 Inherits EventArgs

 Private m_msg As String = String.Empty
 Public ReadOnly Property Message() As String
  Get
   Return m_msg
  End Get
 End Property

 Public Sub New(ByVal msg As String)
  m_msg = msg
 End Sub
End Class
&lt;/pre&gt;

Now all you have to do is handle the event and display the messages. Oh, yea you also have to actually put Trace messages in your code now too! 

&lt;pre&gt;
Public Sub Foo
        Trace.Write("Entering Foo method")
.
.
.
End Sub
&lt;/pre&gt;

To display the messages in my demo I created an MDI parent and put a simple list box on the bottom. Then I just added a handler to the DemoAppTraceListener.MessageReceived event. I added the handler in the constructor because this code is hidden in the form designer region and people won't be distracted away from the demo code.

&lt;pre&gt;
#Region " Windows Form Designer generated code "

Public Sub New()
 MyBase.New()

 'This call is required by the Windows Form Designer.
 InitializeComponent()

 'Add any initialization after the InitializeComponent() call
 &lt;b&gt;AddHandler DemoAppTraceListener.MessageReceived, AddressOf Me.DisplayMessage&lt;/b&gt;
End Sub
.
.
.
&lt;/pre&gt;
Finally I added the few lines of code to display the message in the list box and select the last message:

&lt;pre&gt;
Private Sub DisplayMessage(ByVal e As MessageEventArgs)
 Me.lstMsgs.Items.Add(Me.lstMsgs.Items.Count.ToString + ". " + e.Message)
 Me.lstMsgs.SelectedIndex = Me.lstMsgs.Items.Count - 1
End Sub
&lt;/pre&gt;

Another cool thing about using a TraceListener is that the developer can still copy/paste the code in the demo into their own applications without having to remove the Trace messages if they don't want to. &lt;br&gt;&lt;br&gt;

Now if you come to my data &lt;a href="http://www.devteach.com/Session.asp#15"&gt;caching session at DevTeach&lt;/a&gt; you'll get to see the TraceListener in action! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111638227517093288?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111638227517093288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111638227517093288' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111638227517093288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111638227517093288'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/05/make-your-net-demos-better-with.html' title='Make your .NET demos better with a TraceListener'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111609000797707029</id><published>2005-05-14T09:34:00.000-07:00</published><updated>2005-05-14T10:00:07.986-07:00</updated><title type='text'>A component walks into a bar....</title><content type='html'>The component asks the bartender via .NET remoting:&lt;br&gt;
"Gimme a beer"&lt;br&gt;
Bartender:&lt;br&gt;
"What kind of beer?"&lt;br&gt;
Component:&lt;br&gt;
"Just give me all of them one by one and I'll drink the one I like."&lt;br&gt;
&lt;br&gt;
The component asks the bartender via Web Services:&lt;br&gt;
"Gimme a beer"&lt;br&gt;
Bartender:&lt;br&gt;
"What kind of beer?"&lt;br&gt;
The component thinks a minute. &lt;br&gt;
"I didn't know you'd have more than one. I just want a beer."&lt;br&gt;
Bartender:&lt;br&gt;
"What kind of beer?"&lt;br&gt;
Component: &lt;br&gt;
"A plain one."&lt;br&gt;
Bartender:&lt;br&gt;
"What's plain beer? How about a bud?"&lt;br&gt;
Component: &lt;br&gt;
"Umm.. ok."&lt;br&gt;
The component tries to take the beer but it slips onto the floor and the glass breaks. &lt;br&gt;
Bartender:&lt;br&gt;
"What's wrong with you?"&lt;br&gt;
Component: &lt;br&gt;
"I got a slippery SoapException."&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111609000797707029?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111609000797707029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111609000797707029' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111609000797707029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111609000797707029'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/05/component-walks-into-bar.html' title='A component walks into a bar....'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111535222494535442</id><published>2005-05-05T20:43:00.000-07:00</published><updated>2005-05-05T22:00:35.870-07:00</updated><title type='text'>Refactor, refactor, REFACTOR!</title><content type='html'>So much for &lt;a href="http://www.panopticoncentral.net/archive/2003/10/31/233.aspx"&gt;hiding the word "refactor" from VB.NET developers&lt;/a&gt;... (oh how I love the fact &lt;a href="http://msdn.microsoft.com/vbasic/downloads/2005/tools/refactor/"&gt;that it's spelled with a big fat exclamation point!!!!&lt;/a&gt;)&lt;br&gt;&lt;br&gt;

&lt;a href="http://msdn.microsoft.com/vbasic/downloads/2005/tools/refactor/refactorwhitepaper/"&gt;Have you taken a look at this new VB 2005 refactoring?&lt;/a&gt; I think this refactoring interface blows doors off the C# one. Everything is context sensitive right at your fingertips and all inline with the code editor -- no modal dialogs! And it's just a whole heck of a lot smarter about what you would want to do with the selected code. Any developer will be able to pick this up in two minutes. Thank you Microsoft for &lt;a href="http://www.devexpress.com/Home/Announces/Refactor.xml"&gt;making such an awesome deal &lt;/a&gt;with Developer Express to provide us all with this free tool. (I think there's a C# one you can buy for $99.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111535222494535442?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111535222494535442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111535222494535442' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111535222494535442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111535222494535442'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/05/refactor-refactor-refactor.html' title='Refactor, refactor, REFACTOR!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111410634687080175</id><published>2005-04-21T10:54:00.000-07:00</published><updated>2005-04-21T10:59:06.870-07:00</updated><title type='text'>Custom Exceptions and Remoting</title><content type='html'>I just thought I'd put up a reminder post about enabling the throwing of custom exceptions from your remote objects since this was a change from 1.0 to 1.1. It recently bit me in the butt when I was setting up a new system. If you need to throw your own exceptions from your remote objects that are hosted in IIS, you need to make sure that customErrors="Off" in your Web.config file. By default it's set to "RemoteOnly" which means it will work on your development machine, but not when clents requests are coming from remote machines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111410634687080175?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111410634687080175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111410634687080175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111410634687080175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111410634687080175'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/custom-exceptions-and-remoting.html' title='Custom Exceptions and Remoting'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111342834494532268</id><published>2005-04-13T14:34:00.000-07:00</published><updated>2007-04-26T11:42:34.488-07:00</updated><title type='text'>Combobox Databinding Woes</title><content type='html'>&lt;strong&gt;UPDATE: This post is for Visual Studio 2003. For Visual Studio 2005 content &lt;a href="http://blogs.msdn.com/bethmassi/archive/2007/04/25/tips-on-related-data-binding-and-comboboxes.aspx"&gt;please see this post&lt;/a&gt;.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;

I've been noticing a lot of questions on the newsgroups related to Winforms databinding and the combobox and I thought I'd post something up here to help people out. There are a couple very common scenarios in which people use the combobox:&lt;br&gt;&lt;br&gt;

1. To display information from a lookup table and send the selected value into another table's field.&lt;br&gt;&lt;br&gt;

2. To display a list of parent table's records and use that as a filter to display related child records. For instance, as the user selects a record in the combobox, you want to display all the related child records in a grid.&lt;br&gt;&lt;br&gt;

As usual, the trick is setting up the data binding properly and using the currency managers. In the first case it's not necessary to set up a data relation in your dataset between the lookup table and the table you're editing, but it doesn't hurt. In the second case it is necessary to create a relation between your parent and child tables. Let's take an example from our beloved Northwind:&lt;br&gt;&lt;br&gt;

&lt;pre&gt;
Private Const SQL_CONNECTION_STRING As String = _
 "Data Source=localhost;" &amp; _
 "Initial Catalog=Northwind;" &amp; _
 "Integrated Security=SSPI"

Try
 Dim ds As New DataSet
 Dim cnn As New SqlConnection(SQL_CONNECTION_STRING)

 Dim da As New SqlDataAdapter("SELECT * FROM Region", cnn)
 da.Fill(ds, "Region")

 da = New SqlDataAdapter("SELECT * FROM Territories", cnn)
 da.Fill(ds, "Territories")

 ds.Relations.Add("Region_Territories", _
  ds.Tables("Region").Columns("RegionID"), _
  ds.Tables("Territories").Columns("RegionID"))

 ds.DataSetName = "RegionTerritories"

Catch Exp As Exception
 MessageBox.Show(Exp.Message)
End Try
&lt;/pre&gt;

In the first scenario we want to select a Region from the combobox and have that value populated into the Territorries record. In this case you'll need to set up the following properties on your Combobox:

&lt;pre&gt;
Me.ComboBox1.DataSource = ds.Tables("Region")
Me.ComboBox1.DisplayMember = "RegionDescription"
Me.ComboBox1.ValueMember = "RegionID"
&lt;/pre&gt;

These properties control what items are displayed in the combobox and what value is used when the user makes a selection. Now to get that value into the Territories table, you'll need to set up a data binding:

&lt;pre&gt;
Me.ComboBox1.DataBindings.Add("SelectedValue", ds, "Territories.RegionID")
&lt;/pre&gt;

Okay we're all set, right? Well... not exactly. You'll also need to call EndCurrentEdit on the territories currency manager at some point in order to write the value back to the dataset. Depending on the style of your form you could do this from an "Update" button (similarly you could call CancelCurrentEdit from a Cancel button). However, when working with datasets I find it much easier to use the dataset methods for Accepting/Rejecting row changes. So 99.99% of the time I just call EndCurrentEdit from the SelectedIndexChanged event handler of the combobox itself:

&lt;pre&gt;
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
 '-- This forces the comboxbox's value to be written to the dataset.
 Dim cm As CurrencyManager = DirectCast(Me.BindingContext(ds, "Territories"), CurrencyManager)
 cm.EndCurrentEdit()
End Sub
&lt;/pre&gt;
 
The cool thing (or anoying thing depending on how you look at it) about EndCurrentEdit/CancelCurrentEdit on the currency managers is that they cancel or commit only the fields in which they have bindings for where as the dataset rows' AcceptChanges/RejectChanges works on the whole row regardless of the data bindings. (It would be *really* nice if the currency manager had a property for this like "AlwaysCommitChanges" so we wouldn't have to call EndCurrentEdit all over the place.)&lt;br&gt;&lt;br&gt;

Now let's take our second scenario where we want to use the combobox as a row filter. In this case we have to have a relation set up between our parent and our child; in the example this is Region_Territories. The combobox properties can be set up just like the first example:

&lt;pre&gt;
Me.ComboBox1.DataSource = ds.Tables("Region")
Me.ComboBox1.DisplayMember = "RegionDescription"
Me.ComboBox1.ValueMember = "RegionID"
&lt;/pre&gt;


Technically we don't need to specify the ValueMember property this time because we're not writing it anywhere, but it doesn't hurt to specify it. Next you'll need to set up the Datasource and DataMember properties of the DataGrid using the relation path. It is very important to get the path right otherwise the datagrid will not filter automatically as we move the position in the parent:


&lt;pre&gt;
Me.DataGrid1.DataSource = ds
Me.DataGrid1.DataMember = "Region.Region_Territories"
&lt;/pre&gt;

Okay we're all set, right? Well... not exactly (I knew you were going to say that &amp;lt;g&amp;gt;). Unfortunately a combo box won't move the CurrencyManager's position for you like list controls do (Grids, Listboxes). So the trick is to get a hold of the parent currency manager and move the position manually by handling the combobox's SelectedIndexChanged event:


&lt;pre&gt;
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
 Dim cmParent As CurrencyManager = DirectCast(Me.BindingContext(ds, "Region"), CurrencyManager)
 cmParent.Position = Me.ComboBox1.SelectedIndex
End Sub
&lt;/pre&gt;

Because you set up the datagrid to display the related territories by specifying the relation path Region.Region_Territories as the DataMember, the grid will automatically filter it's rows based on the selected parent row in the combobox. &lt;br&gt;&lt;br&gt;


The currency managers are your friends. You can obtain currency managers for any table/path in your dataset even if there are no control bindings set. You can also use the currency managers to disable controls when the position moves to -1 (no records) &lt;a href="http://bethmassi.blogspot.com/2004/12/enabledisable-databound-controls_14.html"&gt; Here's an example&lt;/a&gt;. The currency managers maintain dataviews so you can easily access the current DataView as well as the current DataRowView: 

&lt;pre&gt;
Dim dv As DataView = DirectCast(cmParent.List, DataView)
Dim dvr As DataRowView = DirectCast(cmParent.Current, DataRowView)
&lt;/pre&gt;

Complex winforms databinding can take some practice, but once you get the hang of it you can create some very cool forms. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111342834494532268?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111342834494532268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111342834494532268' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111342834494532268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111342834494532268'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/combobox-databinding-woes.html' title='Combobox Databinding Woes'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111342490401071420</id><published>2005-04-13T10:09:00.000-07:00</published><updated>2005-04-13T13:41:44.010-07:00</updated><title type='text'>Stop the mailing list insanity!</title><content type='html'>Looks like I'm not the only one &lt;a href="http://www.scs.cs.nyu.edu/~dm/remove.pdf"&gt;frustrated with unwanted email&lt;/a&gt; that won't unsubscribe! (Make sure you scroll to the diagram on page 3. WARNING: This may offend you.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111342490401071420?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111342490401071420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111342490401071420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111342490401071420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111342490401071420'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/stop-mailing-list-insanity.html' title='Stop the mailing list insanity!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111297977975133901</id><published>2005-04-08T09:59:00.000-07:00</published><updated>2005-04-08T10:02:59.753-07:00</updated><title type='text'>Understanding Hitachi's new storage technology</title><content type='html'>Why can't all companies explain their technologies &lt;a href="http://hitachigst.com/hdd/research/recording_head/pr/PerpendicularAnimation.html"&gt;like this? This is awesome!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111297977975133901?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111297977975133901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111297977975133901' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111297977975133901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111297977975133901'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/understanding-hitachis-new-storage.html' title='Understanding Hitachi&apos;s new storage technology'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111256556700632429</id><published>2005-04-03T14:57:00.000-07:00</published><updated>2005-04-03T14:59:27.006-07:00</updated><title type='text'>I'd like to thank the academy...</title><content type='html'>&lt;a href="http://www.microsoft.com/communities/mvp/mvpdetails.mspx?Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22guid%22+Value%3d%228df4eef4-89a1-4c5b-8895-e4688b11ffdb%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e"&gt;This was totally unexpected&lt;/a&gt; and I just want to extend a personal thank you to Microsoft, &lt;a href="http://www.GiftRAPCorp.com"&gt;GiftRAP&lt;/a&gt;, and especially the community!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111256556700632429?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111256556700632429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111256556700632429' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111256556700632429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111256556700632429'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/id-like-to-thank-academy.html' title='I&apos;d like to thank the academy...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111237795958636624</id><published>2005-04-01T09:51:00.000-08:00</published><updated>2005-04-01T09:53:37.283-08:00</updated><title type='text'>Spoof someone for April fools!</title><content type='html'>&lt;a href="http://www.msnsearchspoof.com/index.aspx"&gt;http://www.msnsearchspoof.com/index.aspx&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;
MSN Search celebrates April Fool's Day by introducing Spoof, a tool to let you create funny search results about a friend, family member, or co-worker. When you're done, you can send the page to the target or anyone else you think might get a laugh out of it. &lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111237795958636624?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111237795958636624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111237795958636624' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111237795958636624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111237795958636624'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/04/spoof-someone-for-april-fools.html' title='Spoof someone for April fools!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111211261398859839</id><published>2005-03-29T07:41:00.000-08:00</published><updated>2005-03-29T08:10:14.086-08:00</updated><title type='text'>Finally a hybrid that doesn't suck?</title><content type='html'>It's not like I hate the environment or anything (please, all I do in the summer is camp and mountian bike), it's just that hybrid cars are, well, sloooooow. I'm a car enthusiast and I've tweaked my Subaru WRX wagon to put it over the 350hp mark. It's a 4-cylinder turbo wagon that goes 0-60 in 4.9 seconds. That's respectible. Gas milage is 21mpg so that kinda sucks, but it isn't horrible. It's better than most SUV's on the market today (and I still have 4WD). I love my car. I just love cars.
&lt;br&gt;&lt;br&gt;
I never thought these hybrid cars would really take off until two things happened. #1 - they were really fast. #2 - you can modify them. I admit #2 is not as important to most people, but I don't know many people who don't like power in their vehicle.&lt;br&gt;&lt;br&gt;

I came across &lt;a href="http://www.autoweb.com/content/shared/articles/templates/index.cfm/article_page_order_int/1/article_id_int/454"&gt;the Lexus GS 450h&lt;/a&gt; today and it looks like Lexus has finally answered my #1 complaint about hybrids.&lt;br&gt;&lt;br&gt;

&lt;em&gt;This new hybrid powertrain is unique to the GS 450h. It features a 3.5-liter V6 engine teamed with a high-output electric motor that, when combined, will produce "substantially" more than 300 horsepower, according to Lexus vice president of marketing Mark Templin. Lexus claims that this hybrid will be quicker than the new V8-powered GS 430, yet it should achieve fuel economy similar to that of a compact sedan with a 4-cylinder engine. &lt;/em&gt;
&lt;br&gt;&lt;br&gt;

Only time and test driving will tell, but I think car manufacturers are moving in the right direction with these hybrids.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111211261398859839?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111211261398859839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111211261398859839' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111211261398859839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111211261398859839'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/finally-hybrid-that-doesnt-suck.html' title='Finally a hybrid that doesn&apos;t suck?'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111194296497359889</id><published>2005-03-27T08:17:00.000-08:00</published><updated>2005-03-27T09:07:53.026-08:00</updated><title type='text'>Happy Easter!</title><content type='html'>Growing up Catholic (and 12 years of Catholic school!) I remember Easter as being a pretty big religious holiday. When me and my sister were kids, my mom used to make us cute little Easter outfits to wear to church. My sister was a little more into the cute dresses than I was but I do remember loving to wear those cool white bonnets with the long ribbons down the back. They also flew like frisbies if you threw them hard enough. &lt;br&gt;&lt;br&gt;

After Mass we used to go over to my Nona and Nono's (mom's parents) house and we'd have an Easter egg hunt. Nona would fill those plastic colored eggs with money and hide them in the yard. And I'm not talking dimes and nickels here, I'm talking paper money... $5, $10, even sometimes $20! The entire family used to participate, not just the kids (who wouldn't!). Though I do vaugely remember the kids got a head start. &lt;br&gt;&lt;br&gt;

One year, we all come back onto the patio and while opening our eggs and counting our money we see Nona hovering around us like she's looking for something. My mom asks her what she's looking for and she says that there's still a $20 egg out there somewhere. Now let me give you a little background on Nona's yard. Nona is one of the best gardeners I know (even today). She used to have beautiful tropical plants everywhere. She lived in Palos Verdies, CA overlooking the ocean and Catalina island. Her backyard looked like the Italian island of Iscia where she was from (off the Almafi coast). The yard was big. Real big. Real lush. Nona didn't make a treasure map. Whoops. We all looked for an hour and no money egg anywhere (though I do remember recruiting some more snails for my snail army). A couple years later while gardening, Nona finds the egg and the semi-decomposed $20 bill. But even the liquor store wouldn't take it when she tried to buy her lottery tickets. Great memories.
&lt;br&gt;&lt;br&gt;

Although I'm not very religious now, Easter Sunday is still a day to spend with family eating and drinking (and drinking and drinking). This weekend has been really fun so far. My honey, Alan, is Jewish so he was very facinated with the whole Easter egg decorating. Friday was his first time. See, I usually go for an art deco look which basically involes throwing the eggs in as many colors as possible and then putting as many hideous stickers on them as I possibly can. Quantity, not quality, baby. Alan, on the other hand, took so much care in designing his eggs (all two of them). I do have to say that his were definate masterpieces. Of course, I had to break the news to him that my dad was just going to crack them open and eat them. But it was fun.

&lt;br&gt;&lt;br&gt;
Later this afternoon we're heading over to mom's. Typically my mother makes enough gormet food to put Martha Stewart to shame. If 8 people are coming, she'll make food to feed at least 25. Now when we were kids we usually had some kind of roast or ham on Easter. When we got older the tradition changed to going out to a nice big brunch. This year Nona wanted to take it back home and cook. This year we're making rabbit. Yes, we're cooking up cute little easter bunnies and eating them. And if that's not enough, were also roasting a cute little lamb to go with the easter bunnies. My mom would never let Nona make this dish on Easter when we were kids because of the obvious freak-out factor, but we used to raise rabbits and I LOVE LOVE LOVE rabbit. And the way my Nona makes it is amazing. I can't wait! 
&lt;br&gt;&lt;br&gt;

I know my family is not normal, but we all love eachother very much and that's what these religous holidays mean to me nowadays... getting together with the people you love most in this world and having a good time. HAPPY EASTER EVERYONE!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111194296497359889?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111194296497359889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111194296497359889' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111194296497359889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111194296497359889'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/happy-easter.html' title='Happy Easter!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111134803810869391</id><published>2005-03-20T11:39:00.000-08:00</published><updated>2005-03-20T11:47:18.110-08:00</updated><title type='text'>Podcasting to Fame</title><content type='html'>&lt;a href="http://www.franklins.net/"&gt;Carl's&lt;/a&gt; in the &lt;a href="http://www.courant.com/hc-podcasters.artmar20,0,594368.story"&gt;news about podcasting!&lt;/a&gt; If you haven't seen the &lt;a href="http://www.dotnetrocks.com/"&gt;DNR&lt;/a&gt; or &lt;a href="http://mondays.pwop.com/"&gt;Monday's&lt;/a&gt; shows you're definately missing out on some awesome podcasts. Carl's now setting up a customizable podcast called &lt;a href="http://www.thedailycommute.com/"&gt;The Daily Commute&lt;/a&gt;. I can't wait to try this out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111134803810869391?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111134803810869391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111134803810869391' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111134803810869391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111134803810869391'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/podcasting-to-fame.html' title='Podcasting to Fame'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111120237022978159</id><published>2005-03-18T19:07:00.000-08:00</published><updated>2005-03-18T19:19:30.230-08:00</updated><title type='text'>Come to DevTeach 2005 in Montreal!</title><content type='html'>I'll be speaking at &lt;a href="http://www.devteach.com/"&gt;DevTeach 2005 &lt;/a&gt;this year in beautiful Montreal June 18-22. If you missed out last year, you should definitely consider it this year. I had a blast and those wonderful Canadians are so hospitable. I'm very excited to be coming back. Check out my sessions topics &lt;a href="http://www.devteach.com/Session.asp#15"&gt;here &lt;/a&gt;and &lt;a href="http://www.devteach.com/Session.asp#27"&gt;here&lt;/a&gt;. I'm doing a two parter with &lt;a href="http://www.activenick.net/"&gt;Nick Landry &lt;/a&gt;(aka Mobile Man) on designing distributed apps for multiple user interfaces. These sessions are going to be very "how to" focusing on a lot of different issues developing usable enterprise information systems. I can't wait!&lt;br&gt;&lt;br&gt;

&lt;img src="http://www.devteach.com/banners/b200-e.gif"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111120237022978159?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111120237022978159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111120237022978159' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111120237022978159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111120237022978159'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/come-to-devteach-2005-in-montreal.html' title='Come to DevTeach 2005 in Montreal!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111119505104862764</id><published>2005-03-18T17:02:00.000-08:00</published><updated>2005-03-18T17:17:31.050-08:00</updated><title type='text'>DataSet Debugger Visualizer for VS 2003!</title><content type='html'>I don't know how I missed this one. This is probably my most favorite VS 2003 add-in to date. Anyone doing database development in .NET is probably using the &lt;a href="http://www.codeproject.com/csharp/DSWatch.asp"&gt;DSWatch add-in&lt;/a&gt;. This add-in lets you select a dataset variable while in the debugger and presents a form with an XML representation of the dataset's data (as well as a datagrid). &lt;br&gt;&lt;br&gt;

Well say goodbye to DSWatch and hello to the &lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=01f2f983-298f-4167-b52a-d11b76f3ea62"&gt;XML Visualizer&lt;/a&gt;! This add-in rocks! Among the cool features it lets you view the schema of your dataset as well as the row versions. It also works on DataViews or any XML serializable type! Who needs to wait for Whidbey? Get this now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111119505104862764?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111119505104862764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111119505104862764' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111119505104862764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111119505104862764'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/dataset-debugger-visualizer-for-vs.html' title='DataSet Debugger Visualizer for VS 2003!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111111380077667917</id><published>2005-03-17T18:43:00.000-08:00</published><updated>2005-03-18T16:29:42.083-08:00</updated><title type='text'>My Singleton Answer</title><content type='html'>In my &lt;a href="http://bethmassi.blogspot.com/2005/03/singleton-question.html"&gt;previous post&lt;/a&gt; I asked a question about using the singleton pattern for application-wide services that were stored in an object repository. With the help of the commenters, I decided not to implement the singleton pattern in this situation because since the services were only accessed via shared members on the object repository there is no need to force the service classes into the singleton pattern. This also makes them easier to extend (inherit). &lt;br&gt;&lt;br&gt;

That said, the discussion led to the question about how to implement lazy initialization of shared members in a thread-safe manner. I mentioned I was using double-checked locking, but someone pointed me to this &lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;interestering article&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/brada/archive/2004/05/12/130935.aspx"&gt;this discussion&lt;/a&gt;. I decided to test out double-checked locking versus just locking before the read in my distributed app (basically just created a remoted unit test) and I observed no difference in performance really. The test was just the "give me a warm and fuzzy feeling" test so I didn't write any performance counters or anything. But just measuring speed of the calls with 40 concurrent threads calling the components 100 times I only saw between a 1 and 10 milisecond average difference in speed. This is really nothing to me so I'm going to go with the easier, safer pattern of locking the whole shee-bang:

&lt;pre&gt;
Private Shared m_service1 As ExtendedService
Private Shared _syncRoot As New Object

Public Shared ReadOnly Property Service1() As ExtendedService
  Get
    SyncLock (_syncRoot)
      If (m_service1 Is Nothing) Then
        m_service1 = Factory.CreateExtendedService()
      End If
    End SyncLock
    Return m_service1
  End Get
End Property
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111111380077667917?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111111380077667917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111111380077667917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111111380077667917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111111380077667917'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/my-singleton-answer_17.html' title='My Singleton Answer'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111102663697818699</id><published>2005-03-16T17:38:00.000-08:00</published><updated>2005-03-17T16:53:55.720-08:00</updated><title type='text'>Singleton Question</title><content type='html'>I've been going back and forth trying to decide whether or not to use a Singleton pattern for a specific situation and I've decided I need community input. In my application I have a global "object repository" which is basically just a single point of entry for application-wide services. Some objects are expensive to create and only used in certian situations but what they all have in common is that there only needs to be one instance of each service for my entire application since they are all thread safe (I hope! :P). The object repository itself contains only shared (static) readonly properties used to access the application services and has no instance methods itself. The services need to have an inheritable class hierarchy to support different application's needs. &lt;br&gt;&lt;br&gt;

My question is then, since I only access these objects from the ObjectRepository, do I gain anything by creating the base services as extendable (inheritable) singletons or should I just access them as shared members directly? Now what gets a little trickier is that the application is a server-side application and objects are activated as single-call objects, so depending on the load on the server the application service objects may not be around and may need to be created on the next round if the aspnet worker process is recycled, right? Anyways, I've got the system scaling really well not using the singleton pattern and just accessing the services as shared members of the ObjectRepository, but I'm just curious if using the singleton pattern in this situation will be more performant. Of course, since I need to have the services inheritable, if I go with the singletn pattern I will have to maintain the pattern on all the sub-classes so code maintenance has a weigh-in factor here as well.&lt;br&gt; &lt;br&gt;

So let me show you what I mean. Should I do this (what I'm doing now):

&lt;pre&gt;
Public Class MyBaseService1

 Public Sub New()
  Initialize()
 End Sub

 Private Sub Initialize()
  'do initialization stuff
 End Sub

 Public Sub TemplateMethod()
  HookMethod1()
  HookMethod2()
 End Sub

 Protected Overridable Sub HookMethod1()
  'do default stuff
 End Sub

 Protected Overridable Sub HookMethod2()
  'do more default stuff
 End Sub
End Class


Public Class MyExtendedService1
 Inherits MyBaseService1

 Public Sub New()
  MyBase.New()
 End Sub

 Protected Overrides Sub HookMethod1()
  'do different stuff
 End Sub

 Protected Overrides Sub HookMethod2()
  'do more different stuff
 End Sub
End Class


Public Class ObjectRepository1

 Private Shared m_service1 As MyExtendedService1
 Private Shared _lock As New Object

 'Use lazy initialization because this 
 ' class is rarely used and expensive to create.
 Public Shared ReadOnly Property Service1() As MyExtendedService1
  Get
   If m_service1 Is Nothing Then
    SyncLock (_lock)
     If m_service1 Is Nothing Then
      m_service1 = New MyExtendedService1
     End If
    End SyncLock
   End If
   Return m_service1
  End Get
 End Property

End Clas
&lt;/pre&gt;

Or would it be better to implement this pattern?

&lt;pre&gt;
Public Class MyBaseService
 Protected Shared _Instance As MyBaseService
 Protected Shared _Lock As New Object

 Protected Sub New()
  Initialize()
 End Sub

 Public Shared Function GetInstance() As MyBaseService
  If _Instance Is Nothing Then
   SyncLock (_Lock)
    If _Instance Is Nothing Then
     _Instance = New MyBaseService
    End If
   End SyncLock
  End If
  Return _Instance
 End Function

 Private Sub Initialize()
  'do initialization stuff
 End Sub

 Public Sub TemplateMethod()
  HookMethod1()
  HookMethod2()
 End Sub

 Protected Overridable Sub HookMethod1()
  'do default stuff
 End Sub

 Protected Overridable Sub HookMethod2()
  'do more default stuff
 End Sub
End Class


Public Class MyExtendedService
 Inherits MyBaseService

 Public Shared Shadows Function GetInstance() As MyExtendedService
  If _Instance Is Nothing Then
   SyncLock (_Lock)
    If _Instance Is Nothing Then
     _Instance = New MyExtendedService
    End If
   End SyncLock
  End If
  Return DirectCast(_Instance, MyExtendedService)
 End Function

 Protected Overrides Sub HookMethod1()
  'do different stuff
 End Sub

 Protected Overrides Sub HookMethod2()
  'do more different stuff
 End Sub
End Class

Public Class ObjectRepository
 Private Shared m_service1 As MyExtendedService

 'Use lazy initialization because this 
 ' class is rarely used and expensive to create.
 Public Shared ReadOnly Property Service1() As MyExtendedService
  Get
   If m_service1 Is Nothing Then
    m_service1 = MyExtendedService.GetInstance()
   End If
   Return m_service1
  End Get
 End Property

End Class
&lt;/pre&gt;

I mean, I really don't see the advantage of this pattern for my situation but maybe I'm missing something? Thanks in advance!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111102663697818699?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111102663697818699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111102663697818699' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111102663697818699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111102663697818699'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/singleton-question.html' title='Singleton Question'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111082690345579733</id><published>2005-03-14T10:35:00.000-08:00</published><updated>2005-03-14T11:01:43.456-08:00</updated><title type='text'>Can't we all just get along?</title><content type='html'>&lt;a href="http://west-wind.com/weblog/posts/1721.aspx"&gt;Here's a great post from Rick&lt;/a&gt; commenting on the absurd .NET language "war" that seems to be going on. It's not really a war, it's just a bunch of Microsoft platform developers bickering and wasting time. This is more ridiculous than the religious war of Java versus .NET. At least the argument with Java is an argument about an entire architecture - OS, Languages, and Tools. Who cares if you wrote your code in C# or VB.NET? It runs on the same damn framework! Like Rick, I come from a VFP background (talk about being neglected) so I'm not really bothered when someone tells me that VB.NET is not a "real" language because I know it is and they are probably just saying that because they don't have a date for Saturday night. Unlike Rick, however, I'm more comfortable with VB.NET because it just seems closer to the Fox programming style I've been used for so long. I think VB-only people are being too sensitive and C#-only people shouldn't knock a language just because it lets you do lose-typing (actually one of the things I like about VB, but that's another post), or isn't "pure" or whatever. Gimme a break. A business isn't going to care what language you program in, they care if the project is done on time, to spec, and works!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111082690345579733?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111082690345579733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111082690345579733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111082690345579733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111082690345579733'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/cant-we-all-just-get-along.html' title='Can&apos;t we all just get along?'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111082325950765846</id><published>2005-03-14T09:58:00.001-08:00</published><updated>2005-03-14T10:00:59.506-08:00</updated><title type='text'>Things that make you go "hmmmm...."</title><content type='html'>I'm not sure if I like &lt;a href="http://www.coviniengineering.com/c6w/intro.htm"&gt;this car&lt;/a&gt; or not. My friends would either think I'm totally cool or a total weirdo... wait, they already think that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111082325950765846?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111082325950765846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111082325950765846' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111082325950765846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111082325950765846'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/things-that-make-you-go-hmmmm_14.html' title='Things that make you go &quot;hmmmm....&quot;'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111051855894508975</id><published>2005-03-10T21:22:00.000-08:00</published><updated>2005-03-10T21:24:07.250-08:00</updated><title type='text'>GOTCHA: Cancelling a control's validating event in MDI apps</title><content type='html'>Okay, this is the first time I ever noticed this one and I think it's either a bug or pretty damn retarded. Alright, say you have an MDI application with two child forms call 'em Form1 and Form2, each with a text box on them. You open the forms from your MDI container form like normal (probably from a Main Menu's click event):

&lt;pre&gt;
Dim frm as New Form1
frm.MdiParent = Me
frm.Show()
&lt;/pre&gt;

Now on Form1, you are handling the TextBox1's validating event and are cancelling the event (probably based on some condition):

&lt;pre&gt;
Private Sub TextBox1_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating

   'If some condition blah blah blah
   e.Cancel = True

End Sub
&lt;/pre&gt;

When you run your application, open Form1 and trigger the event, the focus remains in the TextBox1 as expected... until.....&lt;br&gt;&lt;br&gt;

Now you want to open Form2 while Form1 is still open (a perfectly valid use case for an MDI application). BUT, once Form2 opens, even though the form is activated, no control can receive focus on Form2. It basically renders Form2 useless and in a user's eyes it looks like the form is not responding. WHAT!? Why in the world is the Textbox1's Validating event being raised at all on Form1 once Form2 is active? This has got to be a bug or it is just plain retarded. I fail to see why you would ever want this behavior. This is not a problem if the application is not an MDI application. In that case the event will not be raised if the form is not active. &lt;br&gt;&lt;br&gt;

I can't figure out how to prevent the Validating event from being raised, however, I did find a work-around. You can use this check in the handler to avoid running your handler code:

&lt;pre&gt;
Private Sub TextBox1_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating

  If Me.MdiParent.ActiveMdiChild Is Me Then
   'If some condition blah blah blah
    e.Cancel = True
  End If

End Sub
&lt;/pre&gt;

This is moderately painful because I have to search my app for "_Validating" and add this line to all the handlers. If anyone's got a better idea I'm all ears.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111051855894508975?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111051855894508975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111051855894508975' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111051855894508975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111051855894508975'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/gotcha-cancelling-controls-validating.html' title='GOTCHA: Cancelling a control&apos;s validating event in MDI apps'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-111051375156011133</id><published>2005-03-10T20:02:00.000-08:00</published><updated>2005-03-10T20:02:31.560-08:00</updated><title type='text'>The VB MVPs are pissed...</title><content type='html'>I happen to &lt;a href="http://weblogs.asp.net/cfranklin/archive/2005/03/10/393239.aspx"&gt;agree with Carl&lt;/a&gt; on &lt;a href="http://rblevin.blogspot.com/2005/03/microsoft-mvps-revolt.html"&gt;this one&lt;/a&gt;, but I also don't have million line legacy applications to maintain either. If I did I'd probably kill myself. Fact is, all the things I love about programming come directly from learning something new and cool. I prefer to solve my business problems with the best solutions and right now that's VB.NET. Sorry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-111051375156011133?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/111051375156011133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=111051375156011133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111051375156011133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/111051375156011133'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/03/vb-mvps-are-pissed_10.html' title='The VB MVPs are pissed...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110961177054698116</id><published>2005-02-28T09:28:00.000-08:00</published><updated>2005-03-16T19:08:26.453-08:00</updated><title type='text'>Nick Landry is blogging...</title><content type='html'>&lt;a href="http://www.infusionblogs.com/blogs/activenick/"&gt;http://www.infusionblogs.com/blogs/activenick/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110961177054698116?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110961177054698116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110961177054698116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110961177054698116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110961177054698116'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/02/nick-landry-is-blogging.html' title='Nick Landry is blogging...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110917911451659460</id><published>2005-02-23T09:16:00.000-08:00</published><updated>2005-02-23T09:18:34.516-08:00</updated><title type='text'>What two Libras are thinking this week...</title><content type='html'>&lt;a href="http://www.thedatafarm.com/blog/PermaLink.aspx?guid=199a781e-2636-4da9-a08a-04d72a9f1b2b"&gt;Julie and I must be on the same wavelength&lt;/a&gt; this week because I was thinking about making an MP3 player purchase soon too. I need one with a great car adapter because I listen to most of my music on the road.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110917911451659460?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110917911451659460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110917911451659460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110917911451659460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110917911451659460'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/02/what-two-libras-are-thinking-this-week.html' title='What two Libras are thinking this week...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110911209503166654</id><published>2005-02-22T14:33:00.000-08:00</published><updated>2005-02-22T14:41:35.033-08:00</updated><title type='text'>I am free!</title><content type='html'>I just installed a new hard drive in my laptop and WOW.. I feel free again! You'd think I installed a new processor and another GIG of RAM! Nope. Just a new (faster, bigger) hard drive. My old drive scared me by coughing up the blue screen a couple times last week so I ordered a new drive from Dell and started the rebuild on Saturday. I think I have this baby back to a workable computer.... just found the sound drivers today so my speakers are working again. So the old drive is still booting up in safe mode so if I forgot anything I can always go back and get it if I really have to. Much better buying a new drive for $90 than to format your old one only to realize you forgot to copy over all your great grandmother's 120th birthday pictures which you have no backups for. My registry is clean and under a GIG so I'm cooking with gas now. VS even opens in less than 5 seconds... sweeeeeet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110911209503166654?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110911209503166654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110911209503166654' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110911209503166654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110911209503166654'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/02/i-am-free.html' title='I am free!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110791076494445137</id><published>2005-02-08T16:47:00.000-08:00</published><updated>2005-02-08T17:09:17.663-08:00</updated><title type='text'>ADO.NET Calculated DateTime Expression</title><content type='html'>In our business we store user entered time values as strings separate from the date. If you're doing the same thing, here's an example of how you can create a calculated column in a DataTable that merges the date and time so you can use it in your business functions a lot easier. This will work the same regardless of whether you're storing the time value as military time or AM/PM and handles null values.
&lt;/br&gt;
&lt;font size="2"&gt;
&lt;pre&gt;
Module Module1
 Sub Main()
   
   Dim dt As New DataTable
   
   dt.Columns.Add(New DataColumn("MyDate", GetType(Date)))
   dt.Columns.Add(New DataColumn("MyTime", GetType(String)))

   Dim expr As String = _
   "SUBSTRING(CONVERT(MyDate, 'System.String'),1,LEN(CONVERT(MyDate, 'System.String'))-11) + ' ' + ISNULL(MyTime,'')"

   dt.Columns.Add(New DataColumn("MyDateTime", GetType(Date), expr))

   For i As Integer = 1 To 10
      Dim dr As DataRow = dt.NewRow
      
      If i &lt; 5 Then
         dr(0) = DateAdd(DateInterval.Day, i, Now)
         dr(1) = i.ToString + ":00 PM"
      Else
         dr(0) = DateAdd(DateInterval.Day, 0, Now)
         dr(1) = i.ToString + ":00 AM"
      End If
      
      dt.Rows.Add(dr)
   Next

   Dim dv As New DataView(dt)
   dv.Sort = "MyDateTime"
   
   Console.WriteLine(ViewToString(dv))
   Console.ReadLine()

 End Sub

 Public Function ViewToString(ByVal view As DataView) As String
   Dim sb As New Text.StringBuilder

   For i As Integer = 0 To view.Count - 1
      Dim row As DataRow = view(i).Row
      sb.Append("Row ")
      sb.Append(i.ToString)
      sb.Append(": ")
      sb.Append(RowToString(row))
   Next
   Return sb.ToString
 End Function

 Public Function RowToString(ByVal row As DataRow) As String
   Dim sb As New Text.StringBuilder
   sb.Append(vbCrLf)

   For Each dc As DataColumn In row.Table.Columns
      If Not row.RowState = DataRowState.Deleted Then
         sb.Append(StrDup(10, " "))
         sb.Append(LSet(dc.ColumnName, 20))
         sb.Append(" : ")
         If row(dc) Is System.DBNull.Value Then
            sb.Append("&amp;lt;null&amp;gt;")
         Else
            sb.Append(row(dc).ToString)
         End If
         sb.Append(vbCrLf)
      End If
   Next
   Return sb.ToString
 End Function
End Module
&lt;/pre&gt;
&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110791076494445137?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110791076494445137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110791076494445137' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110791076494445137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110791076494445137'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/02/adonet-calculated-datetime-expression.html' title='ADO.NET Calculated DateTime Expression'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110771860259032077</id><published>2005-02-06T11:36:00.000-08:00</published><updated>2005-02-06T11:36:42.590-08:00</updated><title type='text'>GO EAGLES!!!!!!!!!!!!!!!!!!!!</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110771860259032077?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110771860259032077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110771860259032077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110771860259032077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110771860259032077'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/02/go-eagles.html' title='GO EAGLES!!!!!!!!!!!!!!!!!!!!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110722718153742216</id><published>2005-01-31T18:55:00.000-08:00</published><updated>2005-01-31T19:06:21.536-08:00</updated><title type='text'>Mondays on Monday!</title><content type='html'>Tune in to A&amp;E’s Caesar’s 24/7 on Monday night 10PM (check your local time) to see the cast from &lt;a href="http://mondays.pwop.com/"&gt;Mondays&lt;/a&gt;, (Carl Franklins, Rory Blyth, Nick Landry, and Geoff Maciolek) as Nick tries to pick up a woman in the bar at Caesars Palace.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110722718153742216?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110722718153742216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110722718153742216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110722718153742216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110722718153742216'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/mondays-on-monday.html' title='Mondays on Monday!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110635571199866420</id><published>2005-01-21T17:01:00.000-08:00</published><updated>2005-01-21T17:07:20.233-08:00</updated><title type='text'>Nice one, Messenger!</title><content type='html'>&lt;img src='http://photos1.blogger.com/img/192/2664/320/messenger_error.jpg'&gt;&lt;br /&gt;Somebody may want to think about some fricken custom errors! Guess I can forget about those &lt;a href="http://bethmassi.blogspot.com/2005/01/live-message-alerts.html"&gt;live message alerts&lt;/a&gt; working...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110635571199866420?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110635571199866420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110635571199866420' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110635571199866420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110635571199866420'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/nice-one-messenger.html' title='Nice one, Messenger!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110635134477970396</id><published>2005-01-21T15:46:00.000-08:00</published><updated>2005-01-21T15:49:04.780-08:00</updated><title type='text'>You know you're coding too much when...</title><content type='html'>... when you try and "BUILD" a fricken Word document. I was like "What happened to my Build menu?" Whoops. I'm in Word. Just click the save button you idiot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110635134477970396?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110635134477970396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110635134477970396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110635134477970396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110635134477970396'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/you-know-youre-coding-too-much-when.html' title='You know you&apos;re coding too much when...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110572305555598459</id><published>2005-01-14T09:11:00.000-08:00</published><updated>2005-01-14T09:46:03.823-08:00</updated><title type='text'>Live message alerts</title><content type='html'>&lt;a href="http://weblogs.asp.net/rosherove/archive/2005/01/14/352893.aspx"&gt;Roy just added live message alerts&lt;/a&gt; to his blog and I wanted to be cool like him so I did it too. You can now sign up for alerts when this blog updates (see right-hand sidebar for the link or &lt;a href="http://www.messagecast.net/alerts/login.do?PINID=2937&amp;returnURL=http://bethmassi.blogspot.com/"&gt;click here&lt;/a&gt;). This is handy if you're really really interested in what I have to say the minute I say it and you don't live in an RSS news reader all day. Not really sure who would subscribe... maybe I'll tell my mom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110572305555598459?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110572305555598459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110572305555598459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110572305555598459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110572305555598459'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/live-message-alerts.html' title='Live message alerts'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110549562500774445</id><published>2005-01-11T17:16:00.000-08:00</published><updated>2005-01-11T18:18:07.666-08:00</updated><title type='text'>Hung my diploma today...</title><content type='html'>&lt;a href="http://bethmassi.blogspot.com/2005/01/happy-new-year-now-get-to-work.html"&gt;I mentioned &lt;/a&gt; a few posts ago that I moved and as you know, if you've ever moved, it takes forever to get the little things unpacked and put in their correct place. I just hung my diploma on my office wall and I had a semi-proud moment. "Bachelor of Science in Computer Science and Minor in Mathematics" it reads. I'm pretty good at the computer dealio, but the math... can't say I remember calculus. I can't even balance my checkbook anymore :-/. OTOH, why would I need to? That's what online banking is for. &lt;/br&gt;&lt;/br&gt;

It's funny how I ended up in the business side of software. I remember (vaugely) all those baloney C++ assignments about calculating how many slices in a 14" pizza or writing a craps game my sophomore year. It didn't get interesting until my junior year when I transfered to a real university and started programming with cool graphics packages on sparc station 10's... which were totally expensive back then. Of course I had all the math down and when I graduated I applied at Lawrence Livermore National Laboratory for some geek-y C++ programming job. &lt;/br&gt;&lt;/br&gt;

Of course I didn't get the job because there were like 1000 applicants. So I took the summer off... practically. One August morning as I was heading out to the jacuzzi my mother found a job in the classifieds that read "Computer programmer. BS in CS required. No experience necessary." So I called, faxed my resume in (litteraly a half of a page) and got a call back for an interview. The company was a small healthcare software company nearby. I nailed the interview and was practiacally hired on the spot. &lt;/br&gt;&lt;/br&gt;

The first month was basically me learning Clipper (summer 87 -- the cool version). I was too afraid to tell them that I wasn't a CIS graduate and I had no idea what an IDX was so I took the Nantucket book home and learned all about relational database programming. I couldn't believe I spent all that time in college and none of it prepared me for writing business software products. However, within four months I had rewritten their internal office management system and they promoted me from junior programmer and gave me a $10K raise (which let me tell you was a shitload because I was still living at home and driving an 81 LeBaron). I realized that college taught me &lt;i&gt;how to think&lt;/i&gt; about programming. Even though they didn't specifically teach me about databases, I gained the skill to be able to make sense out of any computer gobbely-gook. (Granted, later going from Clipper to FoxPro 2.0 was maybe like 5 syntactical differences, but still). But of course I still can't figure out what Math ever gave me.....
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110549562500774445?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110549562500774445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110549562500774445' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110549562500774445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110549562500774445'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/hung-my-diploma-today.html' title='Hung my diploma today...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110514742998633674</id><published>2005-01-07T17:10:00.000-08:00</published><updated>2005-01-09T19:46:51.906-08:00</updated><title type='text'>Disable Tabs on a TabControl</title><content type='html'>Here's a complete subclass of the TabControl that has disabled tab page functionality built in. When you set one of the contained tab pages' Enabled property to False, the tab will render in a disabled font color and will not allow the user to open the tab. This version of the tab control handles the EnabledChanged event of any of its contained tab pages and redraws the tab appropriately. Add this class to your toolbox, drop it on a form, add a few tabs like normal. If you want to disable a tab simply set the Enabled property to false in your code:
&lt;pre&gt;
MyTabControl.TabPage2.Enabled = False
&lt;/pre&gt;
Here's the class:
&lt;/br&gt;&lt;/br&gt;
&lt;font size="3"&gt;
&lt;pre&gt;Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms

&amp;lt;ToolboxBitmap(GetType(TabControl))&amp;gt; _
Public Class BaseTabControl
  Inherits System.Windows.Forms.TabControl

#Region &amp;quot; Windows Form Designer generated code &amp;quot;

  Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call
    Me.DrawMode = TabDrawMode.OwnerDrawFixed
  End Sub

  'BaseTabControl overrides dispose to clean up the component list.
  Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
      If Not (components Is Nothing) Then
        components.Dispose()
      End If
    End If
    MyBase.Dispose(disposing)
  End Sub

  'Required by the Windows Form Designer
  Private components As System.ComponentModel.IContainer

  'NOTE: The following procedure is required by the Windows Form Designer
  'It can be modified using the Windows Form Designer. 
  'Do not modify it using the code editor.
  &amp;lt;System.Diagnostics.DebuggerStepThrough()&amp;gt; Private Sub InitializeComponent()
  '
  End Sub

#End Region

#Region &amp;quot;--- Disabled Pages Functionality ---&amp;quot;

  Private Const WM_LBUTTONDOWN As Integer = &amp;amp;H201

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_LBUTTONDOWN Then
      Dim pt As New Point(m.LParam.ToInt32)

      For i As Integer = 0 To Me.TabPages.Count - 1
        If Me.GetTabRect(i).Contains(pt) Then
          If Me.TabPages(i).Enabled Then
	    MyBase.WndProc(m) 
          End If
          Exit For
        End If
      Next
    Else
      MyBase.WndProc(m)
    End If
  End Sub

  Protected Overrides Sub OnKeyDown(ByVal ke As System.Windows.Forms.KeyEventArgs)
    If Me.Focused Then
      Dim selIndex As Integer = Me.SelectedIndex

      If ke.KeyCode = Keys.Left AndAlso Not ke.Control AndAlso Not ke.Alt Then
        For i As Integer = selIndex - 1 To 0 Step -1
          If Me.TabPages(i).Enabled Then
            Me.SelectedIndex = i
            Exit For
          End If
        Next
        ke.Handled = True
      ElseIf ke.KeyCode = Keys.Right AndAlso Not ke.Control AndAlso Not ke.Alt Then
        For i As Integer = selIndex + 1 To TabPages.Count - 1
          If Me.TabPages(i).Enabled Then
            Me.SelectedIndex = i
            Exit For
          End If
        Next
        ke.Handled = True
      End If
    End If
    MyBase.OnKeyDown(ke)
  End Sub

  Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
    Dim leftImgOffset, topImgOffset As Integer
    Dim rBack As Rectangle
    Dim rText As RectangleF
    Dim img As Bitmap
    Dim format As New StringFormat
    Dim foreBrush As Brush
    Dim backBrush As New SolidBrush(Me.TabPages(e.Index).BackColor)

    If Me.TabPages(e.Index).Enabled Then
      foreBrush = New SolidBrush(Me.TabPages(e.Index).ForeColor)
    Else
      foreBrush = New SolidBrush(SystemColors.ControlDark)
    End If

    If Me.TabPages(e.Index).ImageIndex &amp;lt;&amp;gt; -1 Then
      img = CType(Me.ImageList.Images(Me.TabPages(e.Index).ImageIndex), Bitmap)
      rText = New RectangleF(e.Bounds.X + (img.Width \ 2), e.Bounds.Y, _
                             e.Bounds.Width, e.Bounds.Height)
    Else
      rText = New RectangleF(e.Bounds.X, e.Bounds.Y, _
                             e.Bounds.Width, e.Bounds.Height)
    End If

    If e.State = DrawItemState.Selected Then
      If e.Index = 0 Then
        rBack = New Rectangle(e.Bounds.X + 4, e.Bounds.Y, _
                              e.Bounds.Width - 4, e.Bounds.Height)
      Else
        rBack = e.Bounds
      End If

      e.Graphics.FillRectangle(backBrush, rBack)

      leftImgOffset = 6
      topImgOffset = 5
    Else
      leftImgOffset = 2
      topImgOffset = 2
    End If

    format.Alignment = StringAlignment.Center
    format.LineAlignment = StringAlignment.Center

    e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, foreBrush, rText, format)

    If Me.TabPages(e.Index).ImageIndex &amp;lt;&amp;gt; -1 Then
      Me.ImageList.Draw(e.Graphics, e.Bounds.X + leftImgOffset, _
                        e.Bounds.Top + topImgOffset, Me.TabPages(e.Index).ImageIndex)
    End If

    MyBase.OnDrawItem(e)
  End Sub

  Private Sub Tab_EnabledChanged(ByVal sender As Object, ByVal e As EventArgs)
    If TypeOf sender Is TabPage Then
      Me.Invalidate(Me.GetTabRect(DirectCast(sender, TabPage).TabIndex))
    End If
  End Sub

  Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
    If TypeOf e.Control Is TabPage Then
      AddHandler e.Control.EnabledChanged, AddressOf Tab_EnabledChanged
    End If
    MyBase.OnControlAdded(e)
  End Sub

  Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)
    If TypeOf e.Control Is TabPage Then
      RemoveHandler e.Control.EnabledChanged, AddressOf Tab_EnabledChanged
    End If
    MyBase.OnControlRemoved(e)
  End Sub

#End Region

End Class&lt;/pre&gt;
&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110514742998633674?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110514742998633674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110514742998633674' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110514742998633674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110514742998633674'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/disable-tabs-on-tabcontrol.html' title='Disable Tabs on a TabControl'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110504072056079844</id><published>2005-01-06T11:40:00.000-08:00</published><updated>2005-01-06T11:45:20.560-08:00</updated><title type='text'>The Future of TV</title><content type='html'>I was talikng to Alan the other day about how it would be cool to have multiple signals per TV channel so that you could select your own camera angles durring a football game. Guess what? &lt;a href="http://blogs.msdn.com/mswanson/archive/2005/01/06/347456.aspx"&gt;It's coming!&lt;/a&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110504072056079844?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110504072056079844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110504072056079844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110504072056079844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110504072056079844'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/future-of-tv.html' title='The Future of TV'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110486718006200241</id><published>2005-01-04T11:19:00.000-08:00</published><updated>2005-01-04T11:33:00.063-08:00</updated><title type='text'>Happy New Year! Now get to work!</title><content type='html'>Well I'm back after an *awesome* winter break! (Even though I was back to work yesterday, I was overloaded with catch-up work and I just couldn't spare anytime to get a post out.) Okay what's new? Well, we bought a house and we moved in right before Christmas! This was good and bad timing. I had last week off so it was nice to not have to take regular vacation to get moved. On the other hand dealing with the banks, getting new carpet installed and scheduling a move in the rain is not my idea of fun and would have probably been easier to do in the spring or at least away from the holidays. I was a total stress case. Now I'm back to work and felling more relaxed believe it or not. I'm still dealing with a bunch of boxes and my whiteboard in my office is still on the floor, but at least the cable modem is working. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110486718006200241?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110486718006200241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110486718006200241' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110486718006200241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110486718006200241'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2005/01/happy-new-year-now-get-to-work.html' title='Happy New Year! Now get to work!'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110384877177149114</id><published>2004-12-23T15:28:00.000-08:00</published><updated>2004-12-23T20:05:03.223-08:00</updated><title type='text'>Really obscure remoting error</title><content type='html'>I ran into the oddest error message today and thought I'd post the problem and solution up here. I was deploying our product on a test machine I have here at home which is a single processor P3 with Win2k3 Enterprise Edition loaded on it. The app's server piece runs under an ASP.NET remoting host and uses the binary formatter. No brainer really. Usually the typical error messages have to do with security, impersonation, database user, etc. Today I get this RETARDED message when running the client:&lt;br&gt;&lt;br&gt;

&lt;code&gt;
Exception Information&lt;br&gt;
-------------------------------------------&lt;br&gt;
Exception Type: System.ArgumentOutOfRangeException&lt;br&gt;
Message: Ticks must be between DateTime.MinValue.Ticks and DateTime.MaxValue.Ticks.
Parameter name: ticks&lt;br&gt;
ActualValue: NULL&lt;br&gt;
ParamName: ticks&lt;br&gt;
TargetSite: Void HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)&lt;br&gt;
HelpLink: NULL&lt;br&gt;
Source: mscorlib&lt;br&gt;
&lt;br&gt;
StackTrace Information&lt;br&gt;
-------------------------------------------&lt;br&gt;
&lt;br&gt;
Server stack trace: &lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.DateTime..ctor(Int64 ticks)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadDateTime()&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadValue(InternalPrimitiveTypeE code)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadMemberPrimitiveUnTyped()&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, IMethodCallMessage methodCallMessage)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryResponseMessage(Stream inputStream, IMethodCallMessage reqMsg, Boolean bStrictBinding)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)&lt;br&gt;

Exception rethrown at [0]: &lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)&lt;br&gt;
&amp;nbsp;&amp;nbsp;at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgData, Int32 type)&lt;br&gt;
&lt;/code&gt;
&lt;br&gt;
Ummmm.... WTF!? Okay. Calm down. Ask Google what the problem is... it'll be okay. Well after asking Google groups I found a bunch of messages regarding the Process object... Definitely not related to anything I'm doing. I was just doing a simple remote method call... I wasn't even passing a DateTime value anywhere. This is bad. What do I do? I decided to try and delete the Temporary ASP.NET files so I look under the v1.1.4322 folder and guess what? I don't see the temp files' folder for my app! Hmmmmm.... So I have a look-see under the v2.0.40607 folder. There it is! Well that's not right! &lt;br&gt;
&lt;br&gt;
It turns out the version of ASP.NET it was running under was incorrect. I opened up the virtual directory's property sheet and on the ASP.NET tab, sure enough, the version was set to 2.0. I switched it to 1.1 and everything worked like a charm. Looks like Win2k3 defaults to ASP.NET 2.0 when creating the virtual directory. 
&lt;br&gt;
&lt;br&gt;
&lt;em&gt;
Update: The reason why my Win2k3 test server was defaulting to version 2.0 is because I have Whidbey loaded on that machine.
&lt;/em&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110384877177149114?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110384877177149114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110384877177149114' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110384877177149114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110384877177149114'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/really-obscure-remoting-error.html' title='Really obscure remoting error'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110351591374864644</id><published>2004-12-19T20:07:00.000-08:00</published><updated>2004-12-19T20:11:53.746-08:00</updated><title type='text'>It's nice to win</title><content type='html'>&lt;a href="http://www.nfl.com/teams/news/OAK"&gt;Raiders won today!&lt;/a&gt; And even though there's no playoff hopes at least &lt;a href="http://www.nfl.com/teams/news/DEN"&gt;Denver lost another one&lt;/a&gt; so I'm happy! &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110351591374864644?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110351591374864644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110351591374864644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110351591374864644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110351591374864644'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/its-nice-to-win.html' title='It&apos;s nice to win'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110333365290180586</id><published>2004-12-17T17:13:00.000-08:00</published><updated>2004-12-17T17:36:43.456-08:00</updated><title type='text'>My thoughts on Datasets...</title><content type='html'>&lt;i&gt;I know alot of people have been discussing the Dataset vs. O/R-Custom entity issue. I got involved in a similar topic on the &lt;a href="http://www.universalthread.com"&gt;Universal Thread&lt;/a&gt; today and thought I'd post my thoughts to this blog as well.&lt;/i&gt;&lt;br&gt;&lt;br&gt;

You should definately check out O/R tools and the object approach to creating entities, however, taking a data-based approach to your .NET applications is not a wrong way to go about things depending on your skill set and the type of application you are writing. In fact, you can end up with a very successful distributed entity-based application using datasets. If you prefer writing SQL-Statements to define your entities (views on your data), and are comfortable with having the complex rules and validations in separate objects then the entity-based approach using datasets may be the best choice for you. For instance, if you are familiar with building FoxPro applications this will probably be the easiest approach. &lt;br&gt;
&lt;br&gt;

Using a pure O/R mapper means that you're taking a totally OOP approach and will create custom entities (instead of using the dataset as the entity). As many people point out there is a compelling reason to do so: You can encapsulate your business logic right into the entity. Also, it may be easier to exchange your entity with other non .NET systems. However, there are MANY compelling reasons to use datasets directly especially if you're sending them to Winforms clients:&lt;br&gt;
&lt;br&gt;

1. Databinding is much easier with the Dataset. This is especially true for Winforms apps where you have 2-way data binding. If you create custom objects you will need to implement a handful of interfaces to get it to work: IBindingList, IList, IListSource, etc. I'm not saying you can't do it manually, but there's some work involved.&lt;br&gt;
&lt;br&gt;


2. Filters/Sorting/Views are all made very very easy with the Dataset using the DataView.&lt;br&gt;
&lt;br&gt;


3. Complex relationships between datatables can be easily created and managed and referential integrity can be enforced without having to go back to the database. Navigating from a parent row to the child rows in a related table is a snap.&lt;br&gt;
&lt;br&gt;


4. AutoIncrementing columns automatically increment the keys when records are added. &lt;br&gt;
&lt;br&gt;


5. Easy data manipulation and persistence. This is huge. The dataset takes care of remembering current and original values for you. It handles row state very well. If you add a record then delete it again inside the dataset there are no changes sent to the database. It persists relations, constraints, errors (row and column), calculated columns (expression-based), and has an extended properties collection in which you can put any additional information you need. The dataset also lends itself well to dynamic columns because on a Merge you can specify to automatically add any additional columns it finds. This is very powerful. Sure you can code all of this into your own entity object but you need to ask yourself is it worth it?
&lt;br&gt;
&lt;br&gt;

6. XML integration/serialization is a snap with ReadXML/WriteXML methods. 
&lt;br&gt;
&lt;br&gt;

7. Simple data validation is built in. AllowNull, MaxLength, Referential integrity, uniqueness, data type. It also has an event model so that you can capture row/column changes. And with Row and Column errors (SetRowError/SetColumnError) you can easily indicate which rows/columns have problems and display them by databinding with the ErrorProvider. Complex validation or validator objects running on the middle-tier can simply set the row and/or column errors and send the dataset back to the client for resolution. 
&lt;br&gt;
&lt;br&gt;

8. Strongly typed datasets are very easy to generate from an XSD file. That XSD which contains all of the schema information for the entity can be dynamically created by calling your middle-tier interfaces that return the Datasets (just temporarily set the DataAdapter's MissingSchemaAction setting to AddWithKey while you're generating them). Then you can run the xsd.exe utility to create the strongly-typed dataset code. 
&lt;br&gt;
&lt;br&gt;

Keep in mind that datasets are NOT a business object in its traditional sense, they are simply the business data. Data is separated from behavior. If you think about data as being something that passes through your tiers and is validated, manipulated, twisted and banged into or by other objects (or other pieces of data) then choosing to use datasets is the right way to go. However, if you are more comfortable with the data as a real business object which encapsulates its own rules and behavior then use an O/R mapper and create custom business objects. But remember, if you are writing a complex Windows Forms business application then datasets "just work".
&lt;br&gt;
&lt;br&gt;

Of course, some O/R mappers work well with the entity-based approach too. I suggest you &lt;a href="http://weblogs.asp.net/fbouma/archive/2004/10/09/240225.aspx "&gt;read this excellent post by Frans Bouma &lt;/a&gt; which may help you figure out what approach you should take.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110333365290180586?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110333365290180586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110333365290180586' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110333365290180586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110333365290180586'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/my-thoughts-on-datasets.html' title='My thoughts on Datasets...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110323985146254199</id><published>2004-12-16T15:29:00.000-08:00</published><updated>2004-12-16T16:08:51.836-08:00</updated><title type='text'>.NET Samples for Visual FoxPro Developers</title><content type='html'>For people of the Fox or anyone doing data-based applications in .NET &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E9503C30-CE19-4FCB-8DC2-B10B544A602E&amp;displaylang=en"&gt;check these out!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110323985146254199?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110323985146254199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110323985146254199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110323985146254199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110323985146254199'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/net-samples-for-visual-foxpro.html' title='.NET Samples for Visual FoxPro Developers'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110323007099771958</id><published>2004-12-16T10:30:00.000-08:00</published><updated>2004-12-16T12:48:31.200-08:00</updated><title type='text'>Catching up on .Net Rocks! radio show</title><content type='html'>I was catching up on &lt;a href="http://msdn.microsoft.com/dotnetrocks/"&gt;episodes of DNR&lt;/a&gt; the other night and I have to say I really enjoyed episode #91 with Bily Hollis. Although I didn't agree with everything he said, I thought he was right on with his Windows forms architecure. It was nice to hear an expert has an architecture that uses the same concepts as the one I developed. I laughed out loud when he explained some of the real world things going on... and since I am developing Winforms applications and live in the real world it was refreshing to hear the practical side of things. &lt;br&gt;&lt;br&gt;

He has more of a VB background and I come from the FoxPro train of thought so it was cool to see that a VFP and a VB mind think alike when it comes to architecting business apps. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110323007099771958?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110323007099771958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110323007099771958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110323007099771958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110323007099771958'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/catching-up-on-net-rocks-radio-show.html' title='Catching up on .Net Rocks! radio show'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110314935216595922</id><published>2004-12-15T13:27:00.000-08:00</published><updated>2004-12-16T09:16:35.663-08:00</updated><title type='text'>Props to all the Beta testers</title><content type='html'>I just wanted to say THANK YOU to all the dedicated beta testers out there. Especially Whidbey and Yukon. If it weren't for you guys the rest of us would be in a world of pain (instead you are! :-P). You guys are so cool. I teeter back and forth between loving and hating Betas. I love taking a look at new stuff so that I can plan for it in my current projects. But sometimes I just don't have the time to spend (waste?) on Beta testing. &lt;a href="http://west-wind.com/weblog/posts/1162.aspx"&gt;Rick points out&lt;/a&gt; some of the things I happen to agree with when testing Microsoft Betas these days.&lt;br&gt;&lt;br&gt;
I tend to focus on how to do things in the current versions of stuff because that's how the bills are paid. I admit I'm not as cool, but the stakeholders think I am. ;-)

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110314935216595922?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110314935216595922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110314935216595922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110314935216595922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110314935216595922'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/props-to-all-beta-testers.html' title='Props to all the Beta testers'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110307663038017349</id><published>2004-12-14T17:59:00.000-08:00</published><updated>2004-12-14T18:10:30.380-08:00</updated><title type='text'>Binary serialization of datasets</title><content type='html'>In version 1.1 of the .NET framework datasets can only serialize themselves as XML... even if you're using the BinaryFormatter. That can end up as a lot of extra crud on the wire. If you're sending datasets remotely to your clients you'll definately want to &lt;a href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=ce9bf223-9236-42e7-b918-2b80a4e30f49"&gt;check this out&lt;/a&gt;. It's a surrogate class that gobbles up Datasets and converts all the dataset info into byte arrays and back again. As a test I had a dataset with 1000 records being sent across the internet and it took 12 seconds to load. Using the surrogate got me down to 3 seconds. Nice!
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110307663038017349?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110307663038017349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110307663038017349' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110307663038017349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110307663038017349'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/binary-serialization-of-datasets.html' title='Binary serialization of datasets'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110307306317465388</id><published>2004-12-14T17:10:00.000-08:00</published><updated>2004-12-14T17:12:45.243-08:00</updated><title type='text'>Enable/Disable databound controls automatically</title><content type='html'>Here's an easy way to automatically enable/disable databound controls when the CurrencyManager's position changes from/to -1: &lt;code&gt;
	&lt;p&gt;Private Sub CmCustomer_PositionChanged(ByVal sender As Object, ByVal e As 
	System.EventArgs) Handles CmCustomer.PositionChanged&lt;br&gt;
&amp;nbsp; If CmCustomer.Position = -1 Then&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.DisableDataControls(CmCustomer)&lt;br&gt;
&amp;nbsp; Else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.EnableDataControls(CmCustomer)&lt;br&gt;
&amp;nbsp; End If&lt;br&gt;
	End Sub&lt;br&gt;
	&lt;br&gt;
	Private _controlEnabledState As Hashtable&lt;br&gt;
	&lt;br&gt;
	Private Sub EnableDataControls(ByVal cm As CurrencyManager)&lt;br&gt;
&amp;nbsp; For Each b As Binding In cm.Bindings&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableControl(b.Control)&lt;br&gt;
&amp;nbsp; Next&lt;br&gt;
	End Sub&lt;br&gt;
	&lt;br&gt;
	Private Sub DisableDataControls(ByVal cm As CurrencyManager)&lt;br&gt;
&amp;nbsp; For Each b As Binding In cm.Bindings&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DisableControl(b.Control)&lt;br&gt;
&amp;nbsp; Next&lt;br&gt;
	End Sub&lt;br&gt;
	&lt;br&gt;
	Private Sub DisableControl(ByVal c As Control)&lt;br&gt;
&amp;nbsp; If (_controlEnabledState Is Nothing) Then&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; _controlEnabledState = New Hashtable&lt;br&gt;
&amp;nbsp; End If&lt;br&gt;
	&lt;br&gt;
&amp;nbsp; If Not (_controlEnabledState.Contains(c)) Then&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; _controlEnabledState.Add(c, c.Enabled)&lt;br&gt;
&amp;nbsp; End If&lt;br&gt;
	&lt;br&gt;
&amp;nbsp; If c.Enabled Then c.Enabled = False&lt;br&gt;
	End Sub&lt;br&gt;
	&lt;br&gt;
	Private Sub EnableControl(ByVal c As Control)&lt;br&gt;
&amp;nbsp; If Not (_controlEnabledState Is Nothing) Then&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; If (_controlEnabledState.Contains(c)) Then&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not c.Enabled Then c.Enabled = 
	DirectCast(_controlEnabledState(c), Boolean)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _controlEnabledState.Remove(c)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br&gt;
&amp;nbsp; End If&lt;br&gt;
	End Sub&lt;br&gt;
&amp;nbsp;&lt;/p&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110307306317465388?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110307306317465388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110307306317465388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110307306317465388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110307306317465388'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/enabledisable-databound-controls_14.html' title='Enable/Disable databound controls automatically'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110300634166294866</id><published>2004-12-13T22:36:00.000-08:00</published><updated>2004-12-13T22:41:24.526-08:00</updated><title type='text'>Monday Night</title><content type='html'>I didn't think the this would be that &lt;a href="http://www.nfl.com/gamecenter/recap/NFL_20041213_KC@TEN"&gt;good of a game &lt;/a&gt;considering I don't really care about either team too much. Too bad KC won. Anyone watch Earthsea? How was it?
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110300634166294866?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110300634166294866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110300634166294866' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110300634166294866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110300634166294866'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/monday-night.html' title='Monday Night'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110298724841499643</id><published>2004-12-13T17:04:00.000-08:00</published><updated>2004-12-14T17:28:11.043-08:00</updated><title type='text'>Racing wheels for sale</title><content type='html'>I've got some super light &lt;a href="http://tireandwheeldeals.com/images/fwdwheels/srracing/SR_6lg.jpg"&gt;KMC-SR6&lt;/a&gt; 18 inch wheels for sale.&lt;br&gt;
&lt;br&gt;
18" X 7.5"&lt;br&gt;
5x100 bolt pattern&lt;br&gt;
48mm offset&lt;br&gt;
&lt;br&gt;
I know they'll fit Subaru and VW because they have the same bolt pattern. I paid $180/each and drove on them one day and decided I didn't like how they looked on my black WRX. I'm asking $400 +shipping.
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110298724841499643?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110298724841499643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110298724841499643' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110298724841499643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110298724841499643'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/racing-wheels-for-sale.html' title='Racing wheels for sale'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110298570052874315</id><published>2004-12-13T16:47:00.000-08:00</published><updated>2004-12-14T17:19:02.680-08:00</updated><title type='text'>SQL-Server schema query</title><content type='html'>Here's a SQL query I use everytime I need to regenerate my stored procedures or entities and I thought you may find it useful. The following statement is used to fill a dataset with two tables (two result sets are returned). Relate the two tables on table_name and set Nested=True on the relation. Then call WriteXml on the dataset to get an XML doc of your entire database schema. Use that in conjunction with your pretty little stylesheets and you can code generate anything that uses schema information from your database.
	&lt;p&gt;&lt;code&gt;
SELECT DISTINCT c.table_name &lt;br&gt;
&amp;nbsp; 
 FROM information_schema.columns c
&lt;br&gt;
&amp;nbsp; INNER JOIN information_schema.tables t
ON c.table_name = t.table_name &lt;br&gt;
&amp;nbsp;
WHERE (t.table_type = 'BASE TABLE' and not (t.table_name = 'dtproperties'))
&lt;br&gt;
&amp;nbsp; ORDER BY c.table_name;
&lt;br&gt;
	SELECT &lt;br&gt;
&amp;nbsp; c.table_name, &lt;br&gt;
&amp;nbsp; c.column_name, &lt;br&gt;
&amp;nbsp; c.data_type, 
&lt;br&gt;
&amp;nbsp; CASE c.is_nullable
   WHEN 'YES' THEN 1
   ELSE 0
END AS is_nullable, 
&lt;br&gt;
&amp;nbsp; c.column_default,
&lt;br&gt;
&amp;nbsp; c.character_maximum_length, &lt;br&gt;
&amp;nbsp; c.numeric_precision, &lt;br&gt;
&amp;nbsp; c.numeric_scale, &lt;br&gt;
&amp;nbsp; c.datetime_precision,
    &lt;br&gt;
&amp;nbsp; COALESCE (
    ( &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT 
        CASE cu.column_name
            WHEN null THEN 0
            ELSE 1
        END
    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM information_schema.constraint_column_usage cu
    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INNER join information_schema.table_constraints ct
    ON ct.constraint_name = cu.constraint_name &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
    WHERE 
    ct.constraint_type = 'PRIMARY KEY' 
    AND &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; ct.table_name = c.table_name
    AND &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; cu.column_name = c.column_name
	&lt;br&gt;
&amp;nbsp; 
    ),0) AS IsPrimaryKey &lt;br&gt;
&amp;nbsp;
FROM information_schema.columns c
&lt;br&gt;
&amp;nbsp; INNER JOIN information_schema.tables t
ON c.table_name = t.table_name &lt;br&gt;
&amp;nbsp;
WHERE (t.table_type = 'BASE TABLE' AND NOT (t.table_name = 'dtproperties'))
&lt;br&gt;
&amp;nbsp; ORDER BY c.table_name, c.ordinal_position;
&lt;/code&gt;&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110298570052874315?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110298570052874315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110298570052874315' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110298570052874315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110298570052874315'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/sql-server-schema-query.html' title='SQL-Server schema query'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110296511600131108</id><published>2004-12-13T11:10:00.000-08:00</published><updated>2004-12-13T11:11:56.000-08:00</updated><title type='text'>Anyone doing VBnet code generation...</title><content type='html'>.. may find &lt;a href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=E7BACD5C-E5A1-42F6-A04A-F4A5CB032938"&gt;this tool&lt;/a&gt; useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110296511600131108?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110296511600131108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110296511600131108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110296511600131108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110296511600131108'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/anyone-doing-vbnet-code-generation.html' title='Anyone doing VBnet code generation...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110289918147198560</id><published>2004-12-12T16:51:00.000-08:00</published><updated>2004-12-12T16:54:11.250-08:00</updated><title type='text'>I can't believe it..</title><content type='html'>&lt;a href="http://www.nfl.com/gamecenter/live/NFL_20041212_SF@ARI.shtml"&gt;The Niners won. &lt;/a&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110289918147198560?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110289918147198560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110289918147198560' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289918147198560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289918147198560'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/i-cant-believe-it.html' title='I can&apos;t believe it..'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110289787893456070</id><published>2004-12-12T16:29:00.000-08:00</published><updated>2004-12-12T16:31:18.936-08:00</updated><title type='text'>Okay that's more like it</title><content type='html'>I knew the Niners would mess up their 25 point lead... and they did it in less than 20 minutes.
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110289787893456070?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110289787893456070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110289787893456070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289787893456070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289787893456070'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/okay-thats-more-like-it.html' title='Okay that&apos;s more like it'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110289440819705253</id><published>2004-12-12T15:32:00.000-08:00</published><updated>2004-12-12T15:33:28.196-08:00</updated><title type='text'>The world must be ending...</title><content type='html'>&lt;a href="http://www.nfl.com/gamecenter/live/NFL_20041212_SF@ARI.shtml"&gt;.. the Niners are beating Arizona? &lt;/a&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110289440819705253?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110289440819705253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110289440819705253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289440819705253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289440819705253'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/world-must-be-ending.html' title='The world must be ending...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110289330336736217</id><published>2004-12-12T15:11:00.000-08:00</published><updated>2004-12-14T17:22:11.563-08:00</updated><title type='text'>I wish VBnet had this</title><content type='html'>&lt;code&gt;
Dim someText As String

&lt;br&gt;
	&lt;br&gt;
	Text TO someText &lt;br&gt;

	&lt;br&gt;

Anything I type in here is placed into &lt;br&gt;
the someText variable at runtime. No &lt;br&gt;
more dealing with " &amp;amp; _&lt;br&gt;

&lt;br&gt;
But that would be WAY too convenient.&lt;br&gt;
	&lt;br&gt;
End Text
&lt;/code&gt;

	&lt;p&gt;(Yes, &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/lngtext__endtext.asp"&gt;I ripped this off of VFP&lt;/a&gt;)
	&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110289330336736217?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110289330336736217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110289330336736217' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289330336736217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289330336736217'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/i-wish-vbnet-had-this.html' title='I wish VBnet had this'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110289019665209427</id><published>2004-12-12T14:13:00.000-08:00</published><updated>2004-12-12T14:23:41.930-08:00</updated><title type='text'>God, please make everyone use a friendlier web page format </title><content type='html'>Repeat after me: "Content on left, menu on right!"

Let's not torture the smart phone user by making them scroll through the long list of links, archives and generally static menu items just so they can read your latest post!
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110289019665209427?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110289019665209427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110289019665209427' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289019665209427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110289019665209427'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/god-please-make-everyone-use.html' title='God, please make everyone use a friendlier web page format &lt;rant&gt;'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9581590.post-110288497340337973</id><published>2004-12-12T13:46:00.000-08:00</published><updated>2004-12-12T12:56:38.143-08:00</updated><title type='text'>There's always next year...</title><content type='html'>Damn &lt;a href="http://www.nfl.com/teams/news/OAK"&gt;Raiders!&lt;/a&gt;

Curry out, Wheatly out and fact that they're so inconsistent is killing my fingernails... I think I bit off a cuticle.

At least &lt;a href="http://www.nfl.com/gamecenter/recap/NFL_20041128_OAK@DEN"&gt;we beat Denver&lt;/a&gt;!
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9581590-110288497340337973?l=bethmassi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bethmassi.blogspot.com/feeds/110288497340337973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9581590&amp;postID=110288497340337973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110288497340337973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9581590/posts/default/110288497340337973'/><link rel='alternate' type='text/html' href='http://bethmassi.blogspot.com/2004/12/theres-always-next-year.html' title='There&apos;s always next year...'/><author><name>Beth Massi</name><uri>http://www.blogger.com/profile/07884372636469739761</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.universalthread.com/Photo/013231.jpg'/></author><thr:total>0</thr:total></entry></feed>
