<?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-8134263660136189678</id><updated>2011-11-27T16:30:29.066-08:00</updated><category term='.Net Configuration'/><category term='Sql Server Functions'/><category term='CSS columns'/><category term='C# String Parsing'/><category term='Saving State'/><category term='CSS'/><category term='z-index'/><category term='Asp.Net Data Caching'/><category term='CSS Element Positioning'/><category term='Sql Tip'/><category term='Regular Expressions'/><category term='DATEADD'/><category term='DATEDIFF'/><category term='Global.asax'/><category term='Sql Date Range Searching'/><category term='Sql Server'/><category term='Asp.Net Error Logging'/><category term='Without Regular Expressions'/><category term='HttpRuntime.Cache'/><category term='Sub String in Sql'/><category term='.Net Distribution'/><category term='Database Design'/><title type='text'>DESIGN&gt;CODE&gt;TEST</title><subtitle type='html'>Code design, design patterns, asp.net, c#, sql, css, graphics, photoshop, gui design, accessibility, usability, javascript, ajax, testing, rad, agile, oop, aop, oap's</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-4082100396260930116</id><published>2009-12-11T04:44:00.000-08:00</published><updated>2009-12-15T07:44:36.189-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Without Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='C# String Parsing'/><title type='text'>String Parsing in C#</title><content type='html'>&lt;p&gt;
Regular Expressions are powerful things, but they are difficult to learn when your main objective is to produce business-critical information systems and you must also keep up to date with the latest .net features, the latest browers and quirks, the latest version of CSS, new Javascript libraries.....I think you get the picture.  It's something else to learn.  This is the reason we google our parsing requirements and re-use existing regular expressions, without actually understanding them.
&lt;/p&gt;
&lt;p&gt;
I had a couple of requirements of my own and couldn't solve the more complex parsing with regular expressions.  So, I've knocked up a light-weight string parser to satisfy my needs.  I thought I'd share it with you.  Here's the class in C#:
&lt;/p&gt;
&lt;fieldset&gt;
&lt;pre&gt;
public class StringParser {

    private string _s;
    private int _len;
    private int _plen;
    private int _lPos;
    private int _pos;
    private char _c;

    public StringParser(string s) {
        _s = s;
        if (_s != null) {
            _len = s.Length;
            _plen = (_len - 1);
            if (_len &gt; 0) {
                _c = s[0];
                _pos = -1;
            }
        }
    }
  
    /// &lt;summary&gt;
    /// Call to determine if there is still string to parse and to
    /// advance the char position by one
    /// &lt;/summary&gt;
    public bool Parse() {
        if (_pos &lt; _plen) {                
            _c = _s[++_pos];
            return true;
        }
        return false;
    }

    /// &lt;summary&gt;
    /// Advances the parser by a given number of chars.
    /// &lt;/summary&gt;
    /// &lt;param name="places"&gt;number of chars to advance by&lt;/param&gt;
    /// &lt;returns&gt;A boolean true if successful, otherwise a boolean
    /// false if this advance pushes the position past the max len
    /// of the parsing string.&lt;/returns&gt;
    public void AdvancePos(int places) {
        int npos = _pos + places;
        if (npos &gt;= _len) {
            throw new IndexOutOfRangeException();
        }
        _pos = npos;
        _c = _s[_pos];
    }

    /// &lt;summary&gt;
    /// Call to return the current char.
    /// &lt;/summary&gt;
    public char CurrentChar {
        get { return _c; }
    }

    /// &lt;summary&gt;
    /// Call to check if parser is positioned on given sub string.
    /// &lt;/summary&gt;
    /// &lt;param name="s"&gt;The sub string to check for at the current
    /// position.&lt;/param&gt;
    /// &lt;returns&gt;A boolean true if sub string is found at current
    /// position, otherwise false&lt;/returns&gt;       
    public bool IsParsing(string sub) {
        if ((_pos + sub.Length) &lt; _len) {
            return (_s.Substring(_pos, sub.Length) == sub);
        }
        return false;
    }

    /// &lt;summary&gt;
    /// Call to read a portion/sub string of the string.  This
    /// method advances the position of the curr char.
    /// &lt;/summary&gt;
    /// &lt;param name="sarr"&gt;Represents a sub string, or multiple
    /// sub strings(delimiters) to read up to.  If multiple sub
    /// strings are passed then it is the sub string closest to
    /// the current position which is used.&lt;/param&gt;
    /// &lt;param name="incl"&gt;If boolean true is passed then the
    /// sub string will be included in the returned string.
    /// &lt;/param&gt;
    /// &lt;returns&gt;The sub string.&lt;/returns&gt;        
    public string Read(string[] subArr, bool incl) {
        string read = null;
        int spos = _len;
        string wdel = string.Empty;
        foreach (string s in subArr) {
            int si = _s.IndexOf(s, _pos + 1);
            if (si &gt; -1 &amp;&amp; si &lt;= spos) {
                spos = si;
                wdel = s;
            }
        }
        if (spos &gt; _pos &amp;&amp; spos &lt; _len) {
            // put pos on last char read
            int npos = _pos + (spos - _pos);
            read = _s.Substring(_pos, (npos - _pos)
                + ((incl) ? wdel.Length : 0));
            _pos = npos;
            _c = _s[_pos];
        }
        return read;
    }  

    /// &lt;summary&gt;
    /// Call to advance current position to a given sub string.
    /// This method advances the position of the curr char.
    /// &lt;/summary&gt; 
    /// &lt;param name="s"&gt;The string to find and move to.&lt;/param&gt;
    /// &lt;param name="adv"&gt;If boolean true is passed and the string
    /// is found, then position will advance by one char, otherwise
    /// the position will remain on the found string.&lt;/param&gt;
    /// &lt;returns&gt;A boolean true if 's' is found, otherwise false.
    /// &lt;/returns&gt;        
    public bool MoveTo(string sub, bool adv) {
        int npos = _s.IndexOf(sub, _pos + 1);
        if (adv) {
            npos = npos + sub.Length;
        }
        if (npos &gt; _pos &amp;&amp; npos &lt; _len) {
            _pos = npos;
            _c = _s[_pos];
            return true;
        }
        return false;
    }

    /// &lt;summary&gt;
    /// Skip forwards to next non-ws char, but only if currently
    /// positioned on a space.  If curr char is not a space then
    /// the position isn't advanced.
    /// &lt;/summary&gt;
    public void Squash() {            
        while (_c == ' ' &amp;&amp; Parse()) {
        }            
    }
}
&lt;/pre&gt;
&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-4082100396260930116?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/4082100396260930116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/12/string-parsing-c-regular-expressions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/4082100396260930116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/4082100396260930116'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/12/string-parsing-c-regular-expressions.html' title='String Parsing in C#'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-4622991830108273302</id><published>2009-12-04T12:43:00.001-08:00</published><updated>2009-12-04T12:47:56.808-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS columns'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Consistent/Equal-Height Columns in CSS</title><content type='html'>&lt;p&gt;Here is one technique for creating a consistent/equal height column layout in CSS.  This takes advantage of relative and absolute positioning.&lt;/p&gt;
&lt;p&gt;Copy the HTML and CSS below and paste into a text file.  Save the file as default.htm and double click.  Add and remove lorem ipsum text to the content div and watch the right-hand columns grow and shrink consistently.&lt;/p&gt;
&lt;fieldset&gt;
&lt;pre&gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;Equal Columns in CSS from designcodetest.blogspot.com&amp;lt;/title&amp;gt;
        &amp;lt;style type="text/css"&amp;gt;
            body{                
                text-align:center;            
            }
            #mainWrap{
                margin:0 auto;
                width:964px;
                text-align:left;
            }
            #head{
                height:100px;
                background:#999;
            }
            #bodWrap {
                position:relative;                
            }
            #content{
                background:#fff;
                padding:10px 370px 10px 10px;
            }
            #midCol{
                background:#f6e5e4;
                position:absolute;
                right:200px;top:0;bottom:0;
                width:160px;
            }
            #rightCol{
                background:#e342e5;
                position:absolute;
                right:0;top:0;bottom:0;
                width:200px;
            }
            #foot{
                background:#ccc;
                width:964px;
                margin:0 auto;
                height:50px;
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div id="mainWrap"&amp;gt;
            &amp;lt;div id="head"&amp;gt;
                &amp;lt;h1&amp;gt;Equal-Height Columns Sample&amp;lt;/h1&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div id="bodWrap"&amp;gt;
                &amp;lt;div id="content"&amp;gt;
                    &amp;lt;p&amp;gt;
                        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec gravida hendrerit odio, non rhoncus magna blandit id. Donec ac metus augue, in pellentesque eros. Phasellus eget mollis erat. Nullam condimentum ornare arcu, et tempus nisl elementum a. Donec molestie placerat felis, non hendrerit tellus sodales sed. Donec mollis sollicitudin purus, ut tempus augue euismod at. Aliquam eget metus ipsum. Pellentesque mollis semper elit, et accumsan eros ullamcorper quis. Maecenas at felis nisl, id viverra felis. Curabitur ullamcorper sem vel orci tempor lobortis. Vivamus viverra lacus in justo convallis tempus. Sed ullamcorper arcu sit amet orci pulvinar tempus. Quisque pretium bibendum nisl eu gravida. Nunc congue metus quis nisl hendrerit sodales. Nunc a nibh scelerisque sapien faucibus sagittis id sit amet mi. 
                    &amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div id="midCol"&amp;gt;
                    &amp;lt;span&amp;gt;Col 1 with equal/consistent height&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div id="rightCol"&amp;gt;
                    &amp;lt;span&amp;gt;Col 2 with equal/consistent height&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div id="foot"&amp;gt;
                &amp;lt;span&amp;gt;Example by Mark Graham, &amp;lt;a href="http://designcodetest.blogspot.com/" title="Cool articles and tips about design patterns, c#, asp.net, gui design, css, javascript, ajax..."&amp;gt;http://designcodetest.blogspot.com/&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-4622991830108273302?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/4622991830108273302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/12/consistent-equal-height-columns-css.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/4622991830108273302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/4622991830108273302'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/12/consistent-equal-height-columns-css.html' title='Consistent/Equal-Height Columns in CSS'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-1430054913789459957</id><published>2009-12-02T03:22:00.000-08:00</published><updated>2009-12-03T11:31:52.995-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sql Date Range Searching'/><category scheme='http://www.blogger.com/atom/ns#' term='DATEDIFF'/><category scheme='http://www.blogger.com/atom/ns#' term='DATEADD'/><title type='text'>Accurate DATETIME Range Searching in SQL Server</title><content type='html'>&lt;p&gt;A common aspect of transactional and analytical programming in information systems is searching on a date range.  When performing a search it's important that our SQL is accurate.  Take a look at the following SQL that will exclude rows that should be included in the results.&lt;/p&gt;
&lt;fieldset&gt;
&lt;pre&gt;
where SubmittedTime &gt;= @DateFrom
and SubmittedTime &lt;= @DateTo
&lt;/pre&gt;
&lt;/fieldset&gt;
&lt;p&gt;
This isn't difficult to fix, but it's something that is often overlooked, or missed.&lt;/p&gt;
&lt;h3&gt;
What's wrong with this &lt;em&gt;where&lt;/em&gt; clause?&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;Let's try a scenario:&lt;/strong&gt;
We are working with Win Forms or Web Forms and we need some neat method of allowing a user to pick a date range so they can get results.  We drop a couple of pickers on a form and code accordingly.  The datetime values received from said controls will have their time portions set to 00:00:00 because these controls, by default, allow us to pick dates.  Let's face it, users aren't really concerned with time when they're producing month end reports.
&lt;/p&gt;
&lt;p&gt;
So, when a user picks 1st Nov 2009 to 30th Nov 2009 they want the search to be inclusive, meaning they want data from the 1st and from the 30th to appear in the report.  Here's the problem: &lt;em&gt;where SubmittedTime &lt;= @DateTo&lt;/em&gt; is searching for all rows whose SubmittedTime is less than or equal to the 30th November 2009 at midnight.  Will the data that John Smith entered on the 30th Nov 2009 at 10:05:12 be included in this report?  No.  Neither will any rows entered on the 30th.
&lt;/p&gt;
&lt;h3&gt;
Add One Day and Trunc&lt;/h3&gt;
&lt;p&gt;
To fix this problem we need to add one day to the end date, remove(trunc) the time portion and then use the less than(&lt;) comparison operator in the search.  I'm truncating the time portions to be on the safe side.
&lt;fieldset&gt;
&lt;pre&gt;
select * from Inspected
where SubmittedTime &gt;= dateadd(day, datediff(day, 0, @DateFrom), 0)
and SubmittedTime &lt; dateadd(day, datediff(day, 0, @DateTo), 1)
order by SubmittedTime desc
&lt;/pre&gt;
&lt;/fieldset&gt;
&lt;p&gt;
&lt;h3&gt;
A Re-useable Function&lt;/h3&gt;
&lt;p&gt;
I'm human and I don't write SQL every day.  If you're human and occasionally forget things then try this function for size.
&lt;fieldset&gt;
&lt;pre&gt;
CREATE FUNCTION [dbo].[trunc]
(
  @dt datetime
)
RETURNS datetime
AS
BEGIN
  return dateadd(day, datediff(day, 0, @dt), 0);
END
&lt;/pre&gt;
&lt;/fieldset&gt;
&lt;/p&gt;
&lt;p&gt;
The SQL now looks much cleaner:
&lt;/p&gt;
&lt;fieldset&gt;
&lt;pre&gt;
select * from Inspected
where SubmittedTime &gt;= dbo.trunc(@DateFrom)
and SubmittedTime &lt; dbo.trunc(@DateTo + 1)
order by SubmittedTime desc
&lt;/pre&gt;
&lt;/fieldset&gt;
&lt;h3&gt;
Hats Off&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.sql-server-performance.com/articles/dev/datetime_datatype_p1.aspx" title="An article describing how the datetime data type is stored in Sql Server" target="_blank"&gt;DATETIME in MS Sql Server[^]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.bennadel.com/blog/122-Getting-Only-the-Date-Part-of-a-Date-Time-Stamp-in-SQL-Server.htm" title="An article about effecting searching in Sql Server" target="_blank"&gt;Searching a Date Range in Sql Server[^]&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-1430054913789459957?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/1430054913789459957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/12/sql-datetime-range-searching-datediff.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/1430054913789459957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/1430054913789459957'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/12/sql-datetime-range-searching-datediff.html' title='Accurate DATETIME Range Searching in SQL Server'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-2711130220255238102</id><published>2009-11-26T08:51:00.000-08:00</published><updated>2009-12-03T11:34:28.011-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.Net Data Caching'/><category scheme='http://www.blogger.com/atom/ns#' term='HttpRuntime.Cache'/><title type='text'>Deep Copy Data Caching in Asp.Net</title><content type='html'>&lt;p&gt;Data stored in the cache is shared; it is not thread-safe.  If you modify the data then the next request will see your changes.  Sometimes developers are under the illusion that because they have assigned the data in the cache to a new object variable or performed a shallow copy of the cached data that they can make change without consequence.  Not true.  Here are a few classes to help protect you.  However, you still need to ensure that your cacheable objects are deep copied (derive from my IDeepCopy and implement).&lt;/p&gt;&lt;p&gt;Combine this code for request-safe data caching.&lt;/p&gt;&lt;em&gt;The contents of CacheArgs.cs&lt;/em&gt;
&lt;fieldset&gt;
&lt;pre&gt;
using System;
using System.Web.Caching;

namespace ProtectedCache {

    // This is a purely a data object without behavior that plays
    // a bigger part in a framework that I have written.  I'll
    // continue to use it for this example even though it doesn't
    // have an obvious purpose.

    public sealed class CacheArgs {

        private DateTime _absoluteExpiration = Cache.NoAbsoluteExpiration;
        private TimeSpan _slidingExpiration = Cache.NoSlidingExpiration;

        public CacheDependency GetCacheDependency() {
            return null; // Implement when required
        }

        public DateTime GetAbsoluteExpiration() {
            return _absoluteExpiration;
        }

        public void SetAbsoluteExpiration(DateTime dt) {
            _absoluteExpiration = dt;
        }

        public TimeSpan GetSlidingExpiration() {
            return _slidingExpiration;
        }

        public void SetSlidingExpiration(TimeSpan ts) {
            _slidingExpiration = ts;
        }
    }
}
&lt;/pre&gt;
&lt;/fieldset&gt;
&lt;em&gt;The contents of IDeepCopy.cs&lt;/em&gt;
&lt;fieldset&gt;
&lt;pre&gt;
namespace ProtectedCache {

    // Simple interface to indicate intent.  I was thinking
    // about using the existing ICloneable interface and
    // documenting it for developers to ensure deep copies
    // are performed.  I decided not to and opted for a new
    // self-documenting interface.

    public interface IDeepCloneable {

        object DeepClone();
    }
}
&lt;/pre&gt;&lt;/fieldset&gt;&lt;em&gt;The contents of Cacher.cs&lt;/em&gt;
&lt;fieldset&gt;
&lt;pre&gt;
using System;
using System.Web;
using System.Collections.Generic;
using System.Threading;

namespace ProtectedCache {

    public static class Cacher {

        public static T Load&amp;lt;T&amp;gt;(string key)
            where T : IDeepCloneable {            

            // Perform a thread-safe read of the cache

            object item = HttpRuntime.Cache[key];
            if (item != null) {

                // Treat an item that is not of expected type
                // as exceptional cases. What you're requesting
                // should be in the cache.

                if (!(item is T)) {
                    throw new InvalidCastException(
                        "Object is not of type " + typeof(T));
                }                
                return (T)((IDeepCloneable)item).DeepClone();
            }
            return default(T);            
        }
        
        public static void Save&amp;lt;T&amp;gt;(T item, string key,
            CacheArgs args) where T : IDeepCloneable {
            
            // Perform thread-safe write to cache, deep cloning
            // the item

            HttpRuntime.Cache.Insert(key,
                item.DeepClone(),
                args.GetCacheDependency(),
                args.GetAbsoluteExpiration(),
                args.GetSlidingExpiration());
        }
    }
}
&lt;/pre&gt;&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-2711130220255238102?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/2711130220255238102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/asp-net-safe-data-caching-deep-copy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/2711130220255238102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/2711130220255238102'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/asp-net-safe-data-caching-deep-copy.html' title='Deep Copy Data Caching in Asp.Net'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-1114324164900122421</id><published>2009-11-26T07:11:00.000-08:00</published><updated>2009-12-03T11:36:07.207-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sub String in Sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Sql Server Functions'/><category scheme='http://www.blogger.com/atom/ns#' term='Sql Tip'/><title type='text'>Extract Substring Using SQL</title><content type='html'>&lt;p&gt;I've been doing some reading on Microsoft forums and I came across quite a lot of posts with questions about string manipulation using various Transact-Sql string manip. functions.  It prompted me to write this little snippy-snappy-snoo&lt;/p&gt;&lt;p&gt;One of the questions was about extracting a portion of a string.  Here's an example of how to extract a sub string from a string that has consistent seperation of parts.  The following Sql will extract and print the third part (number 6717) from the string assigned to the @data variable. &lt;/p&gt;
&lt;fieldset&gt;
&lt;pre&gt;
declare @data varchar(100);
set @data = 'Asl/UKE/6717/08';
declare @firstpass varchar(100);
set @firstpass = left(@data, len(@data) - charindex('/', reverse(@data)));
print right( @firstpass, charindex('/', reverse(@firstpass))-1);
&lt;/pre&gt;
&lt;/fieldset&gt;&lt;p&gt;The above was tested on Sql Server 2005&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-1114324164900122421?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/1114324164900122421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/get-substring-using-sql-extract.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/1114324164900122421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/1114324164900122421'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/get-substring-using-sql-extract.html' title='Extract Substring Using SQL'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-6212309143032584787</id><published>2009-11-24T07:43:00.000-08:00</published><updated>2009-11-26T07:04:14.308-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.Net Configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Distribution'/><title type='text'>A .Net Framework Configuration, Distribution &amp; Release Resources Page</title><content type='html'>&lt;h3&gt;How to Check the Latest Version of .Net Framework Installed&lt;br /&gt;
&lt;/h3&gt;&lt;p&gt;Type &lt;em&gt;javascript:alert(navigator.userAgent)&lt;/em&gt; into your browser's address bar and you will receive an alert informing you of the versions of .Net installed on the local machine.  Hats off to &lt;a href="http://www.walkernews.net/" title="Walker News"&gt;Walker News&lt;/a&gt; for this little jogger.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-6212309143032584787?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/6212309143032584787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/dot-net-framework-configuration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/6212309143032584787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/6212309143032584787'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/dot-net-framework-configuration.html' title='A .Net Framework Configuration, Distribution &amp; Release Resources Page'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-5678802286215683396</id><published>2009-11-24T05:26:00.000-08:00</published><updated>2009-12-03T11:28:52.452-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.Net Error Logging'/><category scheme='http://www.blogger.com/atom/ns#' term='Global.asax'/><title type='text'>Asp.Net Error Logging in Global.asax</title><content type='html'>&lt;p&gt;Here is a snippet of code you can use if you require some global, catch-all error logging.  Create a Global.asax file in your web project and replace the generated Application_Error handler with the following code.  Also, create a Logs directory in the root of your web app.  This is where the log files are written.
&lt;/p&gt;&lt;fieldset&gt;
&lt;pre&gt;
void Application_Error(object sender, EventArgs e) {
    Exception ex = Server.GetLastError().GetBaseException();
    string dt = DateTime.Now.ToString("yyyyMMdd_hhmmsstt");        
    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(
        Server.MapPath(VirtualPathUtility.ToAbsolute("~/Logs/")) +
        dt, true)) {
        sw.WriteLine("Logged: " + dt);
        sw.WriteLine("Request: " + Request.Url.OriginalString);
        sw.WriteLine("Form: " + Request.Form.ToString());
        sw.WriteLine("Exception Message: " + ex.Message);
        sw.WriteLine("Target Site: " + ex.TargetSite);
        sw.Write("Stack Trace: " + ex.StackTrace.Trim());
        sw.Flush();
    }
}
&lt;/pre&gt;&lt;/fieldset&gt;&lt;p&gt;There are better logging solutions out there but this is still a useful snippet if you need something snappy that doesn't require much of a learning curve.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-5678802286215683396?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/5678802286215683396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/asp-net-error-logging-global-asax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/5678802286215683396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/5678802286215683396'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/asp-net-error-logging-global-asax.html' title='Asp.Net Error Logging in Global.asax'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-8389138801363023791</id><published>2009-11-23T02:11:00.000-08:00</published><updated>2009-12-03T11:23:25.597-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='z-index'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS Element Positioning'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>What is z-index in CSS?</title><content type='html'>&lt;p&gt;The z-index property will set a bottom to top display ordering of positioned elements.  By positioned I mean elements that have been given a position in CSS, e.g. position:relative.  This will allow you to specify elements that should appear on top when elements overlap.
&lt;/p&gt;&lt;h3&gt;My Ajax Calendar Extender Dilemma&lt;/h3&gt;&lt;p&gt;I had a issue whereby my ajax calendar extender pop up seemed to have a transparent background and the dates were difficult to read.  They appeared to be overlapped by another element on the page.  I've read many posts about the &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Calendar/Calendar.aspx"&gt;ajax calendar extender&lt;/a&gt; being buggy and a few discussing &lt;a href="http://www.w3schools.com/Css/pr_pos_z-index.asp"&gt;z-index&lt;/a&gt;; none provided me with enough detail to fix my problem.
&lt;/p&gt;&lt;p&gt;People are quick to call things buggy if they're not really sure what is causing a problem, so I dimissed this to begin with and concentated on learning about the CSS z-index property, which incidentally, DID, fix my display problem with the &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Calendar/Calendar.aspx"&gt;ajax calendar extender&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;I have provided you with some code to clear things up.
&lt;/p&gt;&lt;h3&gt;&lt;a href="http://designcodetest.blogspot.com/2009/11/what-is-z-index-in-css.html" title="What is z-index in CSS, Sample HTML and CSS"&gt;Sample HTML and CSS&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Copy the following html and css from &amp;lt;html&amp;gt; to &amp;lt;/html&amp;gt; and paste it into a notepad file then save as default.htm (or a name of your choice).  Double-click this file to run and click on the top plus sign(+) to show pop up.  Play around with the z-index ordering in the CSS script section of this code and re-run to see different effects.
&lt;/p&gt;&lt;fieldset&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;CSS Positioning and z-index Sample by Mark Graham&amp;lt;/title&amp;gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; 
.clr{ clear:both; }
label { display:block; }
.clickable { cursor:hand; }
#div1, #div2, #div3 {
height:40px;border-top:1px solid #ccc;visibility:visible;
}
#pop1, #pop2, #pop3 {
float:left;background:#ffef9f;border:1px solid #333;padding:60px;visibility:hidden;
left:0;top:0;
}     

/* --- Here are the positioning and z-index properties.  Play around with these values --- */

#div1, #div2, #div3 {
position:relative;
}
#pop1, #pop2, #pop3 {
position:absolute;
z-index:2;
}     
#div2 {
z-index:1;
}

&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Sample by Mark Graham (&amp;lt;a href=&amp;quot;http://designcodetest.blogspot.com/&amp;quot; title&amp;quot;Design, Code, Test blogging by Mark Graham&amp;quot;&amp;gt;designcodetest&amp;lt;/a&amp;gt;)&amp;lt;/h1&amp;gt;

&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;
&amp;lt;span id=&amp;quot;sp1&amp;quot; class=&amp;quot;clickable&amp;quot;&amp;gt;+&amp;lt;/div&amp;gt;
&amp;lt;div id=&amp;quot;pop1&amp;quot;&amp;gt;
&amp;lt;label&amp;gt;DateFrom:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateFrom1&amp;quot; name=&amp;quot;txtDateFrom1&amp;quot; /&amp;gt;
&amp;lt;label&amp;gt;DateTo:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateTo1&amp;quot; name=&amp;quot;txtDateTo1&amp;quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;
&amp;lt;span id=&amp;quot;sp2&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt;
&amp;lt;div id=&amp;quot;pop2&amp;quot;&amp;gt;
&amp;lt;label&amp;gt;DateFrom:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateFrom2&amp;quot; name=&amp;quot;txtDateFrom2&amp;quot; /&amp;gt;
&amp;lt;label&amp;gt;DateTo:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateTo2&amp;quot; name=&amp;quot;txtDateTo2&amp;quot; /&amp;gt;
&amp;lt;/div&amp;gt;        
&amp;lt;/div&amp;gt;

&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;
&amp;lt;span id=&amp;quot;sp3&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt;
&amp;lt;div id=&amp;quot;pop3&amp;quot;&amp;gt;
&amp;lt;label&amp;gt;DateFrom:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateFrom3&amp;quot; name=&amp;quot;txtDateFrom3&amp;quot; /&amp;gt;
&amp;lt;label&amp;gt;DateTo:&amp;lt;/label&amp;gt;
&amp;lt;input id=&amp;quot;txtDateTo3&amp;quot; name=&amp;quot;txtDateTo3&amp;quot; /&amp;gt;
&amp;lt;/div&amp;gt;        
&amp;lt;/div&amp;gt;

&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
window.onload = function() {            
document.getElementById(&amp;quot;sp1&amp;quot;).onclick = clicked;
}

function clicked() {
document.getElementById(&amp;quot;pop1&amp;quot;).style.visibility = 'visible';
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-8389138801363023791?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/8389138801363023791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/what-is-z-index-in-css.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/8389138801363023791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/8389138801363023791'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/what-is-z-index-in-css.html' title='What is z-index in CSS?'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8134263660136189678.post-6323915535699528814</id><published>2009-11-18T03:09:00.000-08:00</published><updated>2009-11-23T14:17:42.723-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sql Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Saving State'/><title type='text'>Saving State in the Database</title><content type='html'>&lt;p&gt;Saving state to a database is a common solution, but how do we do this effectively?  I'm going to give you three solutions to this problem and then let you make your own mind up.&lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;&lt;a href="http://codearch.blogspot.com/2009/06/database-design-state-lookup-tables.html" title="Database Design Using Bit Fields"&gt;Database Design One: Single Table and Many Bit Fields&lt;/a&gt;&lt;br /&gt;
&lt;/h3&gt;&lt;a href="http://1.bp.blogspot.com/_q0csvDQIEQI/Si-bSPJfsNI/AAAAAAAAAEs/eeOSpuUDQo8/s1600-h/Drawing1.png"&gt;&lt;img alt="" border="0" class="leftimg" id="BLOGGER_PHOTO_ID_5345662020318376146" src="http://1.bp.blogspot.com/_q0csvDQIEQI/Si-bSPJfsNI/AAAAAAAAAEs/eeOSpuUDQo8/s400/Drawing1.png" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;h4&gt;Pro's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;All data is stored in the one database table so could be an effective solution if the state model is kept simple.  In turn, the SQL to return the current state would be simple; no table joins required.&lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;Con's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;This is not an extensible solution and would become harder to maintain as business process and state evolves, we wouldn't be able to track state-change history and keeping state fields mutually exclusive could be error-prone.&lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;&lt;a href="http://codearch.blogspot.com/2009/06/database-design-state-lookup-tables.html" title="Database Design Using a State Field And a Lookup Table"&gt;Database Design Two: Using a Foreign Key State Field and a Lookup Table&lt;/a&gt;&lt;br /&gt;
&lt;/h3&gt;&lt;a href="http://2.bp.blogspot.com/_q0csvDQIEQI/Si-c3xu1BJI/AAAAAAAAAE0/-Mqanp996rk/s1600-h/Drawing2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5345663764768556178" src="http://2.bp.blogspot.com/_q0csvDQIEQI/Si-c3xu1BJI/AAAAAAAAAE0/-Mqanp996rk/s400/Drawing2.png" style="cursor: hand; height: 109px; width: 291px;" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;h4&gt;Pro's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;This is a clean solution for maintaining state and requires only one Sql join to get a description for the current state.&lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;Con's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;We still cannot maintain a history of state changes with this solution.&lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;&lt;a href="http://codearch.blogspot.com/2009/06/database-design-state-lookup-tables.html" title="Manage business logic state using a state history table and a lookup table when architecting a database design."&gt;Database Design Three: A State Table and a Lookup Table&lt;/a&gt;&lt;br /&gt;
&lt;/h3&gt;&lt;a href="http://2.bp.blogspot.com/_q0csvDQIEQI/Si-fJuaOpfI/AAAAAAAAAFE/56Q5eC_X-f0/s1600-h/Drawing3.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5345666272137750002" src="http://2.bp.blogspot.com/_q0csvDQIEQI/Si-fJuaOpfI/AAAAAAAAAFE/56Q5eC_X-f0/s400/Drawing3.png" style="cursor: hand; height: 92px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;Pro's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;An effective database design that allows us to easily determine the current state and maintain complete state-change history, which is good for auditing and undoing mistakes.&lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;Con's&lt;br /&gt;
&lt;/h4&gt;&lt;p&gt;The SQL required to insert and select is a little more complex than the other two solutions.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8134263660136189678-6323915535699528814?l=designcodetest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://designcodetest.blogspot.com/feeds/6323915535699528814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://designcodetest.blogspot.com/2009/11/saving-state-in-database.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/6323915535699528814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8134263660136189678/posts/default/6323915535699528814'/><link rel='alternate' type='text/html' href='http://designcodetest.blogspot.com/2009/11/saving-state-in-database.html' title='Saving State in the Database'/><author><name>Mark Graham (MCP)</name><uri>http://www.blogger.com/profile/15031775798245003778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_q0csvDQIEQI/SZA9zDWTclI/AAAAAAAAAAM/J7n7gm6Rz0M/S220/codeprojectpic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q0csvDQIEQI/Si-bSPJfsNI/AAAAAAAAAEs/eeOSpuUDQo8/s72-c/Drawing1.png' height='72' width='72'/><thr:total>1</thr:total></entry></feed>
