<?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>Daniele Demichelis &#187; db</title>
	<atom:link href="http://www.danidemi.com/mainwww/tag/db/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danidemi.com/mainwww</link>
	<description>There are 10 types of people in the world: Those who understand binary, and those who don&#039;t...</description>
	<lastBuildDate>Wed, 14 Apr 2010 08:14:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Database testing with Mono and NUnit</title>
		<link>http://www.danidemi.com/mainwww/2010/03/database-testing-with-mono-and-nunit/</link>
		<comments>http://www.danidemi.com/mainwww/2010/03/database-testing-with-mono-and-nunit/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 16:03:37 +0000</pubDate>
		<dc:creator>danidemi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[integration testing]]></category>

		<guid isPermaLink="false">http://www.danidemi.com/mainwww/?p=107</guid>
		<description><![CDATA[A class to set the database in a well know status before running an integration [...]]]></description>
			<content:encoded><![CDATA[<p>In these days I&#8217;m trying to rewrite an old application using Mono.<br />
I&#8217;m currently a newbie about Mono and the .Net world, but I happily noticed that the Mono environment come with a bundled interface to NUnit, so I can keep on writing tests as I&#8217;m slowly but steadily getting used to.<br />
After having put together a bunch of classes and relative and unit tests, it was time to write the first integration test. I needed to put the development database in a known state before running the test, so I came up with the following class, that I&#8217;d like to share with you.</p>
<div class="geshi no csharp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>.<span class="me1">Collections</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> NUnit.<span class="me1">Framework</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>.<span class="me1">IO</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>.<span class="me1">Data</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>.<span class="me1">Data</span>.<span class="me1">SqlClient</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">namespace</span> TellItMailer<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">public</span> <span class="kw4">class</span> TestDbSetup<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">public</span> <span class="kw1">void</span> SetUpDbForTest<span class="br0">&#40;</span><span class="kw4">object</span> test<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw4">String</span> path <span class="sy0">=</span> test.<span class="me1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">FullName</span> <span class="sy0">+</span> <span class="st0">&quot;.sql&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;path <span class="sy0">=</span> path.<span class="me1">Replace</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="kw1">Namespace</span> <span class="sy0">+</span> <span class="st0">&quot;.&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;path <span class="sy0">=</span> <span class="st0">&quot;/home/danidemi/workspace/TellItMailer/Tests/&quot;</span> <span class="sy0">+</span> path;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">//Read the script</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw4">String</span> script <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">using</span> <span class="br0">&#40;</span>StreamReader sr <span class="sy0">=</span> File.<span class="me1">OpenText</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">string</span> s <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>s <span class="sy0">=</span> sr.<span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;script <span class="sy0">=</span> script <span class="sy0">+</span> s;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw4">string</span> connectionString <span class="sy0">=</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Server=192.168.75.128<span class="es0">\\</span>SQLEXPRESS;&quot;</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Database=TellIt_test;&quot;</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;User ID=user;&quot;</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Password=password;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDbConnection dbcon;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">using</span><span class="br0">&#40;</span>dbcon <span class="sy0">=</span> <span class="kw3">new</span> SqlConnection<span class="br0">&#40;</span>connectionString<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; dbcon.<span class="me1">Open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">using</span> <span class="br0">&#40;</span>IDbCommand dbcmd <span class="sy0">=</span> dbcon.<span class="me1">CreateCommand</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dbcmd.<span class="me1">CommandText</span> <span class="sy0">=</span> script;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;dbcmd.<span class="me1">ExecuteNonQuery</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s quite useful. Essentially this class loads a SQL script file whose name is the same of the test class, and execute it.<br />
In this way you have for example a TestFeature.cs file alongside a TestFeature.sql file. Nice if your IDE shows files sorted alphabetically.<br />
I found that the best place to use the class is inside the SetUp marked method. In this way the SQL script is run before each test. Doing it in a local development environment is not so bad, since the scripts are executed at high speed.</p>
<p>So, this is an example of how a test that uses TestDbSetup looks like.</p>
<div class="geshi no csharp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> NUnit.<span class="me1">Framework</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> log4net;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">using</span> log4net.<span class="me1">Config</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">namespace</span> TellItMailer <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#91;</span>TestFixture<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">public</span> <span class="kw4">class</span> IntegrationTest <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>SetUp<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">public</span> <span class="kw1">void</span> SetUp<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">new</span> TestDbSetup<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">SetUpDbForTest</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>Test<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">public</span> <span class="kw1">void</span> TestCase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;BasicConfigurator.<span class="me1">Configure</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Pretty useful, IMHO.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danidemi.com/mainwww/2010/03/database-testing-with-mono-and-nunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails ans SQLite3 on Ubuntu</title>
		<link>http://www.danidemi.com/mainwww/2009/12/rails-ans-sqlite3-on-ubuntu/</link>
		<comments>http://www.danidemi.com/mainwww/2009/12/rails-ans-sqlite3-on-ubuntu/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 10:06:37 +0000</pubDate>
		<dc:creator>danidemi</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.danidemi.com/mainwww/?p=90</guid>
		<description><![CDATA[<p>To configure a Rails application in order to use SQLite3 please follow the following steps:</p>
sudo apt-get install  sqlite3 swig libsqlite3-ruby libsqlite3-dev
 sudo gem install sqlite3-ruby
<p>Then create a Rails application as usual and update the environment.rb file in the following way</p>
Rails::Initializer.run do &#124;config&#124;
...
config.gem 'sqlite3-ruby', :lib =&#62; "sqlite3"
...
end
]]></description>
			<content:encoded><![CDATA[<p>To configure a Rails application in order to use SQLite3 please follow the following steps:</p>
<pre>sudo apt-get install  sqlite3 swig libsqlite3-ruby libsqlite3-dev
 sudo gem install sqlite3-ruby</pre>
<p>Then create a Rails application as usual and update the environment.rb file in the following way</p>
<pre>Rails::Initializer.run do |config|</pre>
<pre>...</pre>
<pre>config.gem 'sqlite3-ruby', :lib =&gt; "sqlite3"</pre>
<pre>...</pre>
<pre>end</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.danidemi.com/mainwww/2009/12/rails-ans-sqlite3-on-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Affidabilità dei sistemi informatici bancari</title>
		<link>http://www.danidemi.com/mainwww/2009/11/affidabilita-dei-sistemi-informatici-bancari/</link>
		<comments>http://www.danidemi.com/mainwww/2009/11/affidabilita-dei-sistemi-informatici-bancari/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 23:17:02 +0000</pubDate>
		<dc:creator>danidemi</dc:creator>
				<category><![CDATA[Aneddoti Informatici]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[sviluppo]]></category>

		<guid isPermaLink="false">http://www.danidemi.com/mainwww/?p=34</guid>
		<description><![CDATA[<p>Stavo lavorando in una banca ad un porting verso tecnologie attuali di un sistema esistente da qualche anno. Nell’ambito di tale progetto dovevo realizzare un modulo del sistema il cui compito era sostanzialmente quello di estrarre da DB dei record con un campo data maggiore o uguale alla data di odierna, eseguire alcune elaborazioni e [...]]]></description>
			<content:encoded><![CDATA[<p>Stavo lavorando in una banca ad un porting verso tecnologie attuali di un sistema esistente da qualche anno. Nell’ambito di tale progetto dovevo realizzare un modulo del sistema il cui compito era sostanzialmente quello di estrarre da DB dei record con un campo data maggiore o uguale alla data di odierna, eseguire alcune elaborazioni e scriverli in un file da inviare ad un sistema a valle per una successiva elaborazione.</p>
<p>Il campo che conteneva la data era un campo CHAR di 8 caratteri e ci era stato assicurato che tutte le date erano nel formato YYYYMMDD. In questo modo per selezionare i record con una data maggiore di quella odierna si poteva sruttare l’ordinamento alfabetico e ad esempio scrivere una condizione del tipo</p>
<pre>data &gt;= '20052310'</pre>
<p>Facendo qualche test mi sono però accorto che in realtà nel db c’erano record con date nel formato DD/MM/YY. La condizione restituiva perciò anche record con valori pari ad esempio a “23/12/98″, “20/10/89″ ed in generale qualsiasi data il cui giorno fosse maggiore o uguale a 20. Questo perchè, in ordine strettamente alfabetico, “23/12/98″ segue “20052310″. I record che avrebbero dovuto essere stati estratti erano qualche decina, invece la presenza delle date nel formato inatteso, ne faceva salire il numero a qualche centinaio.</p>
<p>Dopo un consulto con un programmatore che lavorava alla manutenzione del sistema decidemmo di lasciare i dati scorretti sul DB ma eliminarli nella query di selezione. E quindi in dettaglio la condizione diventò&#8230;</p>
<pre>data &gt;= '20052310' AND data not like '__/__/__'</pre>
<p>Tutto sembrava andare per il meglio, il file contenente i risultati divenne molto più corto e l’elaborazione successiva ne avrebbe certamente giovato.</p>
<p>Mi pareva comunque strano come per i sette o otto anni precedenti il sistema a valle avesse elaborato ogni giorno centinaia di record inutili senza che sollevare il minimo problema.</p>
<p>In fase di test un file campione genenrato dal nuovo sistema doveva essere caricato dal sistema successivo. Il giorno del test ricevetti una telefonata ed il tecnico all’altro capo del filo mi disse che il test era fallito poichè alcuni record contenuti nel file non trovano riscontro nei dati di altre tabelle. Pronto ad affrontare una noiosissima sessione di debug mi accorsi che nel file prodotto non trovavo minimamente traccia dei record errati a cui si era riferito il tecnico.</p>
<p>Dopo una ricerca trovai i record incriminati nel file che era stato prodotto non dal nostro nuovo sistema ma dal vecchio sistema correntemente in produzione. Insomma, per una svista, il tecnico aveva sottoposto a test non il file prodotto dal nuovo sistema, ma quello prodotto quotidianamente, ormai da anni, dal sistema in produzione. E ci aveva trovato pure degli errori!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danidemi.com/mainwww/2009/11/affidabilita-dei-sistemi-informatici-bancari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
