<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Haugerns Development Escapades &#187; nhibernate</title>
	<atom:link href="http://www.haugern.net/blog/category/nhibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.haugern.net/blog</link>
	<description>Morten Haug on development and other curiosities</description>
	<lastBuildDate>Sun, 31 May 2009 21:56:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL Server CE up and running with NHibernate &amp; NAnt</title>
		<link>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/</link>
		<comments>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 22:32:34 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[compact edition]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[nant]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/</guid>
		<description><![CDATA[I&#8217;ve been working to get SQL CE to work with our application lately. This is a great step towards a more painless desktop deployment model for us.
It turned out to be a multi step process, and first out was discovering how to make a SQL CE file. 
Creating the SQL Server CE .sdf file
There are [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working to get SQL CE to work with our application lately. This is a great step towards a more painless desktop deployment model for us.</p>
<p>It turned out to be a multi step process, and first out was discovering how to make a SQL CE file. </p>
<h3>Creating the SQL Server CE .sdf file</h3>
<p>There are two alternatives as I see it:</p>
<ol>
<li>Create an empty database with ie SQL Enterprise Manager, and copy it for new deployment
<li><a href="http://blogs.msdn.com/stevelasker/archive/2007/03/31/creating-your-sql-server-compact-edition-database-and-schema-in-code.aspx" target="_blank">Create it programmatically at runtime</a>.</li>
</ol>
<p>We already have a solution folder and a setup for sql-script templates, so we went with #1.</p>
<h3>Using NHibernate hbm2ddl NAnt task for the schema</h3>
<p>NHibernate has built in support for SQL Server CE, and what you have to do is the following:</p>
<ol>
<li>Set the connection.connection_string property.
<li>Set the connection.driver_class property.
<li>Set the dialect property.</li>
</ol>
<p>Our current NAnt build file has had support for SQL Express 2005 &amp; SQL Developer Edition 2005, and our schema target have been doing a great job at creating the proper schema. The hbm2ddl task has been called with the following attributes:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">hbm2ddl
</span><span style="color: rgb(255,0,0)">   connectionstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.nhibernate.connection}</span>"
<span style="color: rgb(0,0,255)">   </span><span style="color: rgb(255,0,0)">droponly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">false</span>"
<span style="color: rgb(0,0,255)">   </span><span style="color: rgb(255,0,0)">exportonly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">true</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
   &lt;</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Domain.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Infrastructure.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Repository.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
   &lt;/</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">hbm2ddl</span><span style="color: rgb(0,0,255)">&gt;</span></font></pre>
<p>So I go ahead and set the connectionstring attribute <a href="http://www.connectionstrings.com/?carrier=sqlserver2005ce" target="_blank">with the correct settings</a>. And it fails miserably:</p>
<p><em>NHibernate.HibernateException: An error has occurred while establishing a connection to the server.&nbsp; When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 &#8211; Error Locating Server/Instance Specified) &#8212;&gt; System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server.&nbsp; When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 &#8211; Error Locating Server/Instance Specified)</em> </p>
<p>&nbsp;
<p>Ok, that&#8217;s not good. It seems it cannot connect to the server. Checking the ins and outs of the my <em>sql.nhibernate.connection</em> property, I find that it should be pointing to the right file. After some investigation I find out that I miss #2 &amp; #3; setting the correct dialect and driver_class. The hbm2ddl task had default values for dialect and driver_class which works great with both our previously two supported databases. So, I set them both like this:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">hbm2ddl
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connectionstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.nhibernate.connection}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">dialect</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.dialect}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">
  </span><span style="color: rgb(255,0,0)">connectiondriverclass</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.driver}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">
  </span><span style="color: rgb(255,0,0)">droponly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">false</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">exportonly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">true</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
  &lt;</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
</span></font><font size="2"><span style="color: rgb(0,0,255)">    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Domain.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Infrastructure.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Repository.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
  &lt;/</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">hbm2ddl</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font></span></pre>
<p>Where:</p>
<pre class="code"><font size="2"><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(163,21,21)">property</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">sql.driver</span>"<span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">NHibernate.Driver.SqlServerCeDriver</span>"</font><font size="2"><span style="color: rgb(0,0,255)"> /&gt;
&lt;</span><span style="color: rgb(163,21,21)">property</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">sql.dialect</span>"<span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">NHibernate.Dialect.MsSqlCeDialect</span>"<span style="color: rgb(0,0,255)">/&gt;</span></font></pre>
<p>And we&#8217;re there with the hbm2ddl. </p>
<p><strong>PS! Don&#8217;t forget to add the SQL CE dll into your folder with NAnt, or else it can&#8217;t find the right driver with the above settings (an easy to understand error message will tell you).</strong></p>
<h3>Populate the database with default data</h3>
<p>After the schema is in place, we populate some tables with default system data from sql script files. For this we use the <a href="http://nantcontrib.sourceforge.net/release/latest/help/tasks/sql.html" target="_blank">NAntContrib sql task</a> like this:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">sql
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.connectionstring}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimiter</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">GO</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimstyle</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">Line</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${target}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">transaction</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.usetransactions}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">sql</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font>
</span></pre>
<p>First, the <em>sql.connectionstring</em> needs to reflect that I am talking to a SQL CE database, and <a href="http://www.connectionstrings.com/?carrier=sqlserver2005ce" target="_blank">ConnectionStrings.com comes to the rescue once more</a>.</p>
<p>The first obstacle when running the first sql script file is this error:</p>
<p><em>Error while executing SQL statement.<br />&nbsp;&nbsp;&nbsp; There was an error parsing the query. [Token line number,Token line offset,,Token in error,,]</em> </p>
<p>Yes, very enlightening indeed! (Note to self: remember good error messages!). In my search for answers, this seems to be &#8220;the be all, know it all&#8221; error message.</p>
<p>Finally, it dawned upon me; SQL CE doesn&#8217;t support stored procs. And for that reason, why would it understand a script which practically could be a stored proc? Luckily, all our default data is inserted with &#8220;ordinary&#8221; statements, and the sql task does have an attribute called batch which defaults to true. With SQL CE you need to set it to false and you&#8217;re good to go with this setup (where the<em> sql.batch</em> property depends on which database is being used):</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">sql
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.connectionstring}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimiter</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">GO</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimstyle</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">Line</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${target}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">batch</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.batch}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">transaction</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.usetransactions}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">sql</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font>
</span></pre>
<p>&nbsp;</p>
<h3>Conclusion and further work</h3>
<p>All in all, the effort to investigate and include the SQL CE to our array of supported databases is well worth. It will make a one off deployment issues a lot easier with no extra installation, and it is a champ when it comes to our database unit testing and integration testing.</p>
<p>What&#8217;s still missing is a script which populates our database with test data. The existing script is not easily split into single statements. We&#8217;ll dig into it and I&#8217;ll explain it all in a later post!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
