<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Everyday Adventures</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/evanbasalik/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/evanbasalik/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:07:04 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>SQL Server, JDBC, XA, and Windows 7</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/sql-server-jdbc-xa-and-windows-7</link>
      <pubDate>Wed, 30 Dec 2009 16:05:14 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/12/30/sql-server-jdbc-xa-and-windows-7/</guid>
      <description><![CDATA[One of the Support Engineers on my team approached me the other day and asked if the SQL Server 2005...]]></description>
      <content:encoded><![CDATA[<p>One of the Support Engineers on my team approached me the other day and asked if the SQL Server 2005 JDBC driver we ship works out of the box with XA transactions on Windows 7.&#160; I am embarrassed to say that I did not know the answer off the top of my head.&#160; I figured they would, but given the trouble we had getting them working on Windows XP (it was broken until sometime after XP SP2), I wanted to double-check.</p>  <p>I used a slightly tweaked version of the code from our MSDN site <a href="https://msdn.microsoft.com/en-us/library/aa342335(SQL.90).aspx">https://msdn.microsoft.com/en-us/library/aa342335(SQL.90).aspx</a> and it worked fine the first time through.</p>  <p>Since the 2.0 JDBC driver shipped prior to Windows, it means that my Development counterparts either did their homework ahead of time and tested with the near-RTM code or the Windows 7 Backwards Compatibility folks did their homework and tested the JDBC driver.&#160; Yay!!!</p>  <p>P.S.&#160; I hope at least one of the two possibilities is true – otherwise we just got really lucky!!</p>]]></content:encoded>
    </item>
    <item>
      <title>Empty Windows</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/empty-windows</link>
      <pubDate>Mon, 16 Nov 2009 18:51:32 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/11/16/empty-windows/</guid>
      <description><![CDATA[I ran into an odd behavior the other day with SSRS 2008.&#160; I was troubleshooting a Reporting...]]></description>
      <content:encoded><![CDATA[<p>I ran into an odd behavior the other day with SSRS 2008.&#160; I was troubleshooting a Reporting Services 2008 issue where the authentication was not properly configured, so the customer would get three login prompts and then a blank screen.</p>  <p>Now, anyone who has been supporting SSRS for any period of time is familiar with the three-and-out behavior that is seen when authentication is failing.&#160; However, this generally results in a nice 401 error being returned by IIS.</p>  <p>And that is the rub!&#160; Prior to SSRS 2008, Reporting Services sat on top of IIS.&#160; However, SSRS 2008 natively hosts HTTP.SYS.&#160; The good news is that removing the dependency on IIS means that ISAPI filters and inherited web.config values can no longer break Reporting Services.&#160; The bad news is that you don’t get all of the IIS functionality for free!</p>  <p>In the case of a 401, you were totally rejected by SSRS.&#160; In its current implementation, SSRS does not return a 401 on an authentication failure.&#160; It just returns blank HTML.&#160; Now, I would argue that SSRS should return something more informative to the browser, but at this point it does not.</p>  <p>So, the recommendation I would give is to start thinking authentication issues if you ever see an empty HTML page returned by SSRS.</p>  <p>&#160;</p>  <p>P.S.&#160; There is a two line reference to this behavior in <a title="https://msdn.microsoft.com/en-us/library/cc281253.aspx" href="https://msdn.microsoft.com/en-us/library/cc281253.aspx">https://msdn.microsoft.com/en-us/library/cc281253.aspx</a>, but you’ll forgive me if I overlooked it until the other day.&#160; </p>]]></content:encoded>
    </item>
    <item>
      <title>New and improved setspn</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/new-and-improved-setspn</link>
      <pubDate>Sun, 11 Oct 2009 18:44:13 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/10/11/new-and-improved-setspn/</guid>
      <description><![CDATA[Ever have one of those “I want to kick myself” when you realize something you had been putting off...]]></description>
      <content:encoded><![CDATA[<p>Ever have one of those “I want to kick myself” when you realize something you had been putting off investigating would have saved you a bunch of time?&#160; I did just the other day.</p>  <p>In my role, I am often trying to get SPNs configured properly for SQL Server and Reporting Services (and Analysis Services and IIS application pools on bad days).&#160; Generally, I take the approach of knowing the five SPNs that are necessary (SQL NetBIOS, SQL NetBIOS:port, SQL FQDN, SQL FQDN:port, SSRS URL).&#160; Then, if it still doesn’t work, I am reduced to doing setspn –l against the various service accounts looking for duplicates. </p>  <p>Generally, this is not too hard, but sometimes the list of SPNs is long and the customer uses a naming convention that appears to consist of 29 characters of which 27 are identical and the two ones that are different are scattered in the middle of the name.&#160; Needless to say, this makes finding duplicates really difficult.</p>  <p>However, Windows 2008 shipped with a new and improved version of setspn.&#160; Not only does it exist on every Vista/Windows 2008 or higher machine, but it has some handy new features.&#160; If you run setspn from the command-line with no parameters, this is what you get:</p>  <p><em><strong>Usage: setspn [modifiers switch] [accountname]        <br />&#160; Where &quot;accountname&quot; can be the name or domain\name        <br />&#160; of the target computer or user account </strong></em></p>  <p><em><strong>&#160; Edit Mode Switches:       <br />&#160;&#160; -R = reset HOST ServicePrincipalName        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -R accountname        <br />&#160;&#160; -A = add arbitrary SPN&#160; <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -A SPN accountname        <br />&#160;&#160; -S = add arbitrary SPN after verifying no duplicates exist        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -S SPN accountname        <br />&#160;&#160; -D = delete arbitrary SPN        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -D SPN accountname        <br />&#160;&#160; -L = list SPNs registered to target account        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn [-L] accountname&#160;&#160; </strong></em></p>  <p><em><strong>&#160; Edit Mode Modifiers:       <br />&#160;&#160; -C = specify that accountname is a computer account        <br />&#160;&#160; -U = specify that accountname is a user account        <br />&#160;&#160;&#160; Note: -C and -U are exclusive.&#160; If neither is specified, the tool        <br />&#160;&#160;&#160;&#160; will interpret accountname as a computer name if such a computer        <br />&#160;&#160;&#160;&#160; exists, and a user name if it does not. </strong></em></p>  <p><em><strong>&#160; Query Mode Switches:       <br />&#160;&#160; -Q = query for existence of SPN        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -Q SPN         <br />&#160;&#160; -X = search for duplicate SPNs        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -X </strong></em></p>  <p><em><strong>&#160;&#160;&#160; Note: searching for duplicates, especially forestwide, can take       <br />&#160;&#160;&#160;&#160; a long period of time and a large amount of memory.&#160; -Q will execute        <br />&#160;&#160;&#160;&#160; on each target domain/forest.&#160; -X will return duplicates that exist        <br />&#160;&#160;&#160;&#160; across all targets. SPNs are not required to be unique across forests,        <br />&#160;&#160;&#160;&#160; but duplicates can cause authentication issues when authenticating        <br />&#160;&#160;&#160;&#160; cross-forest. </strong></em></p>  <p><em><strong>&#160; Query Mode Modifiers:       <br />&#160;&#160; -P = suppresses progress to the console and can be used when redirecting        <br />&#160;&#160;&#160; output to a file or when used in an unattended script.&#160; There will be no        <br />&#160;&#160;&#160; output until the command is complete.        <br />&#160;&#160; -F = perform queries at the forest, rather than domain level        <br />&#160;&#160; -T = perform query on the specified domain or forest (when -F is also used)        <br />&#160;&#160;&#160; Usage:&#160;&#160; setspn -T domain (switches and other parameters)        <br />&#160;&#160;&#160;&#160; &quot;&quot; or * can be used to indicate the current domain or forest. </strong></em></p>  <p><em><strong>&#160;&#160;&#160; Note: these modifiers can be used with the -S switch in order to specify       <br />&#160;&#160;&#160;&#160; where the check for duplicates should be performed before adding the SPN.        <br />&#160;&#160;&#160; Note: -T can be specified multiple times.</strong></em></p>  <p><strong><em>Examples:        <br />setspn -R daserver1         <br />&#160;&#160; It will register SPN &quot;HOST/daserver1&quot; and &quot;HOST/{DNS of daserver1}&quot;         <br />setspn -A http/daserver daserver1         <br />&#160;&#160; It will register SPN &quot;http/daserver&quot; for computer &quot;daserver1&quot;         <br />setspn -D http/daserver daserver1         <br />&#160;&#160; It will delete SPN &quot;http/daserver&quot; for computer &quot;daserver1&quot;         <br />setspn -F -S http/daserver daserver1         <br />&#160;&#160; It will register SPN &quot;http/daserver&quot; for computer &quot;daserver1 if no such SPN exists in the forest        <br />setspn -U -A http/daserver dauser         <br />&#160;&#160; It will register SPN &quot;http/daserver&quot; for user account &quot;dauser&quot;         <br />setspn -T * -T foo -X        <br />&#160;&#160; It will report all duplicate registration of SPNs in this domain and foo        <br />setspn -T foo -F -Q */daserver        <br />&#160;&#160; It will find all SPNs of the form */daserver registered in the forest to which foo belongs</em></strong></p>  <p>A little bit longer than the old list, huh?&#160; :)</p>  <p>To be honest, I am still trying to figure out how to use the various new switches (and I cannot find any good documentation online).&#160; However, the <em>–x</em> parameter caught my eye and indeed saved me a bunch of time the other day.</p>  <p>I had a customer who had started with using one service account and then changed their mind midway (or at least that is what we figured out after the fact :)).&#160; No big deal, but they didn’t keep track of which SPNs they had already created.&#160; Needless to say, we ended up with a bunch of duplicates.</p>  <p>Now comes the cool part.&#160; All we had to do was run “setspn –x” from the command-line.&#160; The output took about three minutes to generate, but the resulting list showed up exactly what duplicates we had.&#160; As soon as my customer saw that list, they remembered they had started out with another account.&#160; Life was easy after that…</p>]]></content:encoded>
    </item>
    <item>
      <title>UnsupportedClassVersionError – huh?!</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/unsupportedclassversionerror-huh</link>
      <pubDate>Sun, 02 Aug 2009 18:59:56 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/08/02/unsupportedclassversionerror-huh/</guid>
      <description><![CDATA[I was recently doing some testing with the new SQL Server 2005 v2.0 JDBC driver and couldn’t get the...]]></description>
      <content:encoded><![CDATA[<p>I was recently doing some testing with the new <a href="https://msdn.microsoft.com/en-us/library/ms378749.aspx" target="_blank">SQL Server 2005 v2.0 JDBC driver</a> and couldn’t get the code to run.&nbsp; Now, as anybody who does Java development in a text editor like myself knows, it is pretty easy to get the wrong CLASSPATH going if you occasionally work with different JDBC driver versions.&nbsp; </p> <p>So, I immediately checked my CLASSPATH, figuring I had a typo somewhere in there.&nbsp; However, I was surprised to find that it was correct.&nbsp; So why the heck was I getting a CLASSPATH error?&nbsp; Then, I looked closer at the error and realized it was not <strong>ClassNotFoundException</strong>, but instead was <strong>UnsupportedClassVersionError</strong>.&nbsp; What the heck?&nbsp; I have been supporting JDBC for more than four year now and I didn’t recall every seeing that before!&nbsp; So, I started looking at what had changed on my machine.&nbsp; </p> <p>After poking around a little, I remembered I had just rebuilt my machine a few weeks back.&nbsp; However, I didn’t remember installing a JVM.&nbsp; Yet, somehow I was able to run Java and Javac, so that meant some application had installed the JDK.&nbsp; But what version was installed?</p> <p>A quick jump out to a command prompt and a “javac –version” showed that I was running the 1.4 version of the JDK.&nbsp; 1.4?!&nbsp; That version of the JVM is <a href="https://msdn.microsoft.com/en-us/library/ms378422.aspx" target="_blank">not supported</a> by the 2.0 JDBC driver!</p> <p>Just to confirm my suspicions, I wired up a quick batch file and ran some of my stock Java connectivity test code:</p> <p>Here’s the batch file:</p><pre class="csharpcode">@echo off 

echo Confirm we have the ClassPath set to the 2.0 driver
Set CLASSPATH=.;C:\JDBC\sqljdbc_2.0\enu\sqljdbc.jar
set classpath 

echo.
echo.
echo Confirm we have the 1.5 JDK
C:\j2sdk1.5\bin\java -version 

echo.
echo.
echo Compile and run the sample code with 1.5
C:\j2sdk1.5\bin\javac MSversion.java
C:\j2sdk1.5\bin\java MSversion 

echo.
echo.
echo Confirm we have the 1.4 JDK
C:\j2sdk1.4.2_19\bin\java -version 

echo.
echo.
echo Now, compile and run the sample code with 1.4
C:\j2sdk1.4.2_19\bin\javac MSversion.java
C:\j2sdk1.4.2_19\bin\java MSversion
</pre>
<p>and here’s the Java code:</p><pre class="csharpcode">import java.*;
import java.sql.*;
import java.util.*;
import java.text.*;

<span class="kwrd">class</span> MSversion
{
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) throws Exception
    {
        <span class="rem">// Load the JDBC driver</span>
        Class.forName(<span class="str">"com.microsoft.sqlserver.jdbc.SQLServerDriver"</span>);
        <span class="rem">// Connect to SQL Server</span>
        Connection conn = <span class="kwrd">null</span>;
        String url = <span class="str">"jdbc:sqlserver://myserver;DatabaseName=master;"</span>;

        <span class="rem">// Process the command line input</span>
        <span class="kwrd">if</span> (args.length == 0)
        {
            <span class="rem">//  Connect with default id/password</span>
            conn = DriverManager.getConnection(url, <span class="str">"username"</span>, <span class="str">"password"</span>);
            <span class="rem">//conn = DriverManager.getConnection(url);</span>
        }
        <span class="kwrd">else</span> <span class="kwrd">if</span> (args.length == 2)
        {
            <span class="rem">// Connect with user-provided username and password</span>
            String userName = args[0];
            String password = args[1];
            conn = DriverManager.getConnection(url, userName, password);
        }
        <span class="kwrd">else</span> <span class="kwrd">if</span> (args.length == 3)
        {
            <span class="rem">// Connect with user-provided username and password and url</span>
            String userName = args[0];
            String password = args[1];
            url= args[2];
            conn = DriverManager.getConnection(url, userName, password);
        }
        <span class="kwrd">else</span>
        {
            <span class="rem">// Invalid command -&gt; throw an exception</span>
            <span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"\nUsage: java version [userName password]\n"</span>);
        }

        <span class="rem">// Driver information</span>
        DatabaseMetaData dm = conn.getMetaData();
        System.<span class="kwrd">out</span>.println(<span class="str">"Connected to "</span> + dm.getURL());
        System.<span class="kwrd">out</span>.println(<span class="str">"Driver Information"</span>);
        System.<span class="kwrd">out</span>.println(<span class="str">"\tDriver Name:    "</span> + dm.getDriverName());
        System.<span class="kwrd">out</span>.println(<span class="str">"\tDriver Version: "</span> + dm.getDriverVersion());
        System.<span class="kwrd">out</span>.println(<span class="str">"\tDatabase Major Version: "</span> + dm.getDatabaseMajorVersion());
        System.<span class="kwrd">out</span>.println(<span class="str">"\tDatabase Minor Version: "</span> + dm.getDatabaseMinorVersion());
        System.<span class="kwrd">out</span>.println();

        <span class="rem">// Cleanup</span>
        dm=<span class="kwrd">null</span>;
        conn.close();
        conn=<span class="kwrd">null</span>;
    }
}</pre>
<p>Lastly, here’s the output:</p>
<blockquote><pre class="csharpcode">Confirm we have the ClassPath set to the 2.0 driver
CLASSPATH=.;C:\JDBC\sqljdbc_2.0\enu\sqljdbc.jar 

Confirm we have the 1.5 JDK
java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_19-b02, mixed mode) 

Compile and run the sample code with 1.5
Connected to jdbc:sqlserver://myserver:1433;xopenStates=false;trustServerCertificate=false;
sendStringParametersAsUnicode=true;selectMethod=direct;responseBuffering=adaptive;
packetSize=8000;loginTimeout=15;lockTimeout=-1;lastUpdateCount=true;encrypt=false;
disableStatementPooling=true;databaseName=master;applicationName=Microsoft SQL Server JDBC Driver;
Driver Information
    Driver Name:    Microsoft SQL Server JDBC Driver 2.0
    Driver Version: 2.0.1803.100
    Database Major Version: 9
    Database Minor Version: 0 

Confirm we have the 1.4 JDK
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Client VM (build 1.4.2_19-b04, mixed mode) 

Now, compile and run the sample code with 1.4
java.lang.<strong><em><font color="#ff0000" size="2">UnsupportedClassVersionError</font></em></strong>: com/microsoft/sqlserver/jdbc/SQLServerDriver 
(Unsupported major.minor version 49.0)
    at java.lang.ClassLoader.defineClass0(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:141)
    at MSversion.main(MSversion.java:11)
Exception in thread "main" 


</pre>
<p>
<p></p></blockquote>
<p>At this point, I knew all I had to do was point my PATH to either the 1.5 or 1.6 JDK and I should be fine.&nbsp; </p>]]></content:encoded>
    </item>
    <item>
      <title>GZIP Compression and Reporting Services</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/gzip-compression-and-reporting-services</link>
      <pubDate>Sun, 19 Jul 2009 15:45:35 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/07/19/gzip-compression-and-reporting-services/</guid>
      <description><![CDATA[I recently ran into a surprising limitation in Reporting Services.&nbsp; I say surprising because I...]]></description>
      <content:encoded><![CDATA[<p>I recently ran into a surprising limitation in Reporting Services.&nbsp; I say surprising because I honesty didn’t know it was a limitation, not because I am surprised at the limitation.&nbsp; It also turns out that this limitation is unfortunately not documented in the Reporting Services documentation.</p> <p>GZIP (see the Other Uses section of <a title="https://en.wikipedia.org/wiki/Gzip" href="https://en.wikipedia.org/wiki/Gzip">https://en.wikipedia.org/wiki/Gzip</a>) is a standard mechanism for compressing streams between IIS and a client.&nbsp; Turning it on at the IIS level is as simple as using adsutil.vbs (<a href="https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/25d2170b-09c0-45fd-8da4-898cf9a7d568.mspx?mfr=true">see the IIS documentation</a>).&nbsp; Most modern browsers add the <em>Accept-Encoding: gzip, deflate</em> header since they can properly decompress the stream from IIS.</p> <p>This is where the problem comes in for Reporting Services (SSRS).&nbsp; SSRS does all of its interaction with its web service component through the ReportViewer control (even from within Report Manager).&nbsp; There are both WinForms and WebForms version of the control, but they are basically the same.&nbsp; Unfortunately, neither of the controls knows how to decompress the HTML stream that comes back from a GZIP-compressed IIS instance.&nbsp; That means you will get an error similar to:</p> <p><em><strong>Response is not well-formed XML. ''. hexadecimal value 0x1FR, is an invalid character. Line 1, position 1.</strong></em></p> <p>Bummer, huh?</p> <p>At this point, there is no solution for this problem.&nbsp; However, change requests have been put in to enable this feature in future releases of Reporting Services.&nbsp; This would like mean that, not only would the ReportViewer controls be able to decompress the stream, but the ReportServer web service would be able to compress the stream (remember – post-SSRS 2005, SSRS has no dependency on IIS, so cannot rely on IIS’ built-in capabilities).</p>]]></content:encoded>
    </item>
    <item>
      <title>Waaay more connections than necessary</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/waaay-more-connections-than-necessary</link>
      <pubDate>Sun, 05 Apr 2009 21:49:40 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2009/04/05/waaay-more-connections-than-necessary/</guid>
      <description><![CDATA[We had a dump where we got a .NET OutofMemory exception.&nbsp;&nbsp; The ASP.NET folks looked at the...]]></description>
      <content:encoded><![CDATA[<p>We had a dump where we got a .NET OutofMemory exception.&nbsp;&nbsp; The ASP.NET folks looked at the dump and saw a large number of rooted TDS objects.&nbsp; I wasn't sure where those were coming from, so pulled up the dump to evaluate this. <p>0:033&gt; !dumpheap -stat<br>...<br>0x65400574&nbsp;&nbsp; <font color="#ff0000">11,959</font>&nbsp;&nbsp;&nbsp; 1,339,408 System.Data.SqlClient.SqlConnectionString<br>0x654049c0&nbsp;&nbsp; <font color="#ff0000">11,959</font>&nbsp;&nbsp;&nbsp; 1,482,916 System.Data.SqlClient.TdsParser<br>0x65405fdc&nbsp;&nbsp; 11,958&nbsp;&nbsp;&nbsp; 1,530,624 System.Data.SqlClient._SqlMetaData<br>0x65404744&nbsp;&nbsp; <font color="#ff0000">11,959</font>&nbsp;&nbsp;&nbsp; 1,674,260 System.Data.SqlClient.SqlInternalConnectionTds<br>0x79101fe4&nbsp;&nbsp; 36,452&nbsp;&nbsp;&nbsp; 2,041,312 System.Collections.Hashtable<br>0x65404dec&nbsp;&nbsp; 11,959&nbsp;&nbsp;&nbsp; 2,248,292 System.Data.SqlClient.TdsParserStateObject<br>0x7910be50&nbsp; 206,356&nbsp;&nbsp;&nbsp; 2,476,272 System.Boolean<br>0x65400808&nbsp; 233,910&nbsp;&nbsp;&nbsp; 4,678,200 System.Data.Common.NameValuePermission<br>0x65400b64&nbsp; 221,950&nbsp;&nbsp;&nbsp; 5,326,800 System.Data.Common.NameValuePair<br>0x7912d8f8&nbsp; 257,690&nbsp;&nbsp;&nbsp; 5,741,720 System.Object[]<br>0x000df590&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 175&nbsp;&nbsp; 10,314,064&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Free<br>0x7912d9bc&nbsp;&nbsp; 36,461&nbsp;&nbsp; 13,194,048 System.Collections.Hashtable+bucket[]<br>0x790fd8c4&nbsp; 493,301&nbsp;&nbsp; 34,033,216 System.String<br>0x7912dae8&nbsp;&nbsp; 48,478&nbsp; 192,431,300 System.Byte[]<br>Total 1,994,862 objects, Total size: 290,427,832 <p>Notice any pattern?&nbsp; 11959 seems to be pretty repetitive.&nbsp; I&nbsp; especially don't understand why we have almost 12000 internal connections unless.... <p>Yep - customer is not pooling!! <p>First, dump out the method table for the System.Data.SqlClient.SqlConnectionString <p>0:033&gt; !dumpheap -mt 0x65400574  <p>This produces a ridiculously large (11,959 members!) list of SqlConnectionStrings.&nbsp; So, let's dump out one at random: <p>0:033&gt;&nbsp; !do 0x2e016064 <br>Name: System.Data.<font color="#ff0000">SqlClient.SqlConnectionString</font><br>MethodTable: 65400574<br>EEClass: 6544c6c0<br>Size: 112(0x70) bytes<br>GC Generation: 2<br> (C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll)<br>Fields:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Field&nbsp;&nbsp; Offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type VT&nbsp;&nbsp;&nbsp;&nbsp; Attr&nbsp;&nbsp;&nbsp; Value Name<br>790fd8c4&nbsp; 4000bce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance <strong>2e015e50</strong> _usersConnectionString <p>And then keep drilling into him... <p>0:033&gt; !do <strong>2e015e50</strong><br>Name: System.String <p>String: Data Source=cpsrv;Initial Catalog=Changepoint;Integrated Security=False;User ID=xxxxx;Password=yyyyy;Enlist=False;<font color="#ff0000">Pooling=False</font>;Asynchronous Processing=True;<font color="#ff0000">Application Name=SqlQueryNotificationService-ac370dde-d9c4-4cbe-9d82-7d7a8df159c6</font> <p>Let's do another one, too <p>0:033&gt; !do 0x2c5b9aa8 <br>Name: System.Data.<font color="#ff0000">SqlClient.SqlConnectionString</font><br>MethodTable: 65400574<br>EEClass: 6544c6c0<br>Size: 112(0x70) bytes<br>GC Generation: 2<br> (C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll)<br>Fields:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Field&nbsp;&nbsp; Offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type VT&nbsp;&nbsp;&nbsp;&nbsp; Attr&nbsp;&nbsp;&nbsp; Value Name<br>790fd8c4&nbsp; 4000bce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance <strong>2c5b9894</strong> _usersConnectionString <p>0:033&gt; !do <strong>2c5b9894</strong><br>Name: System.String<br>MethodTable: 790fd8c4<br>EEClass: 790fd824<br>Size: 530(0x212) bytes<br>GC Generation: 2<br> (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)<br>String: Data Source=cpsrv;Initial Catalog=Changepoint;Integrated Security=False;User ID=xxxx;Password=yyyy;Enlist=False;<font color="#ff0000">Pooling=False</font>;Asynchronous Processing=True;<font color="#ff0000">Application Name=SqlQueryNotificationService-78b81d9b-ecd9-400d-8435-6e745d449c96</font> <p>Note that in both cases, the connection string has Pooling=False and an application name that has a GUID.&nbsp; Either one of these will prevent good use of connection pooling.&nbsp; <p>The customer needs to turn pooling on, plus eliminate the GUID from the Application Name.</p>]]></content:encoded>
    </item>
    <item>
      <title>Checkin’ those components!!</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/checkin-those-components</link>
      <pubDate>Sun, 21 Dec 2008 20:49:19 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2008/12/21/checkin-those-components/</guid>
      <description><![CDATA[Well, it finally happened – Component Checker 2.0 was finally posted on Microsoft.com.&nbsp; I don’t...]]></description>
      <content:encoded><![CDATA[<p>Well, it finally happened – Component Checker 2.0 was finally <a href="https://www.microsoft.com/downloads/details.aspx?FamilyID=8f0a8df6-4a21-4b43-bf53-14332ef092c9&amp;displaylang=en&amp;Hash=EyyMl54jcAFRJriTOUNo62Ik1YJr17PcJE%2fwXyMxKDO%2fWb05%2f5fkz22RCrwxkHHPa72kIIkPREcXUsM0jsjPSQ%3d%3d">posted</a> on Microsoft.com.&nbsp; I don’t know that the actual functionality is earth shattering, but it is nice to finally see it out there.</p> <p>“What is Component Checker?” and “Why should I care it was updated?” are probably right on the tip of your tongue.&nbsp; Wait for it, wait for it…</p> <p>OK, no more teasing – Component Checker is a tool that can be used to check the state of your Microsoft Data Access Components (affectionately known as “MDAC” by those who deal with it) installation.&nbsp; These components are used by all native applications to talk to various types of databases and are basically required parts of any client/server application that involves a database as the server component.&nbsp; If you want to see exactly what turning of one of the core parts of MDAC does to your system, follow the workaround of unregistering OLEDB32 from <a href="https://www.microsoft.com/technet/security/bulletin/ms08-078.mspx">MS08-078</a>.&nbsp; Good luck trying to do anything functional with data of any type!</p> <p>The cool thing about the newest release of Component Checker is that is can be used to check every OS installation in existence that might have a bad MDAC installation.&nbsp; This includes all the variants of XP, 2003, and 2000 (2008 and Vista are left off this list intentionally since it is almost impossible to corrupt their data access stack).&nbsp; All you have to do is run Component Checker, select “Perform analysis against a selected version” and the select your version of Windows.</p> <p>You should get something that looks like this: </p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/CC2.jpg" original-url="https://blogs.msdn.com/blogfiles/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/CC2.jpg"><img title="CC2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="CC2" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/CC2_thumb.jpg" original-url="https://blogs.msdn.com/blogfiles/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/CC2_thumb.jpg" width="244" border="0"></a> </p> <p></p> <p></p> <p>If you installation is clean, you will see nothing but matches above.&nbsp; </p> <p>So, you might ask, why do I have mismatches above?&nbsp; Well, for that, I go back to the reference to MS08-078 above.&nbsp; Component Checker is not smart enough to know that files that are LATER than the ones it is checking for are OK.&nbsp;&nbsp; Unfortunately, due to the bad guys out there these days, it is pretty common to find later versions of the various binaries pushed out via Windows Update.</p> <p>However, it is still pretty easy to check your installation.&nbsp; Just look to make sure that the Mismatch Fields column has a version number less than the Version field:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/cc2-a.jpg" original-url="https://blogs.msdn.com/blogfiles/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/cc2-a.jpg"><img title="cc2-a" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="26" alt="cc2-a" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/cc2-a_thumb.jpg" original-url="https://blogs.msdn.com/blogfiles/evanbasalik/WindowsLiveWriter/Checkinthosecomponents_12077/cc2-a_thumb.jpg" width="255" border="0"></a></p> <p>(click on the image above for a larger view)</p> <p>As you can see above, Component Checker is looking for 2.81.1117 and I have 2.81.1135 (MSADCE) and 2.81.1124 (MSADCO).&nbsp; Good to go!</p>]]></content:encoded>
    </item>
    <item>
      <title>BOGO(HO)</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/bogoho</link>
      <pubDate>Tue, 16 Dec 2008 22:24:00 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2008/12/16/bogoho/</guid>
      <description><![CDATA[OK, so I always said that I would never use my blog for a rant, but I have finally reached my limit...]]></description>
      <content:encoded><![CDATA[<P>OK, so I always said that I would never use my blog for a rant, but I have finally reached my limit after seeing a number of the attempts on retailers to get me to spend my money during this downturn.</P>
<P>Since when has BOGO (Buy One, Get One) become BOGO<U><EM><FONT color=#008000 size=1>HO</FONT></EM></U> (Buy One, Get One <EM><U><FONT color=#008000>Half Off</FONT></U></EM>)?&nbsp; Now, in all honesty, my local grocery store still does BOGO.&nbsp; In fact, this past weekend, they did Buy One, Get Two Free.&nbsp; Needless to say, I now have a lot of ice cream in my freezer!&nbsp; </P>
<P>However, I see more and more retail stores advertising BOGO, but doing BOGO<U><EM><FONT color=#008000 size=1>HO</FONT></EM></U><FONT size=1><U><EM></EM></U>.&nbsp; </FONT>Talk about false advertising!!&nbsp; I know, I know – they do have some sort of text or disclaimer that explains that BOGO is really BOGO<U><EM><FONT color=#008000 size=1>HO</FONT></EM></U>, but that is generally in small text.&nbsp; The really <FONT size=5>BIG</FONT> text says BOGO.</P>
<P>Sigh…</P>]]></content:encoded>
    </item>
    <item>
      <title>What the heck is a Microsoft-hosted service?!?!!</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/what-the-heck-is-a-microsoft-hosted-service</link>
      <pubDate>Sun, 23 Nov 2008 15:01:00 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2008/11/23/what-the-heck-is-a-microsoft-hosted-service/</guid>
      <description><![CDATA[With the recent public CTP of Azure, there has been a lot of confusion (both internally and...]]></description>
      <content:encoded><![CDATA[<P>With the recent public CTP of Azure, there has been a lot of confusion (both internally and externally) about what each service is supposed to do.&nbsp; Here’s my summary of some internal conversations along that line:</P>
<TABLE class="" cellSpacing=0 cellPadding=2 width=400 border=1>
<TBODY>
<TR>
<TD class="" vAlign=top width=200><STRONG>Name</STRONG></TD>
<TD class="" vAlign=top width=200><STRONG>Description</STRONG></TD></TR>
<TR>
<TD class="" vAlign=top width=200>SQL Data Services (SDS)</TD>
<TD class="" vAlign=top width=200>An internet facing data service formerly known as “SQL Server Data Services” or SSDS.&nbsp; SDS will be a rich relational data service offering DaaS (database as a service) to web and enterprise developers.</TD></TR>
<TR>
<TD class="" vAlign=top width=200>ADO.Net Data Services (Astoria)</TD>
<TD class="" vAlign=top width=200>A framework that is used to publish an EDM (entity data model view) to the web using RESTful web services protocols.&nbsp;&nbsp; SDS will support this for data access across the web. </TD></TR>
<TR>
<TD class="" vAlign=top width=200>Windows Azure Storage</TD>
<TD class="" vAlign=top width=200>A scalable storage system providing basic block and tabular storage, and simple query.&nbsp;&nbsp; </TD></TR>
<TR>
<TD class="" vAlign=top width=200>Windows Azure Compute</TD>
<TD class="" vAlign=top width=200>A hosting service for running managed code (and eventually VMs) in the Cloud fabric.&nbsp;&nbsp; </TD></TR>
<TR>
<TD class="" vAlign=top width=200>Azure</TD>
<TD class="" vAlign=top width=200>The marketing brand for Windows Azure, .Net Services, Live Services and SQL Services</TD></TR></TBODY></TABLE>
<P>The other key question that I see constantly is “What is the difference between SDS and Azure Storage?&nbsp; They both store blobs…”.</P>
<P>The truthful answer to that is there is not much functional difference between them right now.&nbsp; The key is to look down the road.&nbsp; SDS’ stated goal is to add more and more database-type functionality.&nbsp; This means that you will start seeing SQL Server-type functionality added over time.&nbsp; In theory, you will eventually be able to just use SDS for your database instead of an instance of SQL Server.&nbsp; Obviously, that is waaaaaaay down the road, but you have to start somewhere!</P>
<DIV class=wlWriterEditableSmartContent id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ed70763c-8c54-4048-be17-fae7ca658492 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">Technorati Tags: <A href="https://technorati.com/tags/SDS" rel=tag mce_href="https://technorati.com/tags/SDS">SDS</A>,<A href="https://technorati.com/tags/SSDS" rel=tag mce_href="https://technorati.com/tags/SSDS">SSDS</A>,<A href="https://technorati.com/tags/Azure" rel=tag mce_href="https://technorati.com/tags/Azure">Azure</A>,<A href="https://technorati.com/tags/CloudDB" rel=tag mce_href="https://technorati.com/tags/CloudDB">CloudDB</A></DIV>]]></content:encoded>
    </item>
    <item>
      <title>Who Am I?</title>
      <link>https://docs.microsoft.com/archive/blogs/evanbasalik/who-am-i</link>
      <pubDate>Sun, 02 Nov 2008 19:25:49 GMT</pubDate>
      <dc:creator><![CDATA[Evan Basalik]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/evanbasalik/2008/11/02/who-am-i/</guid>
      <description><![CDATA[I work in CSS for Microsoft.&nbsp; My team supports almost everything related to SQL Server that is...]]></description>
      <content:encoded><![CDATA[<p>I work in CSS for Microsoft.&nbsp; My team supports almost everything related to SQL Server that is not internal to core Engine functionality.&nbsp; That means we own things like SSIS, SSRS, ADO, ADO.NET.</p> <p>Personally, I specialize in JDBC and SSRS.</p> <p>Oh yeah – due to an oddity of the organizational structure of our Development teams, we also support XML.&nbsp; :)</p>]]></content:encoded>
    </item>
  </channel>
</rss>