<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Scott Klueppel's Blog - SQL</title>
    <link>http://offroadcoder.com/</link>
    <description>making the hard line look easy</description>
    <language>en-us</language>
    <copyright>Scott Klueppel</copyright>
    <lastBuildDate>Tue, 27 Jul 2010 03:32:07 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>me@offroadcoder.com</managingEditor>
    <webMaster>me@offroadcoder.com</webMaster>
    <item>
      <trackback:ping>http://offroadcoder.com/Trackback.aspx?guid=fb59ebf8-4230-43f8-9226-b02389165fc1</trackback:ping>
      <pingback:server>http://offroadcoder.com/pingback.aspx</pingback:server>
      <pingback:target>http://offroadcoder.com/PermaLink,guid,fb59ebf8-4230-43f8-9226-b02389165fc1.aspx</pingback:target>
      <dc:creator>Scott Klueppel</dc:creator>
      <georss:point>30.109017 -81.497099</georss:point>
      <wfw:comment>http://offroadcoder.com/CommentView,guid,fb59ebf8-4230-43f8-9226-b02389165fc1.aspx</wfw:comment>
      <wfw:commentRss>http://offroadcoder.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fb59ebf8-4230-43f8-9226-b02389165fc1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In .NET 1.1, I tried the original MS Data Access Application Block’s SqlHelper (you
can still download it <a href="http://download.microsoft.com/download/VisualStudioNET/daabref/RTM/NT5/EN-US/DataAccessApplicationBlock.msi">here</a>).
It was great for most of the common uses, but was lacking in some areas. The consuming
code looked sloppy and encouraged blind faith that database objects never changed.
It also didn’t support transactions as I would have liked, and didn’t support my obsession
with custom entities. I started out writing an extension library that wrapped SqlHelper,
but that felt very wrong… wrapping the ADO.NET wrapper (SqlHelper). I ended up writing
my own version of SqlHelper called SqlHelper (nice name, eh?). You see, at this time
I was getting over a bad relationship with a series of ORM products that had a negative
effect on my productivity. I decided to revolt with good ol’ fashion data access methods
that have never let us down.
</p>
        <p>
The only thing worse than my ORM experience was the disgusting over-use of DataSet
and DataTable. For my dollar, DataReader is where it’s at. I agree that using the
reader is slightly more dangerous in the hands of an inexperienced or inattentive
developer (did you know you have to close the reader when you’re done with it??).
Nothing can compare with the speed and flexibility of the reader, which is why DataSet
and DataAdapter use it at their core. If you are working with custom entities, instead
of DataSets and DataTables, you would be crazy to not use the DataReader.
</p>
        <p>
My SqlHelper worked in conjunction with my DataAccessLayer class that defined a few
delegates that made reader-to-object-mapping a simple task.  Once the mapping
methods were written to be used with the delegates, which returned object or System.Collections.CollectionBase
because we did not yet have generics (can you imagine??), you simply called the SqlHelper
to do all of the hard work. SqlHelper did not implement all of the craziness that
the original version contained. It was a short 450 lines of code that did nothing
but access data in a safe and reliable way. In the example below, we have the GenerateDocumentFromReader
method that is used by the GenerateObjectFromReader delegate. When SqlHelper.ExecuteReaderCmd
is called, the delegate is passed in to map the reader results to my object… in this
case a Document.
</p>
        <pre class="brush: c#;">// Object generation method 
private static object GenerateDocumentFromReader(IDataReader returnData) 
{
     Document document = new Document();
     if (returnData.Read())
     {
         document = new Document(
             (int)returnData["DocumentId"],
             (byte[])returnData["DocumentBinary"],
             returnData["FileName"].ToString(),
             returnData["Description"].ToString(),
             returnData["ContentType"].ToString(),
             (int)returnData["FileSize"],
             returnData["MD5Sum"].ToString(),
             (bool) returnData["EnabledInd"],
             (int)returnData["CreatorEmpId"],
             Convert.ToDateTime(returnData["CreateDt"]),
             (int)returnData["LastUpdateEmpId"],
             Convert.ToDateTime(returnData["LastUpdateDt"]));
     }     return document;
} 
public static Document GetDocumentByDocumentId(int documentId)
{
     SqlCommand sqlCmd = new SqlCommand();
     SqlHelper.SetCommandArguments(sqlCmd, CommandType.StoredProcedure, "usp_Document_GetDocumentByDocumentId");
     SqlHelper.AddParameterToSqlCommand(sqlCmd, "@DocumentId", SqlDbType.Int, 0, ParameterDirection.Input, documentId);
     DataAccessLayer.GenerateObjectFromReader gofr = new DataAccessLayer.GenerateObjectFromReader(GenerateDocumentFromReader);
     Document document = SqlHelper.ExecuteReaderCmd(sqlCmd, gofr) as Document;
     return document;
}
</pre>
        <p>
This worked wonderfully for years. After converting, I couldn’t imagine a project
that used ORM, DataSets, or DataTables again. I’ve been on many 1.1 projects since
writing my SqlHelper in 2004, and I have successfully converted them all. In early
2006, MS graced us with .NET 2.0. Generics, System.Transactions, and partial classes
changed my life. In my first few exposures to generics, like Vinay “the Generic Guy”
Ahuja’s 2005 Jax Code Camp presentation and Juval “My Hero” Lowy’s <a href="http://msdn.microsoft.com/en-us/library/ms379564">MSDN
article “An Introduction to Generics”</a>, I listened/read and pondered the millions
of uses of generics. I adapted my SqlHelper heavily to use these new technologies
and morphed it into something else that closely represented the newest version of
the DAAB, Enterprise Library 3.
</p>
        <p>
By this point, I wanted to convert to Enterprise Library. It was far better than the
simple SqlHelper. It had better transaction support, though I don’t know if that included
System.Transactions. I could have put my object generation extensions on top of it
and it would have worked well for years. On home projects I had already converted
to use EntLib. At work I was not so lucky. The deep stack trace when something went
wrong scared everyone, and that is still a fear for those starting out in EntLib today.
To ease the fears, I just created my replacement to SqlHelper… the Database class. 
</p>
        <p>
I used a lot of the same naming conventions as Enterprise Library. In fact, much of
the consuming code was nearly identical (except for the fact that it did not implement
the provider pattern and worked only with SQL Server). This was in anticipation of
a quick adoption of Enterprise Library 3 in the workplace. Kind of a “see… not so
bad” move on my part. Just like EntLib, you created a Database class using the DatabaseFactory
that used your default connection string key. Commands and parameters were created
and added with methods off of the Database class. Aside from the SqlCommand/DbCommand,
everything looked and felt the same, but came in a small file with only 490 lines
of code instead of 5 or more projects with 490 files. Using it felt the same, too.
Only my object/collection generation extensions looked different from the standard
reader, scalar, dataset routines. Below is the same code from above using the Database
class and related classes to create a Document from a reader.
</p>
        <pre class="brush: c#;">// Object generation method
private static Document GenerateDocumentFromReader(IDataReader returnData)
{
     Document document = new Document();
     if (returnData.Read())
     {
         document = new Document(
             GetIntFromReader(returnData, "DocumentId"),
             GetIntFromReader(returnData, "DocumentTypeId"),
             GetStringFromReader(returnData, "DocumentTypeName"),
             GetByteArrayFromReader(returnData, "DocumentBinary"),
             GetStringFromReader(returnData, "FileName"),
             GetStringFromReader(returnData, "Description"),
             GetStringFromReader(returnData, "ContentType"),
             GetIntFromReader(returnData, "FileSize"),
             GetStringFromReader(returnData, "MD5Sum"),
             GetStringFromReader(returnData, "CreatorEmpID"),
             GetDateTimeFromReader(returnData, "CreateDt"),
             GetStringFromReader(returnData, "LastUpdateEmpID"),
             GetDateTimeFromReader(returnData, "LastUpdateDt"));
     }
     return document;
} 
public static Document GetDocumentByDocumentId(int documentId)
{
     Database db = DatabaseFactory.CreateDatabase(AppSettings.ConnectionStringKey);
     SqlCommand sqlCmd = db.GetStoredProcCommand("usp_Document_GetDocumentByDocumentId");
     db.AddInParameter(sqlCmd, "DocumentId", SqlDbType.Int, documentId);
     GenerateObjectFromReader&lt;Document&gt; gofr = new GenerateObjectFromReader&lt;Document&gt;(GenerateDocumentFromReader);
     Document document = CreateObjectFromDatabase&lt;Document&gt;(db, sqlCmd, gofr);
     return document;
}
</pre>
        <p>
This, too, worked great for years. Other than a brief period in 2007 when I tried
to wrap all of my data access code with WCF services, .NET 3.0 came and went with
no changes to my data access methodology. In late 2007, I had lost all love of my
SqlHelper and my Database/DataAccessLayer classes. With .NET 3.5 and Enterprise Library
4.0, I no longer felt the need to roll my own. .NET now had extension methods for
me to extend Enterprise Library however I pleased. Enterprise Library supported System.Transactions
making its use a dream if behind a WCF service that allowed transaction flow. With
a succinct 190 lines of extension code, I had it made in the shade with Enterprise
Library 4.0. In fact, I haven’t used anything since.
</p>
        <p>
The consuming code was almost exactly the same. You’ll notice the SqlCommand has changed
to DbCommand. The SqlDbType has changed to DbType. Other than that, it feels and works
the same. 
</p>
        <pre class="brush: c#;">// Object generation method
private static Document GenerateDocumentFromReader(IDataReader returnData)
{
     Document document = new Document();
     if (returnData.Read())
     {
         document = new Document(
             returnData.GetInt32("DocumentId"),
             returnData.GetInt32("DocumentTypeId"),
             returnData.GetString("DocumentTypeName"),
             returnData.GetByteArray("DocumentBinary"),
             returnData.GetString("FileName"),
             returnData.GetString("Description"),
             returnData.GetString("ContentType"),
             returnData.GetInt32("FileSize"),
             returnData.GetString("MD5Sum"),
             returnData.GetString("CreatorEmpID"),
             returnData.GetDateTime("CreateDt"),
             returnData.GetString("LastUpdateEmpID"),
             returnData.GetDateTime("LastUpdateDt"));
     }
     return document;
}
public static Document GetDocumentByDocumentID(int documentId)
{
     Database db = DatabaseFactory.CreateDatabase();
     DbCommand cmd = db.GetStoredProcCommand("usp_Document_GetDocumentByDocumentId");
     db.AddInParameter(cmd, "DocumentID", DbType.Int32, documentId);
     GenerateObjectFromReader&lt;Document&gt; gofr = new GenerateObjectFromReader&lt;Document&gt;(GenerateDocumentFromReader);
     Document document = db.CreateObject&lt;Document&gt;(cmd, gofr);
     return document;
}
</pre>
        <p>
With a full suite of unit test projects available for download with the Enterprise
Library source files, the fear should be abated for the remaining holdouts. Getting
started is as easy as including two DLL references, and adding 5 lines of config.
You can’t beat that!
</p>
        <p>
I downloaded Enterprise Library 5 last week. I’ve been making use of new features
such as result set mapping (eliminating the need for my object generation extensions),
parameter mapping, and accessors that bring them all together. There’s a bunch of
inversion of control features in place as well. I think I’ll be quite comfortable
in my new EntLib5 home.
</p>
        <img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=fb59ebf8-4230-43f8-9226-b02389165fc1" />
      </body>
      <title>My data access story before Enterprise Library 5</title>
      <guid isPermaLink="false">http://offroadcoder.com/PermaLink,guid,fb59ebf8-4230-43f8-9226-b02389165fc1.aspx</guid>
      <link>http://offroadcoder.com/2010/07/27/MyDataAccessStoryBeforeEnterpriseLibrary5.aspx</link>
      <pubDate>Tue, 27 Jul 2010 03:32:07 GMT</pubDate>
      <description>&lt;p&gt;
In .NET 1.1, I tried the original MS Data Access Application Block’s SqlHelper (you
can still download it &lt;a href="http://download.microsoft.com/download/VisualStudioNET/daabref/RTM/NT5/EN-US/DataAccessApplicationBlock.msi"&gt;here&lt;/a&gt;).
It was great for most of the common uses, but was lacking in some areas. The consuming
code looked sloppy and encouraged blind faith that database objects never changed.
It also didn’t support transactions as I would have liked, and didn’t support my obsession
with custom entities. I started out writing an extension library that wrapped SqlHelper,
but that felt very wrong… wrapping the ADO.NET wrapper (SqlHelper). I ended up writing
my own version of SqlHelper called SqlHelper (nice name, eh?). You see, at this time
I was getting over a bad relationship with a series of ORM products that had a negative
effect on my productivity. I decided to revolt with good ol’ fashion data access methods
that have never let us down.
&lt;/p&gt;
&lt;p&gt;
The only thing worse than my ORM experience was the disgusting over-use of DataSet
and DataTable. For my dollar, DataReader is where it’s at. I agree that using the
reader is slightly more dangerous in the hands of an inexperienced or inattentive
developer (did you know you have to close the reader when you’re done with it??).
Nothing can compare with the speed and flexibility of the reader, which is why DataSet
and DataAdapter use it at their core. If you are working with custom entities, instead
of DataSets and DataTables, you would be crazy to not use the DataReader.
&lt;/p&gt;
&lt;p&gt;
My SqlHelper worked in conjunction with my DataAccessLayer class that defined a few
delegates that made reader-to-object-mapping a simple task.&amp;nbsp; Once the mapping
methods were written to be used with the delegates, which returned object or System.Collections.CollectionBase
because we did not yet have generics (can you imagine??), you simply called the SqlHelper
to do all of the hard work. SqlHelper did not implement all of the craziness that
the original version contained. It was a short 450 lines of code that did nothing
but access data in a safe and reliable way. In the example below, we have the GenerateDocumentFromReader
method that is used by the GenerateObjectFromReader delegate. When SqlHelper.ExecuteReaderCmd
is called, the delegate is passed in to map the reader results to my object… in this
case a Document.
&lt;/p&gt;
&lt;pre class="brush: c#;"&gt;// Object generation method 
private static object GenerateDocumentFromReader(IDataReader returnData) 
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = new Document();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (returnData.Read())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document = new Document(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int)returnData["DocumentId"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (byte[])returnData["DocumentBinary"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData["FileName"].ToString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData["Description"].ToString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData["ContentType"].ToString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int)returnData["FileSize"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData["MD5Sum"].ToString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (bool) returnData["EnabledInd"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int)returnData["CreatorEmpId"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Convert.ToDateTime(returnData["CreateDt"]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int)returnData["LastUpdateEmpId"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Convert.ToDateTime(returnData["LastUpdateDt"]));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
} 
public static Document GetDocumentByDocumentId(int documentId)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand sqlCmd = new SqlCommand();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlHelper.SetCommandArguments(sqlCmd, CommandType.StoredProcedure, "usp_Document_GetDocumentByDocumentId");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlHelper.AddParameterToSqlCommand(sqlCmd, "@DocumentId", SqlDbType.Int, 0, ParameterDirection.Input, documentId);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataAccessLayer.GenerateObjectFromReader gofr = new DataAccessLayer.GenerateObjectFromReader(GenerateDocumentFromReader);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = SqlHelper.ExecuteReaderCmd(sqlCmd, gofr) as Document;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
}
&lt;/pre&gt;
&lt;p&gt;
This worked wonderfully for years. After converting, I couldn’t imagine a project
that used ORM, DataSets, or DataTables again. I’ve been on many 1.1 projects since
writing my SqlHelper in 2004, and I have successfully converted them all. In early
2006, MS graced us with .NET 2.0. Generics, System.Transactions, and partial classes
changed my life. In my first few exposures to generics, like Vinay “the Generic Guy”
Ahuja’s 2005 Jax Code Camp presentation and Juval “My Hero” Lowy’s &lt;a href="http://msdn.microsoft.com/en-us/library/ms379564"&gt;MSDN
article “An Introduction to Generics”&lt;/a&gt;, I listened/read and pondered the millions
of uses of generics. I adapted my SqlHelper heavily to use these new technologies
and morphed it into something else that closely represented the newest version of
the DAAB, Enterprise Library 3.
&lt;/p&gt;
&lt;p&gt;
By this point, I wanted to convert to Enterprise Library. It was far better than the
simple SqlHelper. It had better transaction support, though I don’t know if that included
System.Transactions. I could have put my object generation extensions on top of it
and it would have worked well for years. On home projects I had already converted
to use EntLib. At work I was not so lucky. The deep stack trace when something went
wrong scared everyone, and that is still a fear for those starting out in EntLib today.
To ease the fears, I just created my replacement to SqlHelper… the Database class. 
&lt;/p&gt;
&lt;p&gt;
I used a lot of the same naming conventions as Enterprise Library. In fact, much of
the consuming code was nearly identical (except for the fact that it did not implement
the provider pattern and worked only with SQL Server). This was in anticipation of
a quick adoption of Enterprise Library 3 in the workplace. Kind of a “see… not so
bad” move on my part. Just like EntLib, you created a Database class using the DatabaseFactory
that used your default connection string key. Commands and parameters were created
and added with methods off of the Database class. Aside from the SqlCommand/DbCommand,
everything looked and felt the same, but came in a small file with only 490 lines
of code instead of 5 or more projects with 490 files. Using it felt the same, too.
Only my object/collection generation extensions looked different from the standard
reader, scalar, dataset routines. Below is the same code from above using the Database
class and related classes to create a Document from a reader.
&lt;/p&gt;
&lt;pre class="brush: c#;"&gt;// Object generation method
private static Document GenerateDocumentFromReader(IDataReader returnData)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = new Document();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (returnData.Read())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document = new Document(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetIntFromReader(returnData, "DocumentId"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetIntFromReader(returnData, "DocumentTypeId"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "DocumentTypeName"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetByteArrayFromReader(returnData, "DocumentBinary"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "FileName"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "Description"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "ContentType"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetIntFromReader(returnData, "FileSize"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "MD5Sum"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "CreatorEmpID"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetDateTimeFromReader(returnData, "CreateDt"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetStringFromReader(returnData, "LastUpdateEmpID"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetDateTimeFromReader(returnData, "LastUpdateDt"));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
} 
public static Document GetDocumentByDocumentId(int documentId)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database db = DatabaseFactory.CreateDatabase(AppSettings.ConnectionStringKey);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand sqlCmd = db.GetStoredProcCommand("usp_Document_GetDocumentByDocumentId");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db.AddInParameter(sqlCmd, "DocumentId", SqlDbType.Int, documentId);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GenerateObjectFromReader&amp;lt;Document&amp;gt; gofr = new GenerateObjectFromReader&amp;lt;Document&amp;gt;(GenerateDocumentFromReader);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = CreateObjectFromDatabase&amp;lt;Document&amp;gt;(db, sqlCmd, gofr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
}
&lt;/pre&gt;
&lt;p&gt;
This, too, worked great for years. Other than a brief period in 2007 when I tried
to wrap all of my data access code with WCF services, .NET 3.0 came and went with
no changes to my data access methodology. In late 2007, I had lost all love of my
SqlHelper and my Database/DataAccessLayer classes. With .NET 3.5 and Enterprise Library
4.0, I no longer felt the need to roll my own. .NET now had extension methods for
me to extend Enterprise Library however I pleased. Enterprise Library supported System.Transactions
making its use a dream if behind a WCF service that allowed transaction flow. With
a succinct 190 lines of extension code, I had it made in the shade with Enterprise
Library 4.0. In fact, I haven’t used anything since.
&lt;/p&gt;
&lt;p&gt;
The consuming code was almost exactly the same. You’ll notice the SqlCommand has changed
to DbCommand. The SqlDbType has changed to DbType. Other than that, it feels and works
the same. 
&lt;/p&gt;
&lt;pre class="brush: c#;"&gt;// Object generation method
private static Document GenerateDocumentFromReader(IDataReader returnData)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = new Document();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (returnData.Read())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document = new Document(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetInt32("DocumentId"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetInt32("DocumentTypeId"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("DocumentTypeName"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetByteArray("DocumentBinary"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("FileName"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("Description"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("ContentType"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetInt32("FileSize"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("MD5Sum"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("CreatorEmpID"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetDateTime("CreateDt"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetString("LastUpdateEmpID"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnData.GetDateTime("LastUpdateDt"));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
}
public static Document GetDocumentByDocumentID(int documentId)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database db = DatabaseFactory.CreateDatabase();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DbCommand cmd = db.GetStoredProcCommand("usp_Document_GetDocumentByDocumentId");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db.AddInParameter(cmd, "DocumentID", DbType.Int32, documentId);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GenerateObjectFromReader&amp;lt;Document&amp;gt; gofr = new GenerateObjectFromReader&amp;lt;Document&amp;gt;(GenerateDocumentFromReader);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document document = db.CreateObject&amp;lt;Document&amp;gt;(cmd, gofr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document;
}
&lt;/pre&gt;
&lt;p&gt;
With a full suite of unit test projects available for download with the Enterprise
Library source files, the fear should be abated for the remaining holdouts. Getting
started is as easy as including two DLL references, and adding 5 lines of config.
You can’t beat that!
&lt;/p&gt;
&lt;p&gt;
I downloaded Enterprise Library 5 last week. I’ve been making use of new features
such as result set mapping (eliminating the need for my object generation extensions),
parameter mapping, and accessors that bring them all together. There’s a bunch of
inversion of control features in place as well. I think I’ll be quite comfortable
in my new EntLib5 home.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=fb59ebf8-4230-43f8-9226-b02389165fc1" /&gt;</description>
      <comments>http://offroadcoder.com/CommentView,guid,fb59ebf8-4230-43f8-9226-b02389165fc1.aspx</comments>
      <category>C#</category>
      <category>Database</category>
      <category>Enterprise Library</category>
      <category>Extensions</category>
      <category>SQL</category>
    </item>
    <item>
      <trackback:ping>http://offroadcoder.com/Trackback.aspx?guid=2d946739-b527-41a7-8422-d29f4149e47a</trackback:ping>
      <pingback:server>http://offroadcoder.com/pingback.aspx</pingback:server>
      <pingback:target>http://offroadcoder.com/PermaLink,guid,2d946739-b527-41a7-8422-d29f4149e47a.aspx</pingback:target>
      <dc:creator>Scott Klueppel</dc:creator>
      <georss:point>30.109017 -81.497099</georss:point>
      <wfw:comment>http://offroadcoder.com/CommentView,guid,2d946739-b527-41a7-8422-d29f4149e47a.aspx</wfw:comment>
      <wfw:commentRss>http://offroadcoder.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2d946739-b527-41a7-8422-d29f4149e47a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In a <a href="http://offroadcoder.com/2009/01/29/TheFlowedTransactionCouldNotBeUnmarshaled.aspx" target="_blank">previous
post</a>, I discussed solutions to the dreaded “<em>The flowed transaction could not
be unmarshaled” </em>error commonly experienced when using MSDTC transactions with
WCF, SQL, TxF, etc. I have once again experienced the un-trusted domain scenario,
and can now report with certainty that adding hosts file entries on both machines
will correct the problem. Testing this solution with DTCPing.exe between the two machines
proves that making only the hosts file change acquaints the client and server and
allows distributed transactions to occur.
</p>
        <p>
You will find many blog and forum post non-solutions. Adding the hosts file entry
or the equivalent domain redirects are the only solutions when working with two machines
in disparate, un-trusted domains. Some of the non-solutions you’ll find go so far
as to say to change your SQL connection string to prevent current (ambient) transaction
enlistment. Not quite a complete solution as your first rollback unit test will fail.
</p>
        <img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=2d946739-b527-41a7-8422-d29f4149e47a" />
      </body>
      <title>The flowed transaction could not be unmarshaled - Untrusted Domains update</title>
      <guid isPermaLink="false">http://offroadcoder.com/PermaLink,guid,2d946739-b527-41a7-8422-d29f4149e47a.aspx</guid>
      <link>http://offroadcoder.com/2010/03/16/TheFlowedTransactionCouldNotBeUnmarshaledUntrustedDomainsUpdate.aspx</link>
      <pubDate>Tue, 16 Mar 2010 02:54:48 GMT</pubDate>
      <description>&lt;p&gt;
In a &lt;a href="http://offroadcoder.com/2009/01/29/TheFlowedTransactionCouldNotBeUnmarshaled.aspx" target="_blank"&gt;previous
post&lt;/a&gt;, I discussed solutions to the dreaded “&lt;em&gt;The flowed transaction could not
be unmarshaled” &lt;/em&gt;error commonly experienced when using MSDTC transactions with
WCF, SQL, TxF, etc. I have once again experienced the un-trusted domain scenario,
and can now report with certainty that adding hosts file entries on both machines
will correct the problem. Testing this solution with DTCPing.exe between the two machines
proves that making only the hosts file change acquaints the client and server and
allows distributed transactions to occur.
&lt;/p&gt;
&lt;p&gt;
You will find many blog and forum post non-solutions. Adding the hosts file entry
or the equivalent domain redirects are the only solutions when working with two machines
in disparate, un-trusted domains. Some of the non-solutions you’ll find go so far
as to say to change your SQL connection string to prevent current (ambient) transaction
enlistment. Not quite a complete solution as your first rollback unit test will fail.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=2d946739-b527-41a7-8422-d29f4149e47a" /&gt;</description>
      <comments>http://offroadcoder.com/CommentView,guid,2d946739-b527-41a7-8422-d29f4149e47a.aspx</comments>
      <category>SQL</category>
      <category>Transactions</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://offroadcoder.com/Trackback.aspx?guid=5aef3f0a-3e66-4e87-8469-0411651d2aba</trackback:ping>
      <pingback:server>http://offroadcoder.com/pingback.aspx</pingback:server>
      <pingback:target>http://offroadcoder.com/PermaLink,guid,5aef3f0a-3e66-4e87-8469-0411651d2aba.aspx</pingback:target>
      <dc:creator>Scott Klueppel</dc:creator>
      <georss:point>30.109017 -81.497099</georss:point>
      <wfw:comment>http://offroadcoder.com/CommentView,guid,5aef3f0a-3e66-4e87-8469-0411651d2aba.aspx</wfw:comment>
      <wfw:commentRss>http://offroadcoder.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5aef3f0a-3e66-4e87-8469-0411651d2aba</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Unless you are working on a extremely simple or read-only application, transactions
are a must. Using the System.Transactions namespace is the easiest and most efficient
way to maintain system consistency when dealing with multiple calls or multiple resources.
Although System.Transactions arrived in .NET in the 2005 product, it is still a relatively
unknown part of the framework. System.Transactions was designed by the Indigo team
in preparation for WCF. It is not compatible with Win98 or WinME, but most people
are incompatible with Win98 and WinME so it works out just fine.
</p>
        <p>
Before System.Transactions, we only had access to System.Data.SqlClient.SqlTransaction
or a true SQL transaction using BEGIN/ROLLBACK/COMMIT TRAN. Using SQL transactions,
you are stuck with only being able to update DB records as part of your transaction.
If you wanted to change a cached value in your app in addition to the SQL updates
in the same transaction then you would be out of luck. This also required a lot of
transaction code in your stored procedures, writing stored procedures that can be
called independently or part of transaction made for very messy stored procedures
and often led to multiple stored procedures that served the same purpose.
</p>
        <p>
Using the SqlTransaction class was also messy. The most important restriction is that
you need to have all database calls inside the same SqlConnection. This does not work
well for a well-designed N-tier application. The other problem is that you need to
handle your own non-DB transaction logic inside the same SqlTransaction and conditionally
commit/rollback as necessary. This all tends to lead to several try-catch statements
within one SqlTransaction. Handling the plumbing to manually add each SqlCommand to
the transaction gets old quickly too.
</p>
        <p>
          <strong>Using SqlTransaction</strong>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf5 SqlTransaction\cf3  \cf4 tran\cf3  = \cf1 {\b null}\cf3 ;\par ??    \cf1 {\b try}\par ??\cf3     \{\par ??        \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??        \cf4 tran\cf3  = \cf4 con\cf3 .\cf4 BeginTransaction\cf3 ();\par ??        \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??        \{\par ??            \cf4 cmd\cf3 .\cf4 Transaction\cf3  = \cf4 tran\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??\par ??        \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??        \{\par ??            \cf4 cmd\cf3 .\cf4 Transaction\cf3  = \cf4 tran\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??\par ??        \cf4 tran\cf3 .\cf4 Commit\cf3 ();\par ??    \}\par ??    \cf1 {\b catch}\par ??\cf3     \{\par ??        \cf1 {\b if}\cf3  (\cf4 tran\cf3  != \cf1 {\b null}\cf3 ) \cf4 tran\cf3 .\cf4 Rollback\cf3 ();\par ??    \}\par ??    \cf1 {\b finally}\par ??\cf3     \{\par ??        \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??    \}\par ??\}\par ??}
-->
        </p>
        <div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 761px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px">
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   27</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">string</span><span style="COLOR: #dfdfbf">connectionString</span> = <span style="COLOR: #2b91af">ConfigurationManager</span>.<span style="COLOR: #dfdfbf">ConnectionStrings</span>[<span style="COLOR: #c89191">"Testing"</span>].<span style="COLOR: #dfdfbf">ConnectionString</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   28</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlConnection</span><span style="COLOR: #dfdfbf">con</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlConnection</span>(<span style="COLOR: #dfdfbf">connectionString</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   29</span> {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   30</span>     <span style="COLOR: #2b91af">SqlTransaction</span><span style="COLOR: #dfdfbf">tran</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">null</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   31</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">try</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   32</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   33</span>         <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Open</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   34</span>         <span style="COLOR: #dfdfbf">tran</span> = <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">BeginTransaction</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   35</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   36</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   37</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Transaction</span> = <span style="COLOR: #dfdfbf">tran</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   38</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   39</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
1"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   40</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   41</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   42</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   43</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   44</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   45</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   46</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Transaction</span> = <span style="COLOR: #dfdfbf">tran</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   47</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   48</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
2"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   49</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   50</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   51</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   52</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   53</span>         <span style="COLOR: #dfdfbf">tran</span>.<span style="COLOR: #dfdfbf">Commit</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   54</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   55</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">catch</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   56</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   57</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">if</span> (<span style="COLOR: #dfdfbf">tran</span> != <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">null</span>) <span style="COLOR: #dfdfbf">tran</span>.<span style="COLOR: #dfdfbf">Rollback</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   58</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   59</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">finally</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   60</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   61</span>         <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Close</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   62</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   63</span> }
</p>
        </div>
        <p>
 
</p>
        <p>
System.Transactions liberated us from the mundane SqlClient code and repetitive try-catches.
simply wrapping your old ADO.NET with a using (TransactionScope) { } is all you need
to do. You will typically add a transactionScope.Complete() statement as the last
line in the TransactionScope using block is really all you need. Any exception thrown
before this point will break out of scope, implicitly aborting the transation. Much
better.
</p>
        <p>
System.Transactions uses the LTM (Lightweight Transaction Manager) when dealing with
single resources or machines. The transaction is automatically promoted to MSDTC (Microsoft
Distributed Transaction Coordinator) when another resource is enlisted in a transaction.
A lot of people struggle with MSDTC because it is difficult to setup, requires special
firewall considerations, and doesn't really work well for smart client applications
since you have to install MSDTC on every client machine.
</p>
        <p>
I'll show one transaction performed three different ways and show what happens with
the LTM and MSDTC for each of them. I will also demonstrate an excellent reason to
migrate to Enterprise Library.
</p>
        <p>
          <strong>1) Executing two ADO.NET SqlCommands in different SqlConnections</strong>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf1 {\b string}\cf3  \cf5 connectionString\cf3  = \cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ;\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
-->
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf1 {\b string}\cf3  \cf5 connectionString\cf3  = \cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ;\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
-->
        </p>
        <div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 764px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px">
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  122</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">TransactionScope</span><span style="COLOR: #dfdfbf">scope</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">TransactionScope</span>())
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  123</span> {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  124</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">string</span><span style="COLOR: #dfdfbf">connectionString</span> = <span style="COLOR: #2b91af">ConfigurationManager</span>.<span style="COLOR: #dfdfbf">ConnectionStrings</span>[<span style="COLOR: #c89191">"Testing"</span>].<span style="COLOR: #dfdfbf">ConnectionString</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  125</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlConnection</span><span style="COLOR: #dfdfbf">con</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlConnection</span>(<span style="COLOR: #dfdfbf">connectionString</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  126</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  127</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  128</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  129</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
1"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  130</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  131</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">try</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  132</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  133</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Open</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  134</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  135</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  136</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">finally</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  137</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  138</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Close</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  139</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  140</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  141</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  142</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  143</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  144</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  145</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  146</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  147</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlConnection</span><span style="COLOR: #dfdfbf">con</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlConnection</span>(<span style="COLOR: #dfdfbf">connectionString</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  148</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  149</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  150</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  151</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
2"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  152</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  153</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">try</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  154</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  155</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Open</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  156</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  157</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  158</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">finally</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  159</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  160</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Close</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  161</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  162</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  163</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  164</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  165</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  166</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  167</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  168</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  169</span>     <span style="COLOR: #dfdfbf">scope</span>.<span style="COLOR: #dfdfbf">Complete</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  170</span> }
</p>
        </div>
        <p>
 
</p>
        <p>
This writes the following to the command line:
</p>
        <blockquote>
          <p>
            <font face="Courier New" size="2">
              <strong>Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:2<br />
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000<br />
Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:2<br />
Distributed Transaction ID: 1fad8108-ddae-496a-a7da-ce92df175e40</strong>
            </font>
          </p>
        </blockquote>
        <p>
You'll notice that the first command creates a transaction using LTM as indicated
by the <em>Local Transaction ID</em>. After the second command is executed, the transaction
is promoted to DTC as indicated by the <em>Distributed Transaction ID</em>. This is
expected because there are two distinct SqlConnections. Even though the connection
string is the same, TransactionScope treats these ADO.NET objects as unique resources.
</p>
        <p>
This has additional implications when connection pooling comes into play. After I
close the first connection, it is returned to the pool and is available for use. If
this connection is requested for use, it will no longer be available to commit or
abort this transaction, and you will see the dreaded MSDTC error "Communication with
the underlying transaction manager has failed."
</p>
        <p>
        </p>
        <p>
          <strong>2) Executing two ADO.NET SqlCommands in the same SqlConnection</strong>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b using}\cf1  (\cf4 SqlConnection\cf1  \cf5 con\cf1  = \cf3 {\b new}\cf1  \cf4 SqlConnection\cf1 (\cf4 ConfigurationManager\cf1 .\cf5 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf5 ConnectionString\cf1 ))\par ??            \{\par ??                \cf4 SqlTransaction\cf1  \cf5 tran\cf1  = \cf3 {\b null}\cf1 ;\par ??                \cf3 {\b try}\par ??\cf1                 \{\par ??                    \cf5 con\cf1 .\cf5 Open\cf1 ();\par ??                    \cf5 tran\cf1  = \cf5 con\cf1 .\cf5 BeginTransaction\cf1 ();\par ??                    \cf3 {\b using}\cf1  (\cf4 SqlCommand\cf1  \cf5 cmd\cf1  = \cf3 {\b new}\cf1  \cf4 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf5 con\cf1 ))\par ??                    \{\par ??                        \cf5 cmd\cf1 .\cf5 Transaction\cf1  = \cf5 tran\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 CommandType\cf1  = \cf5 System\cf1 .\cf5 Data\cf1 .\cf4 CommandType\cf1 .\cf5 StoredProcedure\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf3 {\b using}\cf1  (\cf4 SqlCommand\cf1  \cf5 cmd\cf1  = \cf3 {\b new}\cf1  \cf4 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf5 con\cf1 ))\par ??                    \{\par ??                        \cf5 cmd\cf1 .\cf5 Transaction\cf1  = \cf5 tran\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 CommandType\cf1  = \cf5 System\cf1 .\cf5 Data\cf1 .\cf4 CommandType\cf1 .\cf5 StoredProcedure\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf5 tran\cf1 .\cf5 Commit\cf1 ();\par ??                \}\par ??                \cf3 {\b catch}\par ??\cf1                 \{\par ??                    \cf3 {\b if}\cf1  (\cf5 tran\cf1  != \cf3 {\b null}\cf1 ) \cf5 tran\cf1 .\cf5 Rollback\cf1 ();\par ??                \}\par ??                \cf3 {\b finally}\par ??\cf1                 \{\par ??                    \cf5 con\cf1 .\cf5 Close\cf1 ();\par ??                \}\par ??            \}}
-->
        </p>
        <p>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b string}\cf1  \cf4 connectionString\cf1  = \cf5 ConfigurationManager\cf1 .\cf4 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf4 ConnectionString\cf1 ;\par ??            \cf3 {\b using}\cf1  (\cf5 SqlConnection\cf1  \cf4 con\cf1  = \cf3 {\b new}\cf1  \cf5 SqlConnection\cf1 (\cf4 connectionString\cf1 ))\par ??            \{\par ??                \cf5 SqlTransaction\cf1  \cf4 tran\cf1  = \cf3 {\b null}\cf1 ;\par ??                \cf3 {\b try}\par ??\cf1                 \{\par ??                    \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                    \cf4 tran\cf1  = \cf4 con\cf1 .\cf4 BeginTransaction\cf1 ();\par ??                    \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                    \{\par ??                        \cf4 cmd\cf1 .\cf4 Transaction\cf1  = \cf4 tran\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                    \{\par ??                        \cf4 cmd\cf1 .\cf4 Transaction\cf1  = \cf4 tran\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf4 tran\cf1 .\cf4 Commit\cf1 ();\par ??                \}\par ??                \cf3 {\b catch}\par ??\cf1                 \{\par ??                    \cf3 {\b if}\cf1  (\cf4 tran\cf1  != \cf3 {\b null}\cf1 ) \cf4 tran\cf1 .\cf4 Rollback\cf1 ();\par ??                \}\par ??                \cf3 {\b finally}\par ??\cf1                 \{\par ??                    \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                \}\par ??            \}}
-->
        </p>
        <p>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b string}\cf1  \cf4 connectionString\cf1  = \cf5 ConfigurationManager\cf1 .\cf4 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf4 ConnectionString\cf1 ;\par ??            \cf3 {\b using}\cf1  (\cf5 TransactionScope\cf1  \cf4 scope\cf1  = \cf3 {\b new}\cf1  \cf5 TransactionScope\cf1 ())\par ??            \cf3 {\b using}\cf1  (\cf5 SqlConnection\cf1  \cf4 con\cf1  = \cf3 {\b new}\cf1  \cf5 SqlConnection\cf1 (\cf4 connectionString\cf1 ))\par ??            \{\par ??                \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                \{\par ??                    \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                    \cf3 {\b try}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??                    \cf3 {\b finally}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                    \}\par ??                \}\par ??\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Local Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 LocalIdentifier\cf1 );\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Distributed Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 DistributedIdentifier\cf1 .\cf4 ToString\cf1 ());\par ??\par ??                \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                \{\par ??                    \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                    \cf3 {\b try}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??                    \cf3 {\b finally}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                    \}\par ??                \}\par ??\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Local Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 LocalIdentifier\cf1 );\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Distributed Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 DistributedIdentifier\cf1 .\cf4 ToString\cf1 ());\par ??\par ??                \cf4 scope\cf1 .\cf4 Complete\cf1 ();\par ??            \}}
-->
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 TransactionScope\cf3  \cf4 scope\cf3  = \cf1 {\b new}\cf3  \cf5 TransactionScope\cf3 ())\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf4 scope\cf3 .\cf4 Complete\cf3 ();\par ??\}}
-->
        </p>
        <p>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 TransactionScope\cf3  \cf4 scope\cf3  = \cf1 {\b new}\cf3  \cf5 TransactionScope\cf3 ())\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf4 scope\cf3 .\cf4 Complete\cf3 ();\par ??\}}
-->
        </p>
        <div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 765px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px">
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   69</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">string</span><span style="COLOR: #dfdfbf">connectionString</span> = <span style="COLOR: #2b91af">ConfigurationManager</span>.<span style="COLOR: #dfdfbf">ConnectionStrings</span>[<span style="COLOR: #c89191">"Testing"</span>].<span style="COLOR: #dfdfbf">ConnectionString</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   70</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">TransactionScope</span><span style="COLOR: #dfdfbf">scope</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">TransactionScope</span>())
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   71</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlConnection</span><span style="COLOR: #dfdfbf">con</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlConnection</span>(<span style="COLOR: #dfdfbf">connectionString</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   72</span> {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   73</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   74</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   75</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   76</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
1"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   77</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   78</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">try</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   79</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   80</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Open</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   81</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   82</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   83</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">finally</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   84</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   85</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Close</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   86</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   87</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   88</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   89</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   90</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   91</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   92</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   93</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   94</span>     <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">SqlCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">SqlCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>, <span style="COLOR: #dfdfbf">con</span>))
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   95</span>     {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   96</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">CommandType</span> = <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">CommandType</span>.<span style="COLOR: #dfdfbf">StoredProcedure</span>;
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   97</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #c89191">"Testing
2"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   98</span>         <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">Parameters</span>.<span style="COLOR: #dfdfbf">AddWithValue</span>(<span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">   99</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">try</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  100</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  101</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Open</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  102</span>             <span style="COLOR: #dfdfbf">cmd</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  103</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  104</span>         <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">finally</span></p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  105</span>        
{
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  106</span>             <span style="COLOR: #dfdfbf">con</span>.<span style="COLOR: #dfdfbf">Close</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  107</span>        
}
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  108</span>     }
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  109</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  110</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  111</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  112</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  113</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  114</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  115</span>     <span style="COLOR: #dfdfbf">scope</span>.<span style="COLOR: #dfdfbf">Complete</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  116</span> }
</p>
        </div>
        <p>
 
</p>
        <p>
This writes the following to the command line:
</p>
        <blockquote>
          <p>
            <font face="Courier New" size="2">
              <strong>Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:1<br />
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000<br />
Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:1<br />
Distributed Transaction ID: becac9c9-e15f-4370-9f73-7f369665bed7</strong>
            </font>
          </p>
        </blockquote>
        <p>
        </p>
        <p>
        </p>
        <p>
This is not expected because both commands are part of the same connection. Of course
I am closing the connection to simulate an N-tier app where the data access layer
is maintaining it's own SQL access, opening and closing its connection as it should.
If I did not close the connection, you would not see a <em>Distributed Transaction
ID</em> after the second command.
</p>
        <p>
        </p>
        <p>
          <strong>3) Executing two Enterprise Library commands</strong>
        </p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf4 Database\cf3  \cf5 db\cf3  = \cf4 DatabaseFactory\cf3 .\cf5 CreateDatabase\cf3 (\cf6 "Testing"\cf3 );\par ??    \cf4 DbCommand\cf3  \cf5 cmd\cf3  = \cf5 db\cf3 .\cf5 GetStoredProcCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 );\par ??    \cf5 db\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd\cf3 , \cf6 "Message"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 String\cf3 , \cf6 "Testing 1"\cf3 );\par ??    \cf5 db\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd\cf3 , \cf6 "UserID"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 Int32\cf3 , \cf7 5150\cf3 );\par ??    \cf5 db\cf3 .\cf5 ExecuteNonQuery\cf3 (\cf5 cmd\cf3 );\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf4 Database\cf3  \cf5 db1\cf3  = \cf4 DatabaseFactory\cf3 .\cf5 CreateDatabase\cf3 (\cf6 "Testing1"\cf3 );\par ??    \cf4 DbCommand\cf3  \cf5 cmd1\cf3  = \cf5 db\cf3 .\cf5 GetStoredProcCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 );\par ??    \cf5 db1\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd1\cf3 , \cf6 "Message"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 String\cf3 , \cf6 "Testing 2"\cf3 );\par ??    \cf5 db1\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd1\cf3 , \cf6 "UserID"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 Int32\cf3 , \cf7 5150\cf3 );\par ??    \cf5 db1\cf3 .\cf5 ExecuteNonQuery\cf3 (\cf5 cmd1\cf3 );\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
-->
        </p>
        <div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 761px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px">
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  176</span> <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">using</span> (<span style="COLOR: #2b91af">TransactionScope</span><span style="COLOR: #dfdfbf">scope</span> = <span style="FONT-WEIGHT: bold; COLOR: #e1e18a">new</span><span style="COLOR: #2b91af">TransactionScope</span>())
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  177</span> {
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  178</span>     <span style="COLOR: #2b91af">Database</span><span style="COLOR: #dfdfbf">db</span> = <span style="COLOR: #2b91af">DatabaseFactory</span>.<span style="COLOR: #dfdfbf">CreateDatabase</span>(<span style="COLOR: #c89191">"Testing"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  179</span>     <span style="COLOR: #2b91af">DbCommand</span><span style="COLOR: #dfdfbf">cmd</span> = <span style="COLOR: #dfdfbf">db</span>.<span style="COLOR: #dfdfbf">GetStoredProcCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  180</span>     <span style="COLOR: #dfdfbf">db</span>.<span style="COLOR: #dfdfbf">AddInParameter</span>(<span style="COLOR: #dfdfbf">cmd</span>, <span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">DbType</span>.<span style="COLOR: #dfdfbf">String</span>, <span style="COLOR: #c89191">"Testing
1"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  181</span>     <span style="COLOR: #dfdfbf">db</span>.<span style="COLOR: #dfdfbf">AddInParameter</span>(<span style="COLOR: #dfdfbf">cmd</span>, <span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">DbType</span>.<span style="COLOR: #dfdfbf">Int32</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  182</span>     <span style="COLOR: #dfdfbf">db</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>(<span style="COLOR: #dfdfbf">cmd</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  183</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  184</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  185</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  186</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  187</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  188</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  189</span>     <span style="COLOR: #2b91af">Database</span><span style="COLOR: #dfdfbf">db1</span> = <span style="COLOR: #2b91af">DatabaseFactory</span>.<span style="COLOR: #dfdfbf">CreateDatabase</span>(<span style="COLOR: #c89191">"Testing1"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  190</span>     <span style="COLOR: #2b91af">DbCommand</span><span style="COLOR: #dfdfbf">cmd1</span> = <span style="COLOR: #dfdfbf">db</span>.<span style="COLOR: #dfdfbf">GetStoredProcCommand</span>(<span style="COLOR: #c89191">"usp_ErrorLog_Insert"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  191</span>     <span style="COLOR: #dfdfbf">db1</span>.<span style="COLOR: #dfdfbf">AddInParameter</span>(<span style="COLOR: #dfdfbf">cmd1</span>, <span style="COLOR: #c89191">"Message"</span>, <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">DbType</span>.<span style="COLOR: #dfdfbf">String</span>, <span style="COLOR: #c89191">"Testing
2"</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  192</span>     <span style="COLOR: #dfdfbf">db1</span>.<span style="COLOR: #dfdfbf">AddInParameter</span>(<span style="COLOR: #dfdfbf">cmd1</span>, <span style="COLOR: #c89191">"UserID"</span>, <span style="COLOR: #dfdfbf">System</span>.<span style="COLOR: #dfdfbf">Data</span>.<span style="COLOR: #2b91af">DbType</span>.<span style="COLOR: #dfdfbf">Int32</span>, <span style="COLOR: #8acccf">5150</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  193</span>     <span style="COLOR: #dfdfbf">db1</span>.<span style="COLOR: #dfdfbf">ExecuteNonQuery</span>(<span style="COLOR: #dfdfbf">cmd1</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  194</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  195</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Local
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  196</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">LocalIdentifier</span>);
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  197</span>     <span style="COLOR: #2b91af">Console</span>.<span style="COLOR: #dfdfbf">WriteLine</span>(<span style="COLOR: #c89191">"Distributed
Transaction ID: {0}"</span>, 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  198</span>         <span style="COLOR: #2b91af">Transaction</span>.<span style="COLOR: #dfdfbf">Current</span>.<span style="COLOR: #dfdfbf">TransactionInformation</span>.<span style="COLOR: #dfdfbf">DistributedIdentifier</span>.<span style="COLOR: #dfdfbf">ToString</span>());
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  199</span> 
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  200</span>     <span style="COLOR: #dfdfbf">scope</span>.<span style="COLOR: #dfdfbf">Complete</span>();
</p>
          <p style="MARGIN: 0px">
            <span style="COLOR: #85ac8d">  201</span> }
</p>
        </div>
        <p>
 
</p>
        <p>
This writes the following to the command line:
</p>
        <blockquote>
          <p>
            <font face="Courier New" size="2">
              <strong>Local Transaction ID: 6737b756-2d5b-4eff-902d-15f9ccd5c26f:3<br />
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000<br />
Local Transaction ID: 6737b756-2d5b-4eff-902d-15f9ccd5c26f:3<br />
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000</strong>
            </font>
          </p>
        </blockquote>
        <p>
Whoa! How cool is that? No DTC promotion. Enterprise Library is intelligently deciding
to keep the connection open when it is part of the transaction. This will save a lot
of wasted time as the promotion to DTC adds a noticeable delay. If I wasn't using
Enterprise Library already, I'd switch now.
</p>
        <p>
        </p>
        <p>
Useful links:
</p>
        <ul>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/ms172152.aspx">Implementing an Implicit
Transaction using Transaction Scope</a>
          </li>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/ms730266.aspx">WCF Transactions</a>
          </li>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/ms973865.aspx">Introducing System.Transactions
in the .NET Framework 2.0</a>
          </li>
        </ul>
        <img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=5aef3f0a-3e66-4e87-8469-0411651d2aba" />
      </body>
      <title>What happens to your transaction with different data access methods</title>
      <guid isPermaLink="false">http://offroadcoder.com/PermaLink,guid,5aef3f0a-3e66-4e87-8469-0411651d2aba.aspx</guid>
      <link>http://offroadcoder.com/2008/12/05/WhatHappensToYourTransactionWithDifferentDataAccessMethods.aspx</link>
      <pubDate>Fri, 05 Dec 2008 02:50:25 GMT</pubDate>
      <description>&lt;p&gt;
Unless you are working on a extremely simple or read-only application, transactions
are a must. Using the System.Transactions namespace is the easiest and most efficient
way to maintain system consistency when dealing with multiple calls or multiple resources.
Although System.Transactions arrived in .NET in the 2005 product, it is still a relatively
unknown part of the framework. System.Transactions was designed by the Indigo team
in preparation for WCF. It is not compatible with Win98 or WinME, but most people
are incompatible with Win98 and WinME so it works out just fine.
&lt;/p&gt;
&lt;p&gt;
Before System.Transactions, we only had access to System.Data.SqlClient.SqlTransaction
or a true SQL transaction using BEGIN/ROLLBACK/COMMIT TRAN. Using SQL transactions,
you are stuck with only being able to update DB records as part of your transaction.
If you wanted to change a cached value in your app in addition to the SQL updates
in the same transaction then you would be out of luck. This also required a lot of
transaction code in your stored procedures, writing stored procedures that can be
called independently or part of transaction made for very messy stored procedures
and often led to multiple stored procedures that served the same purpose.
&lt;/p&gt;
&lt;p&gt;
Using the SqlTransaction class was also messy. The most important restriction is that
you need to have all database calls inside the same SqlConnection. This does not work
well for a well-designed N-tier application. The other problem is that you need to
handle your own non-DB transaction logic inside the same SqlTransaction and conditionally
commit/rollback as necessary. This all tends to lead to several try-catch statements
within one SqlTransaction. Handling the plumbing to manually add each SqlCommand to
the transaction gets old quickly too.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Using SqlTransaction&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf5 SqlTransaction\cf3  \cf4 tran\cf3  = \cf1 {\b null}\cf3 ;\par ??    \cf1 {\b try}\par ??\cf3     \{\par ??        \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??        \cf4 tran\cf3  = \cf4 con\cf3 .\cf4 BeginTransaction\cf3 ();\par ??        \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??        \{\par ??            \cf4 cmd\cf3 .\cf4 Transaction\cf3  = \cf4 tran\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??\par ??        \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??        \{\par ??            \cf4 cmd\cf3 .\cf4 Transaction\cf3  = \cf4 tran\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??\par ??        \cf4 tran\cf3 .\cf4 Commit\cf3 ();\par ??    \}\par ??    \cf1 {\b catch}\par ??\cf3     \{\par ??        \cf1 {\b if}\cf3  (\cf4 tran\cf3  != \cf1 {\b null}\cf3 ) \cf4 tran\cf3 .\cf4 Rollback\cf3 ();\par ??    \}\par ??    \cf1 {\b finally}\par ??\cf3     \{\par ??        \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??    \}\par ??\}\par ??}
--&gt;
&lt;/p&gt;
&lt;div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 761px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px"&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 27&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;string&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt; = &lt;span style="COLOR: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ConnectionStrings&lt;/span&gt;[&lt;span style="COLOR: #c89191"&gt;"Testing"&lt;/span&gt;].&lt;span style="COLOR: #dfdfbf"&gt;ConnectionString&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 28&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 29&lt;/span&gt; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;SqlTransaction&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;null&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;try&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Open&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;BeginTransaction&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Transaction&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
1"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 43&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Transaction&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
2"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 50&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 51&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 52&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 53&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Commit&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 54&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 55&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;catch&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 56&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 57&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;if&lt;/span&gt; (&lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt; != &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;null&lt;/span&gt;) &lt;span style="COLOR: #dfdfbf"&gt;tran&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Rollback&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 58&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 59&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;finally&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 60&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 61&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Close&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 62&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 63&lt;/span&gt; }
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
System.Transactions liberated us from the mundane SqlClient code and repetitive try-catches.
simply wrapping your old ADO.NET with a using (TransactionScope) { } is all you need
to do. You will typically add a transactionScope.Complete() statement as the last
line in the TransactionScope using block is really all you need. Any exception thrown
before this point will break out of scope, implicitly aborting the transation. Much
better.
&lt;/p&gt;
&lt;p&gt;
System.Transactions uses the LTM (Lightweight Transaction Manager) when dealing with
single resources or machines. The transaction is automatically promoted to MSDTC (Microsoft
Distributed Transaction Coordinator) when another resource is enlisted in a transaction.
A lot of people struggle with MSDTC because it is difficult to setup, requires special
firewall considerations, and doesn't really work well for smart client applications
since you have to install MSDTC on every client machine.
&lt;/p&gt;
&lt;p&gt;
I'll show one transaction performed three different ways and show what happens with
the LTM and MSDTC for each of them. I will also demonstrate an excellent reason to
migrate to Enterprise Library.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;1) Executing two ADO.NET SqlCommands in different SqlConnections&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf1 {\b string}\cf3  \cf5 connectionString\cf3  = \cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ;\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
--&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf1 {\b string}\cf3  \cf5 connectionString\cf3  = \cf4 ConfigurationManager\cf3 .\cf5 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf5 ConnectionString\cf3 ;\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf4 SqlConnection\cf3  \cf5 con\cf3  = \cf1 {\b new}\cf3  \cf4 SqlConnection\cf3 (\cf5 connectionString\cf3 ))\par ??    \cf1 {\b using}\cf3  (\cf4 SqlCommand\cf3  \cf5 cmd\cf3  = \cf1 {\b new}\cf3  \cf4 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf5 con\cf3 ))\par ??    \{\par ??        \cf5 cmd\cf3 .\cf5 CommandType\cf3  = \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 CommandType\cf3 .\cf5 StoredProcedure\cf3 ;\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf5 cmd\cf3 .\cf5 Parameters\cf3 .\cf5 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Open\cf3 ();\par ??            \cf5 cmd\cf3 .\cf5 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf5 con\cf3 .\cf5 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
--&gt;
&lt;/p&gt;
&lt;div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 764px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px"&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 122&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt;())
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 123&lt;/span&gt; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 124&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;string&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt; = &lt;span style="COLOR: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ConnectionStrings&lt;/span&gt;[&lt;span style="COLOR: #c89191"&gt;"Testing"&lt;/span&gt;].&lt;span style="COLOR: #dfdfbf"&gt;ConnectionString&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 125&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 126&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 127&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 128&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 129&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
1"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 130&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 131&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;try&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 132&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 133&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Open&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 134&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 135&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 136&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;finally&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 137&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 138&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Close&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 139&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 140&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 141&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 142&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 143&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 144&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 145&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 146&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 147&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 148&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 149&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 150&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 151&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
2"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 152&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 153&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;try&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 154&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 155&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Open&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 156&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 157&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 158&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;finally&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 159&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 160&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Close&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 161&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 162&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 163&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 164&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 165&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 166&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 167&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 168&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 169&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Complete&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 170&lt;/span&gt; }
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This writes the following to the command line:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;&lt;strong&gt;Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:2&lt;br&gt;
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000&lt;br&gt;
Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:2&lt;br&gt;
Distributed Transaction ID: 1fad8108-ddae-496a-a7da-ce92df175e40&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You'll notice that the first command creates a transaction using LTM as indicated
by the &lt;em&gt;Local Transaction ID&lt;/em&gt;. After the second command is executed, the transaction
is promoted to DTC as indicated by the &lt;em&gt;Distributed Transaction ID&lt;/em&gt;. This is
expected because there are two distinct SqlConnections. Even though the connection
string is the same, TransactionScope treats these ADO.NET objects as unique resources.
&lt;/p&gt;
&lt;p&gt;
This has additional implications when connection pooling comes into play. After I
close the first connection, it is returned to the pool and is available for use. If
this connection is requested for use, it will no longer be available to commit or
abort this transaction, and you will see the dreaded MSDTC error "Communication with
the underlying transaction manager has failed."
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2) Executing two ADO.NET SqlCommands in the same SqlConnection&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b using}\cf1  (\cf4 SqlConnection\cf1  \cf5 con\cf1  = \cf3 {\b new}\cf1  \cf4 SqlConnection\cf1 (\cf4 ConfigurationManager\cf1 .\cf5 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf5 ConnectionString\cf1 ))\par ??            \{\par ??                \cf4 SqlTransaction\cf1  \cf5 tran\cf1  = \cf3 {\b null}\cf1 ;\par ??                \cf3 {\b try}\par ??\cf1                 \{\par ??                    \cf5 con\cf1 .\cf5 Open\cf1 ();\par ??                    \cf5 tran\cf1  = \cf5 con\cf1 .\cf5 BeginTransaction\cf1 ();\par ??                    \cf3 {\b using}\cf1  (\cf4 SqlCommand\cf1  \cf5 cmd\cf1  = \cf3 {\b new}\cf1  \cf4 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf5 con\cf1 ))\par ??                    \{\par ??                        \cf5 cmd\cf1 .\cf5 Transaction\cf1  = \cf5 tran\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 CommandType\cf1  = \cf5 System\cf1 .\cf5 Data\cf1 .\cf4 CommandType\cf1 .\cf5 StoredProcedure\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf3 {\b using}\cf1  (\cf4 SqlCommand\cf1  \cf5 cmd\cf1  = \cf3 {\b new}\cf1  \cf4 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf5 con\cf1 ))\par ??                    \{\par ??                        \cf5 cmd\cf1 .\cf5 Transaction\cf1  = \cf5 tran\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 CommandType\cf1  = \cf5 System\cf1 .\cf5 Data\cf1 .\cf4 CommandType\cf1 .\cf5 StoredProcedure\cf1 ;\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 Parameters\cf1 .\cf5 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf5 cmd\cf1 .\cf5 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf5 tran\cf1 .\cf5 Commit\cf1 ();\par ??                \}\par ??                \cf3 {\b catch}\par ??\cf1                 \{\par ??                    \cf3 {\b if}\cf1  (\cf5 tran\cf1  != \cf3 {\b null}\cf1 ) \cf5 tran\cf1 .\cf5 Rollback\cf1 ();\par ??                \}\par ??                \cf3 {\b finally}\par ??\cf1                 \{\par ??                    \cf5 con\cf1 .\cf5 Close\cf1 ();\par ??                \}\par ??            \}}
--&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b string}\cf1  \cf4 connectionString\cf1  = \cf5 ConfigurationManager\cf1 .\cf4 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf4 ConnectionString\cf1 ;\par ??            \cf3 {\b using}\cf1  (\cf5 SqlConnection\cf1  \cf4 con\cf1  = \cf3 {\b new}\cf1  \cf5 SqlConnection\cf1 (\cf4 connectionString\cf1 ))\par ??            \{\par ??                \cf5 SqlTransaction\cf1  \cf4 tran\cf1  = \cf3 {\b null}\cf1 ;\par ??                \cf3 {\b try}\par ??\cf1                 \{\par ??                    \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                    \cf4 tran\cf1  = \cf4 con\cf1 .\cf4 BeginTransaction\cf1 ();\par ??                    \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                    \{\par ??                        \cf4 cmd\cf1 .\cf4 Transaction\cf1  = \cf4 tran\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                    \{\par ??                        \cf4 cmd\cf1 .\cf4 Transaction\cf1  = \cf4 tran\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??\par ??                    \cf4 tran\cf1 .\cf4 Commit\cf1 ();\par ??                \}\par ??                \cf3 {\b catch}\par ??\cf1                 \{\par ??                    \cf3 {\b if}\cf1  (\cf4 tran\cf1  != \cf3 {\b null}\cf1 ) \cf4 tran\cf1 .\cf4 Rollback\cf1 ();\par ??                \}\par ??                \cf3 {\b finally}\par ??\cf1                 \{\par ??                    \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                \}\par ??            \}}
--&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red220\green220\blue204;\red63\green63\blue63;\red225\green225\blue138;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2             \cf3 {\b string}\cf1  \cf4 connectionString\cf1  = \cf5 ConfigurationManager\cf1 .\cf4 ConnectionStrings\cf1 [\cf6 "Testing"\cf1 ].\cf4 ConnectionString\cf1 ;\par ??            \cf3 {\b using}\cf1  (\cf5 TransactionScope\cf1  \cf4 scope\cf1  = \cf3 {\b new}\cf1  \cf5 TransactionScope\cf1 ())\par ??            \cf3 {\b using}\cf1  (\cf5 SqlConnection\cf1  \cf4 con\cf1  = \cf3 {\b new}\cf1  \cf5 SqlConnection\cf1 (\cf4 connectionString\cf1 ))\par ??            \{\par ??                \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                \{\par ??                    \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 1"\cf1 );\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                    \cf3 {\b try}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??                    \cf3 {\b finally}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                    \}\par ??                \}\par ??\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Local Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 LocalIdentifier\cf1 );\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Distributed Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 DistributedIdentifier\cf1 .\cf4 ToString\cf1 ());\par ??\par ??                \cf3 {\b using}\cf1  (\cf5 SqlCommand\cf1  \cf4 cmd\cf1  = \cf3 {\b new}\cf1  \cf5 SqlCommand\cf1 (\cf6 "usp_ErrorLog_Insert"\cf1 , \cf4 con\cf1 ))\par ??                \{\par ??                    \cf4 cmd\cf1 .\cf4 CommandType\cf1  = \cf4 System\cf1 .\cf4 Data\cf1 .\cf5 CommandType\cf1 .\cf4 StoredProcedure\cf1 ;\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "Message"\cf1 , \cf6 "Testing 2"\cf1 );\par ??                    \cf4 cmd\cf1 .\cf4 Parameters\cf1 .\cf4 AddWithValue\cf1 (\cf6 "UserID"\cf1 , \cf7 5150\cf1 );\par ??                    \cf3 {\b try}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Open\cf1 ();\par ??                        \cf4 cmd\cf1 .\cf4 ExecuteNonQuery\cf1 ();\par ??                    \}\par ??                    \cf3 {\b finally}\par ??\cf1                     \{\par ??                        \cf4 con\cf1 .\cf4 Close\cf1 ();\par ??                    \}\par ??                \}\par ??\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Local Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 LocalIdentifier\cf1 );\par ??                \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf6 "Distributed Transaction ID: \{0\}"\cf1 , \cf5 Transaction\cf1 .\cf4 Current\cf1 .\cf4 TransactionInformation\cf1 .\cf4 DistributedIdentifier\cf1 .\cf4 ToString\cf1 ());\par ??\par ??                \cf4 scope\cf1 .\cf4 Complete\cf1 ();\par ??            \}}
--&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 TransactionScope\cf3  \cf4 scope\cf3  = \cf1 {\b new}\cf3  \cf5 TransactionScope\cf3 ())\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf4 scope\cf3 .\cf4 Complete\cf3 ();\par ??\}}
--&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red223\green223\blue191;\red43\green145\blue175;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b string}\cf3  \cf4 connectionString\cf3  = \cf5 ConfigurationManager\cf3 .\cf4 ConnectionStrings\cf3 [\cf6 "Testing"\cf3 ].\cf4 ConnectionString\cf3 ;\par ??\cf1 {\b using}\cf3  (\cf5 TransactionScope\cf3  \cf4 scope\cf3  = \cf1 {\b new}\cf3  \cf5 TransactionScope\cf3 ())\par ??\cf1 {\b using}\cf3  (\cf5 SqlConnection\cf3  \cf4 con\cf3  = \cf1 {\b new}\cf3  \cf5 SqlConnection\cf3 (\cf4 connectionString\cf3 ))\par ??\{\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 1"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf1 {\b using}\cf3  (\cf5 SqlCommand\cf3  \cf4 cmd\cf3  = \cf1 {\b new}\cf3  \cf5 SqlCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 , \cf4 con\cf3 ))\par ??    \{\par ??        \cf4 cmd\cf3 .\cf4 CommandType\cf3  = \cf4 System\cf3 .\cf4 Data\cf3 .\cf5 CommandType\cf3 .\cf4 StoredProcedure\cf3 ;\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "Message"\cf3 , \cf6 "Testing 2"\cf3 );\par ??        \cf4 cmd\cf3 .\cf4 Parameters\cf3 .\cf4 AddWithValue\cf3 (\cf6 "UserID"\cf3 , \cf7 5150\cf3 );\par ??        \cf1 {\b try}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Open\cf3 ();\par ??            \cf4 cmd\cf3 .\cf4 ExecuteNonQuery\cf3 ();\par ??        \}\par ??        \cf1 {\b finally}\par ??\cf3         \{\par ??            \cf4 con\cf3 .\cf4 Close\cf3 ();\par ??        \}\par ??    \}\par ??\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 LocalIdentifier\cf3 );\par ??    \cf5 Console\cf3 .\cf4 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf5 Transaction\cf3 .\cf4 Current\cf3 .\cf4 TransactionInformation\cf3 .\cf4 DistributedIdentifier\cf3 .\cf4 ToString\cf3 ());\par ??\par ??    \cf4 scope\cf3 .\cf4 Complete\cf3 ();\par ??\}}
--&gt;
&lt;/p&gt;
&lt;div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 765px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px"&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 69&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;string&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt; = &lt;span style="COLOR: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ConnectionStrings&lt;/span&gt;[&lt;span style="COLOR: #c89191"&gt;"Testing"&lt;/span&gt;].&lt;span style="COLOR: #dfdfbf"&gt;ConnectionString&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 70&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt;())
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 71&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlConnection&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;connectionString&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 72&lt;/span&gt; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 73&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 74&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 75&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 76&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
1"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 77&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 78&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;try&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 79&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 80&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Open&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 81&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 82&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 83&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;finally&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 84&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 85&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Close&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 86&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 87&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 88&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 89&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 90&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 91&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 92&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 93&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 94&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 95&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 96&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CommandType&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;CommandType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;StoredProcedure&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 97&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
2"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 98&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Parameters&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddWithValue&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp;&amp;nbsp; 99&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;try&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 100&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 101&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Open&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 102&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 103&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 104&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;finally&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 105&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 106&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;con&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Close&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 107&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 108&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 109&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 110&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 111&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 112&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 113&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 114&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 115&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Complete&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 116&lt;/span&gt; }
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This writes the following to the command line:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;&lt;strong&gt;Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:1&lt;br&gt;
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000&lt;br&gt;
Local Transaction ID: e90f47f4-df80-496b-a9c0-0c45b2f452c4:1&lt;br&gt;
Distributed Transaction ID: becac9c9-e15f-4370-9f73-7f369665bed7&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This is not expected because both commands are part of the same connection. Of course
I am closing the connection to simulate an N-tier app where the data access layer
is maintaining it's own SQL access, opening and closing its connection as it should.
If I did not close the connection, you would not see a &lt;em&gt;Distributed Transaction
ID&lt;/em&gt; after the second command.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;3) Executing two Enterprise Library commands&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red225\green225\blue138;\red63\green63\blue63;\red220\green220\blue204;\red43\green145\blue175;\red223\green223\blue191;\red200\green145\blue145;\red138\green204\blue207;}??\fs18 \cf1\cb2\highlight2 {\b using}\cf3  (\cf4 TransactionScope\cf3  \cf5 scope\cf3  = \cf1 {\b new}\cf3  \cf4 TransactionScope\cf3 ())\par ??\{\par ??    \cf4 Database\cf3  \cf5 db\cf3  = \cf4 DatabaseFactory\cf3 .\cf5 CreateDatabase\cf3 (\cf6 "Testing"\cf3 );\par ??    \cf4 DbCommand\cf3  \cf5 cmd\cf3  = \cf5 db\cf3 .\cf5 GetStoredProcCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 );\par ??    \cf5 db\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd\cf3 , \cf6 "Message"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 String\cf3 , \cf6 "Testing 1"\cf3 );\par ??    \cf5 db\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd\cf3 , \cf6 "UserID"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 Int32\cf3 , \cf7 5150\cf3 );\par ??    \cf5 db\cf3 .\cf5 ExecuteNonQuery\cf3 (\cf5 cmd\cf3 );\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf4 Database\cf3  \cf5 db1\cf3  = \cf4 DatabaseFactory\cf3 .\cf5 CreateDatabase\cf3 (\cf6 "Testing1"\cf3 );\par ??    \cf4 DbCommand\cf3  \cf5 cmd1\cf3  = \cf5 db\cf3 .\cf5 GetStoredProcCommand\cf3 (\cf6 "usp_ErrorLog_Insert"\cf3 );\par ??    \cf5 db1\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd1\cf3 , \cf6 "Message"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 String\cf3 , \cf6 "Testing 2"\cf3 );\par ??    \cf5 db1\cf3 .\cf5 AddInParameter\cf3 (\cf5 cmd1\cf3 , \cf6 "UserID"\cf3 , \cf5 System\cf3 .\cf5 Data\cf3 .\cf4 DbType\cf3 .\cf5 Int32\cf3 , \cf7 5150\cf3 );\par ??    \cf5 db1\cf3 .\cf5 ExecuteNonQuery\cf3 (\cf5 cmd1\cf3 );\par ??\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Local Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 LocalIdentifier\cf3 );\par ??    \cf4 Console\cf3 .\cf5 WriteLine\cf3 (\cf6 "Distributed Transaction ID: \{0\}"\cf3 , \par ??        \cf4 Transaction\cf3 .\cf5 Current\cf3 .\cf5 TransactionInformation\cf3 .\cf5 DistributedIdentifier\cf3 .\cf5 ToString\cf3 ());\par ??\par ??    \cf5 scope\cf3 .\cf5 Complete\cf3 ();\par ??\}}
--&gt;
&lt;/p&gt;
&lt;div style="OVERFLOW-Y: auto; FONT-SIZE: 9pt; BACKGROUND: #3f3f3f; WIDTH: 761px; COLOR: #dcdccc; FONT-FAMILY: consolas; HEIGHT: 250px"&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 176&lt;/span&gt;&amp;nbsp;&lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #e1e18a"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;TransactionScope&lt;/span&gt;())
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 177&lt;/span&gt; {
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 178&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Database&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt; = &lt;span style="COLOR: #2b91af"&gt;DatabaseFactory&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CreateDatabase&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Testing"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 179&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;DbCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;GetStoredProcCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 180&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddInParameter&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;DbType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;String&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
1"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 181&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddInParameter&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;DbType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Int32&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 182&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 183&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 184&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 185&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 186&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 187&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 188&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 189&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Database&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;db1&lt;/span&gt; = &lt;span style="COLOR: #2b91af"&gt;DatabaseFactory&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;CreateDatabase&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Testing1"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 190&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;DbCommand&lt;/span&gt; &lt;span style="COLOR: #dfdfbf"&gt;cmd1&lt;/span&gt; = &lt;span style="COLOR: #dfdfbf"&gt;db&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;GetStoredProcCommand&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"usp_ErrorLog_Insert"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 191&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db1&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddInParameter&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd1&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Message"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;DbType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;String&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"Testing
2"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 192&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db1&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;AddInParameter&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd1&lt;/span&gt;, &lt;span style="COLOR: #c89191"&gt;"UserID"&lt;/span&gt;, &lt;span style="COLOR: #dfdfbf"&gt;System&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Data&lt;/span&gt;.&lt;span style="COLOR: #2b91af"&gt;DbType&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Int32&lt;/span&gt;, &lt;span style="COLOR: #8acccf"&gt;5150&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 193&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;db1&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ExecuteNonQuery&lt;/span&gt;(&lt;span style="COLOR: #dfdfbf"&gt;cmd1&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 194&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 195&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Local
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 196&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;LocalIdentifier&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 197&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;WriteLine&lt;/span&gt;(&lt;span style="COLOR: #c89191"&gt;"Distributed
Transaction ID: {0}"&lt;/span&gt;, 
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 198&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #2b91af"&gt;Transaction&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Current&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;TransactionInformation&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;DistributedIdentifier&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;ToString&lt;/span&gt;());
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 199&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 200&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #dfdfbf"&gt;scope&lt;/span&gt;.&lt;span style="COLOR: #dfdfbf"&gt;Complete&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;
&lt;span style="COLOR: #85ac8d"&gt;&amp;nbsp; 201&lt;/span&gt; }
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This writes the following to the command line:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;&lt;strong&gt;Local Transaction ID: 6737b756-2d5b-4eff-902d-15f9ccd5c26f:3&lt;br&gt;
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000&lt;br&gt;
Local Transaction ID: 6737b756-2d5b-4eff-902d-15f9ccd5c26f:3&lt;br&gt;
Distributed Transaction ID: 00000000-0000-0000-0000-000000000000&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Whoa! How cool is that? No DTC promotion. Enterprise Library is intelligently deciding
to keep the connection open when it is part of the transaction. This will save a lot
of wasted time as the promotion to DTC adds a noticeable delay. If I wasn't using
Enterprise Library already, I'd switch now.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Useful links:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms172152.aspx"&gt;Implementing an Implicit
Transaction using Transaction Scope&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms730266.aspx"&gt;WCF Transactions&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms973865.aspx"&gt;Introducing System.Transactions
in the .NET Framework 2.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=5aef3f0a-3e66-4e87-8469-0411651d2aba" /&gt;</description>
      <comments>http://offroadcoder.com/CommentView,guid,5aef3f0a-3e66-4e87-8469-0411651d2aba.aspx</comments>
      <category>C#</category>
      <category>MSDTC</category>
      <category>SQL</category>
      <category>Transactions</category>
    </item>
    <item>
      <trackback:ping>http://offroadcoder.com/Trackback.aspx?guid=4118ae7f-25e1-4d3a-8256-a57596277005</trackback:ping>
      <pingback:server>http://offroadcoder.com/pingback.aspx</pingback:server>
      <pingback:target>http://offroadcoder.com/PermaLink,guid,4118ae7f-25e1-4d3a-8256-a57596277005.aspx</pingback:target>
      <dc:creator>Scott Klueppel</dc:creator>
      <georss:point>30.109017 -81.497099</georss:point>
      <wfw:comment>http://offroadcoder.com/CommentView,guid,4118ae7f-25e1-4d3a-8256-a57596277005.aspx</wfw:comment>
      <wfw:commentRss>http://offroadcoder.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4118ae7f-25e1-4d3a-8256-a57596277005</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I really need to read up on new features when a major release comes out. Just a few
weeks ago I learned of a great "new" SQL 2005 function... ROW_NUMBER(). Just in time
since SQL 2008 is already out. 
</p>
        <p>
For me, this function means a lot less temp tables. I would typically create a temp
table with an <font color="#0000ff">ID INT IDENTITY(1,1)</font> column to create an
DisplayOrder, BatchID, etc. used to group or join on later. Books Online describes
the function as "Returns the sequential number of a row within a partition of a result
set, starting at 1 for the first row in each partition." The syntax is simple, and
looks like:
</p>
        <blockquote>
          <p>
            <font color="#ff00ff">ROW_NUMBER</font>() <font color="#0000ff">OVER</font> (<font color="#0000ff">ORDER
BY</font> ID <font color="#0000ff">DESC</font>)
</p>
        </blockquote>
        <p>
For this example, the data I want to bring back with a <em>DisplayOrder</em> column
looks like:
</p>
        <p>
          <a href="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/pers_subs_data.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="148" alt="pers_subs_data" src="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/pers_subs_data_thumb.png" width="506" border="0" />
          </a>
        </p>
        <p>
          <u>Without ROW_NUMBER(), using a table variable with an identity column:</u>
        </p>
        <blockquote>
          <p>
            <font color="#0000ff">DECLARE</font> @Subs <font color="#0000ff">TABLE</font> (DisplayOrder<font color="#0000ff"> INT
IDENTITY</font>(1,1), [Address] <font color="#0000ff">VARCHAR</font>(100), Operation <font color="#0000ff">VARCHAR</font>(50),
[Contract] <font color="#0000ff">VARCHAR</font>(50)) 
</p>
          <p>
            <font color="#0000ff">INSERT INTO</font> @Subs ([Address], Operation, [Contract])<br /><font color="#0000ff">SELECT</font> [Address]<br />
    , Operation<br />
    , [Contract]<br /><font color="#0000ff">FROM</font> PersistentSubscribers<br /><font color="#0000ff">WHERE</font> Operation = 'OnEvent2'<br /><font color="#0000ff">ORDER BY <font color="#000000">ID</font> DESC</font></p>
          <p>
            <font color="#0000ff">SELECT <font color="#000000">*</font> FROM</font> @Subs 
</p>
        </blockquote>
        <p>
          <u>With ROW_NUMBER(), look how beautiful:</u>
        </p>
        <blockquote>
          <p>
            <font color="blue">SELECT</font> DisplayOrder = <font color="#ff00ff">ROW_NUMBER</font>() <font color="#0000ff">OVER</font> (<font color="#0000ff">ORDER
BY</font> ID <font color="#0000ff">DESC</font>)<br />
    , [Address]<br />
    , Operation<br />
    , [Contract]<br /><font color="#0000ff">FROM</font> PersistentSubscribers<br /><font color="#0000ff">WHERE</font> Operation = 'OnEvent2'
</p>
        </blockquote>
        <p>
The results from both methods looks like: 
</p>
        <p>
  
</p>
        <p>
          <a href="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/row_number_results.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="122" alt="row_number_results" src="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/row_number_results_thumb.png" width="456" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=4118ae7f-25e1-4d3a-8256-a57596277005" />
      </body>
      <title>ROW_NUMBER()</title>
      <guid isPermaLink="false">http://offroadcoder.com/PermaLink,guid,4118ae7f-25e1-4d3a-8256-a57596277005.aspx</guid>
      <link>http://offroadcoder.com/2008/09/07/ROWNUMBER.aspx</link>
      <pubDate>Sun, 07 Sep 2008 03:33:25 GMT</pubDate>
      <description>&lt;p&gt;
I really need to read up on new features when a major release comes out. Just a few
weeks ago I learned of a great "new" SQL 2005 function... ROW_NUMBER(). Just in time
since SQL 2008 is already out. 
&lt;/p&gt;
&lt;p&gt;
For me, this function means a lot less temp tables. I would typically create a temp
table with an &lt;font color="#0000ff"&gt;ID INT IDENTITY(1,1)&lt;/font&gt; column to create an
DisplayOrder, BatchID, etc. used to group or join on later. Books Online describes
the function as "Returns the sequential number of a row within a partition of a result
set, starting at 1 for the first row in each partition." The syntax is simple, and
looks like:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font color="#ff00ff"&gt;ROW_NUMBER&lt;/font&gt;() &lt;font color="#0000ff"&gt;OVER&lt;/font&gt; (&lt;font color="#0000ff"&gt;ORDER
BY&lt;/font&gt; ID &lt;font color="#0000ff"&gt;DESC&lt;/font&gt;)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
For this example, the data I want to bring back with a &lt;em&gt;DisplayOrder&lt;/em&gt; column
looks like:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/pers_subs_data.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="148" alt="pers_subs_data" src="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/pers_subs_data_thumb.png" width="506" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Without ROW_NUMBER(), using a table variable with an identity column:&lt;/u&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt; @Subs &lt;font color="#0000ff"&gt;TABLE&lt;/font&gt; (DisplayOrder&lt;font color="#0000ff"&gt; INT
IDENTITY&lt;/font&gt;(1,1), [Address] &lt;font color="#0000ff"&gt;VARCHAR&lt;/font&gt;(100), Operation &lt;font color="#0000ff"&gt;VARCHAR&lt;/font&gt;(50),
[Contract] &lt;font color="#0000ff"&gt;VARCHAR&lt;/font&gt;(50)) 
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#0000ff"&gt;INSERT INTO&lt;/font&gt; @Subs ([Address], Operation, [Contract])&lt;br&gt;
&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt; [Address]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; , Operation&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; , [Contract]&lt;br&gt;
&lt;font color="#0000ff"&gt;FROM&lt;/font&gt; PersistentSubscribers&lt;br&gt;
&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt; Operation = 'OnEvent2'&lt;br&gt;
&lt;font color="#0000ff"&gt;ORDER BY &lt;font color="#000000"&gt;ID&lt;/font&gt; DESC&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#0000ff"&gt;SELECT &lt;font color="#000000"&gt;*&lt;/font&gt; FROM&lt;/font&gt; @Subs 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;u&gt;With ROW_NUMBER(), look how beautiful:&lt;/u&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;font color="blue"&gt;SELECT&lt;/font&gt; DisplayOrder = &lt;font color="#ff00ff"&gt;ROW_NUMBER&lt;/font&gt;() &lt;font color="#0000ff"&gt;OVER&lt;/font&gt; (&lt;font color="#0000ff"&gt;ORDER
BY&lt;/font&gt; ID &lt;font color="#0000ff"&gt;DESC&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; , [Address]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; , Operation&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; , [Contract]&lt;br&gt;
&lt;font color="#0000ff"&gt;FROM&lt;/font&gt; PersistentSubscribers&lt;br&gt;
&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt; Operation = 'OnEvent2'
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The results from both methods looks like: 
&lt;p&gt;
&amp;nbsp; 
&lt;p&gt;
&lt;a href="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/row_number_results.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="122" alt="row_number_results" src="http://scott.klueppel.net/content/binary/ROW_NUMBER_147E9/row_number_results_thumb.png" width="456" border="0"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=4118ae7f-25e1-4d3a-8256-a57596277005" /&gt;</description>
      <comments>http://offroadcoder.com/CommentView,guid,4118ae7f-25e1-4d3a-8256-a57596277005.aspx</comments>
      <category>SQL</category>
    </item>
    <item>
      <trackback:ping>http://offroadcoder.com/Trackback.aspx?guid=3d7a84f1-e8c6-4e97-ba3d-14a8d332e594</trackback:ping>
      <pingback:server>http://offroadcoder.com/pingback.aspx</pingback:server>
      <pingback:target>http://offroadcoder.com/PermaLink,guid,3d7a84f1-e8c6-4e97-ba3d-14a8d332e594.aspx</pingback:target>
      <dc:creator>Scott Klueppel</dc:creator>
      <georss:point>30.109017 -81.497099</georss:point>
      <wfw:comment>http://offroadcoder.com/CommentView,guid,3d7a84f1-e8c6-4e97-ba3d-14a8d332e594.aspx</wfw:comment>
      <wfw:commentRss>http://offroadcoder.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3d7a84f1-e8c6-4e97-ba3d-14a8d332e594</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few months after SQL 2005 was released and hit the productions servers, some people
started experiencing some odd behavior in their stored procedures. Simple stored procedures
that normally return in 0 seconds would take upwards of a minute to return. Even more
strange was the fact that the same query, outside of a stored procedure, would still
return in 0 seconds.
</p>
        <p>
It never affected me personally... until today. Three years late to the party. It's
funny how much more interested I am in the causes and solutions for this apparent
problem when it affects me. "Parameter Sniffing" is the term Microsoft uses to describe
the feature that causes this odd behavior. While it appeared as an issue when I encountered
it today, I found that the feature is not only well-intentioned but quite useful.
</p>
        <p>
The execution plan is generated and cached the first time your stored procedure is
called. When the execution plan is being created, SQL Server reads the input parameters
and uses them to optimize the execution plan for those parameters. This is called
"parameter sniffing." If the input parameters used in the first call to the stored
procedure are atypical for the overall use of the stored procedure, a less than ideal
execution plan will be cached for all subsequent calls.
</p>
        <p>
Simply dropping and recompiling the stored procedure does not seem to affect the cached
execution plan. Updating statistics on the tables used in the stored procedure will
cause the execution plan to be regenerated on the next call of the stored procedure.
However, if the same or similar atypical parameters are used on the first execution
of the stored procedure, an equally sub-optimal execution plan will be cached.
</p>
        <p>
You can turn off parameter sniffing. This is accomplished by assigning the input parameter
values to local variables inside the stored procedure and then using the local variables
within the stored procedure. When the execution plan is created, SQL Server will look
at the table statistics to optimize the query for the "average" use. It does this
by looking at the tables used in the query and analyzing row counts, etc. to find
a reasonable plan that will likely suit a majority of situations.
</p>
        <p>
My stored procedure was bringing back multiple resultsets to be used to create a hierarchical
structure in code. It works essentially like the following:
</p>
        <p>
          <font color="#003300">
            <font color="#0000ff">CREATE PROCEDURE</font> [dbo].[usp_Order_GetOrderDetails] 
<br />
( 
<br />
   @StartOrderId <font color="#0000ff">INT</font>, 
<br />
   @EndOrderId <font color="#0000ff">INT</font><br />
) 
<br /><font color="#0000ff">AS 
<br />
BEGIN</font><br />
   <font color="#0000ff">SELECT</font> * 
<br />
   <font color="#0000ff">FROM</font> Order 
<br />
   <font color="#0000ff">WHERE</font> OrderId <font color="#a9a9a9">BETWEEN</font> @StartOrderId <font color="#a9a9a9">AND</font> @EndOrderId 
<br />
  
<br />
   <font color="#0000ff">SELECT</font> * 
<br />
   <font color="#0000ff">FROM</font> OrderLineItem 
<br />
   <font color="#0000ff">WHERE</font> OrderId <font color="#a9a9a9">BETWEEN</font> @StartOrderId <font color="#a9a9a9">AND</font> @EndOrderId 
<br /></font>
          <font color="#0000ff">END</font>
        </p>
        <p>
I was testing the stored procedure for full day using the same ID for @StartOrderId
and @EndOrderId. Since the intended use of this stored procedure is almost always
@EndOrderId = @StartOrderId + 1000, this makes a big difference when calculating the
estimate number of rows returned. I forced SQL Server to assume that my execution
plan should be based on an ID range of 1 instead of 1000. Turning off parameter sniffing
lessens these effects.
</p>
        <p>
To turn off parameter sniffing, it would look like this:
</p>
        <p>
          <font color="#0000ff">CREATE PROCEDURE</font> [dbo].[usp_Order_GetOrderDetails] 
<br />
( 
<br />
   @StartOrderId <font color="#0000ff">INT</font>, 
<br />
   @EndOrderId <font color="#0000ff">INT</font><br />
) 
<br /><font color="#0000ff">AS 
<br />
BEGIN 
<br />
   DECLARE <font color="#000000">@Start</font> INT 
<br />
   DECLARE <font color="#000000">@End</font> INT 
<br />
   SET <font color="#000000">@Start = @StartOrderId</font><br />
   SET <font color="#000000">@End = @EndOrderId</font><br />
 </font><br />
   <font color="#0000ff">SELECT</font> * 
<br />
   <font color="#0000ff">FROM</font> Order 
<br />
   <font color="#0000ff">WHERE</font> OrderId <font color="#a9a9a9">BETWEEN</font> @Start <font color="#a9a9a9">AND</font> @End 
<br />
  
<br />
   <font color="#0000ff">SELECT</font> * 
<br />
   <font color="#0000ff">FROM</font> OrderLineItem 
<br />
   <font color="#0000ff">WHERE</font> OrderId <font color="#a9a9a9">BETWEEN</font> @Start <font color="#a9a9a9">AND</font> @End 
<br /><font color="#0000ff">END</font></p>
        <p>
This immediately improved the performance of my stored procedure. The time to complete
reduced from ~2 minutes to ~2 seconds for my typical 1000 ID range (I know 2 seconds
is a lot, but these tables have millions and millions of rows). But only one piece
of code in the application calls this stored procedure, and 99 out of 100 times it
will have a range of 1000 IDs. Why would I want SQL Server to guess how many Orders
I will typically bring back when I know the exact number? 
</p>
        <p>
I should have the optimal execution plan if I update statistics on Order and OrderLineItem,
and then call usp_Order_GetOrderDetails 1, 1000 after I compile this stored procedure.
This sounds like a lot of work to me, and I did not notice any performance boost by
doing this. I chose to leave parameter sniffing off. 
</p>
        <p>
The only drawbacks to turning off parameter sniffing is the weird looking SQL and
the inevitable questions during code review about the crazy input parameter to variable
mapping. But when you school the doubters on the causes and effects of parameter sniffing,
it will put another notch in your guru stick.
</p>
        <p>
From what I have read, this was not a new feature in SQL 2005. I can't, however, find
any mention of it in SQL 2000 books online, and this feature never showed its face
in SQL 2000.
</p>
        <img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=3d7a84f1-e8c6-4e97-ba3d-14a8d332e594" />
      </body>
      <title>Parameter Sniffing in SQL 2005</title>
      <guid isPermaLink="false">http://offroadcoder.com/PermaLink,guid,3d7a84f1-e8c6-4e97-ba3d-14a8d332e594.aspx</guid>
      <link>http://offroadcoder.com/2008/06/22/ParameterSniffingInSQL2005.aspx</link>
      <pubDate>Sun, 22 Jun 2008 02:24:02 GMT</pubDate>
      <description>&lt;p&gt;
A few months after SQL 2005 was released and hit the productions servers, some people
started experiencing some odd behavior in their stored procedures. Simple stored procedures
that normally return in 0 seconds would take upwards of a minute to return. Even more
strange was the fact that the same query, outside of a stored procedure, would still
return in 0 seconds.
&lt;/p&gt;
&lt;p&gt;
It never affected me personally... until today. Three years late to the party. It's
funny how much more interested I am in the causes and solutions for this apparent
problem when it affects me. "Parameter Sniffing" is the term Microsoft uses to describe
the feature that causes this odd behavior. While it appeared as an issue when I encountered
it today, I found that the feature is not only well-intentioned but quite useful.
&lt;/p&gt;
&lt;p&gt;
The execution plan is generated and cached the first time your stored procedure is
called. When the execution plan is being created, SQL Server reads the input parameters
and uses them to optimize the execution plan for those parameters. This is called
"parameter sniffing." If the input parameters used in the first call to the stored
procedure are atypical for the overall use of the stored procedure, a less than ideal
execution plan will be cached for all subsequent calls.
&lt;/p&gt;
&lt;p&gt;
Simply dropping and recompiling the stored procedure does not seem to affect the cached
execution plan. Updating statistics on the tables used in the stored procedure will
cause the execution plan to be regenerated on the next call of the stored procedure.
However, if the same or similar atypical parameters are used on the first execution
of the stored procedure, an equally sub-optimal execution plan will be cached.
&lt;/p&gt;
&lt;p&gt;
You can turn off parameter sniffing. This is accomplished by assigning the input parameter
values to local variables inside the stored procedure and then using the local variables
within the stored procedure. When the execution plan is created, SQL Server will look
at the table statistics to optimize the query for the "average" use. It does this
by looking at the tables used in the query and analyzing row counts, etc. to find
a reasonable plan that will likely suit a majority of situations.
&lt;/p&gt;
&lt;p&gt;
My stored procedure was bringing back multiple resultsets to be used to create a hierarchical
structure in code. It works essentially like the following:
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#003300&gt;&lt;font color=#0000ff&gt;CREATE PROCEDURE&lt;/font&gt; [dbo].[usp_Order_GetOrderDetails] 
&lt;br&gt;
( 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; @StartOrderId &lt;font color=#0000ff&gt;INT&lt;/font&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; @EndOrderId &lt;font color=#0000ff&gt;INT&lt;/font&gt;
&lt;br&gt;
) 
&lt;br&gt;
&lt;font color=#0000ff&gt;AS 
&lt;br&gt;
BEGIN&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;SELECT&lt;/font&gt; * 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;FROM&lt;/font&gt; Order 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE&lt;/font&gt; OrderId &lt;font color=#a9a9a9&gt;BETWEEN&lt;/font&gt; @StartOrderId &lt;font color=#a9a9a9&gt;AND&lt;/font&gt; @EndOrderId 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;SELECT&lt;/font&gt; * 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;FROM&lt;/font&gt; OrderLineItem 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE&lt;/font&gt; OrderId &lt;font color=#a9a9a9&gt;BETWEEN&lt;/font&gt; @StartOrderId &lt;font color=#a9a9a9&gt;AND&lt;/font&gt; @EndOrderId 
&lt;br&gt;
&lt;/font&gt;&lt;font color=#0000ff&gt;END&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
I was testing the stored procedure for full day using the same ID for @StartOrderId
and @EndOrderId. Since the intended use of this stored procedure is almost always
@EndOrderId = @StartOrderId + 1000, this makes a big difference when calculating the
estimate number of rows returned. I forced SQL Server to assume that my execution
plan should be based on an ID range of 1 instead of 1000. Turning off parameter sniffing
lessens these effects.
&lt;/p&gt;
&lt;p&gt;
To turn off parameter sniffing, it would look like this:
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#0000ff&gt;CREATE PROCEDURE&lt;/font&gt; [dbo].[usp_Order_GetOrderDetails] 
&lt;br&gt;
( 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; @StartOrderId &lt;font color=#0000ff&gt;INT&lt;/font&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; @EndOrderId &lt;font color=#0000ff&gt;INT&lt;/font&gt;
&lt;br&gt;
) 
&lt;br&gt;
&lt;font color=#0000ff&gt;AS 
&lt;br&gt;
BEGIN 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; DECLARE &lt;font color=#000000&gt;@Start&lt;/font&gt; INT 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; DECLARE &lt;font color=#000000&gt;@End&lt;/font&gt; INT 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; SET &lt;font color=#000000&gt;@Start = @StartOrderId&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; SET &lt;font color=#000000&gt;@End = @EndOrderId&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;SELECT&lt;/font&gt; * 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;FROM&lt;/font&gt; Order 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE&lt;/font&gt; OrderId &lt;font color=#a9a9a9&gt;BETWEEN&lt;/font&gt; @Start &lt;font color=#a9a9a9&gt;AND&lt;/font&gt; @End 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;SELECT&lt;/font&gt; * 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;FROM&lt;/font&gt; OrderLineItem 
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE&lt;/font&gt; OrderId &lt;font color=#a9a9a9&gt;BETWEEN&lt;/font&gt; @Start &lt;font color=#a9a9a9&gt;AND&lt;/font&gt; @End 
&lt;br&gt;
&lt;font color=#0000ff&gt;END&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
This immediately improved the performance of my stored procedure. The time to complete
reduced from ~2 minutes to ~2 seconds for my typical 1000 ID range (I know 2 seconds
is a lot, but these tables have millions and millions of rows). But only one piece
of code in the application calls this stored procedure, and 99 out of 100 times it
will have a range of 1000 IDs. Why would I want SQL Server to guess how many Orders
I will typically bring back when I know the exact number? 
&lt;/p&gt;
&lt;p&gt;
I should have the optimal execution plan if I update statistics on Order and OrderLineItem,
and then call usp_Order_GetOrderDetails 1, 1000 after I compile this stored procedure.
This sounds like a lot of work to me, and I did not notice any performance boost by
doing this. I chose to leave parameter sniffing off. 
&lt;/p&gt;
&lt;p&gt;
The only drawbacks to turning off parameter sniffing is the weird looking SQL and
the inevitable questions during code review about the crazy input parameter to variable
mapping. But when you school the doubters on the causes and effects of parameter sniffing,
it will put another notch in your guru stick.
&lt;/p&gt;
&lt;p&gt;
From what I have read, this was not a new feature in SQL 2005. I can't, however, find
any mention of it in SQL 2000 books online, and this feature never showed its face
in SQL 2000.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://offroadcoder.com/aggbug.ashx?id=3d7a84f1-e8c6-4e97-ba3d-14a8d332e594" /&gt;</description>
      <comments>http://offroadcoder.com/CommentView,guid,3d7a84f1-e8c6-4e97-ba3d-14a8d332e594.aspx</comments>
      <category>Database</category>
      <category>SQL</category>
    </item>
  </channel>
</rss>