<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://ehs-it.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jean Hibbert&amp;#39;s Blog : Open Source, SQL</title><link>http://ehs-it.net/blogs/jeanhibbert/archive/tags/Open+Source/SQL/default.aspx</link><description>Tags: Open Source, SQL</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>SubSonic vs Nettiers</title><link>http://ehs-it.net/blogs/jeanhibbert/archive/2008/09/23/subsonic-vs-nettiers.aspx</link><pubDate>Mon, 22 Sep 2008 20:52:00 GMT</pubDate><guid isPermaLink="false">0ddf0d15-823b-4029-9394-97ce4106560f:27</guid><dc:creator>jean</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ehs-it.net/blogs/jeanhibbert/rsscomments.aspx?PostID=27</wfw:commentRss><comments>http://ehs-it.net/blogs/jeanhibbert/archive/2008/09/23/subsonic-vs-nettiers.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve recently been working extensively with 2 ORMS. Subsonic and Nettiers. Both really good ORMS. My favourite though without a doubt is Subsonic written and designed by &lt;a href="http://blog.wekeroad.com/blog/microsoft-subsonic-and-me/" title="Rob Connery&amp;#39;s blog" target="_blank"&gt;Rob Connery&lt;/a&gt; who just coincidentally now works for the ASP.NET team at Microsoft.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Reasons I like Subsonic:&lt;/p&gt;&lt;p&gt;1. Its extremely lightweight. It creates stored procedure objects that return readers or datasets.&lt;/p&gt;&lt;p class="MsoNormal"&gt;eg.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/span&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt;
System.Data.&lt;span style="color:teal;"&gt;DataSet&lt;/span&gt;
GetItemTypesForClientTypeSysID(&lt;span style="color:blue;"&gt;int&lt;/span&gt;
clienttypesysid, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; bIsBatch)&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:teal;"&gt;StoredProcedure&lt;/span&gt;
sp = &lt;span style="color:teal;"&gt;SPs&lt;/span&gt;.ProcSelectItemsForClientType(clienttypesysid,
bIsBatch);&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt;
sp.GetDataSet();&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size:8pt;"&gt;&lt;/span&gt;&lt;/p&gt;

&amp;nbsp;&lt;p&gt;2. You can write queries in your code that can do most things including using the SQL where / ordering and only selecting specific columns.&lt;/p&gt;&lt;p class="MsoNormal"&gt;eg&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/span&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;
GetClientTypeSysIDFromDesc(&lt;span style="color:blue;"&gt;string&lt;/span&gt;
clienttypedesc)&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;
tempID = 0;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:teal;"&gt;Query&lt;/span&gt;
query = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;Query&lt;/span&gt;(&lt;span style="color:teal;"&gt;TblClientType&lt;/span&gt;.Schema.TableName);&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;query.SelectList = &lt;span style="color:teal;"&gt;TblClientType&lt;/span&gt;.&lt;span style="color:teal;"&gt;Columns&lt;/span&gt;.Sysid;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;query.AddWhere(&lt;span style="color:teal;"&gt;TblClientType&lt;/span&gt;.&lt;span style="color:teal;"&gt;Columns&lt;/span&gt;.ClientTypeDesc, &lt;span style="color:teal;"&gt;Comparison&lt;/span&gt;.Equals,
clienttypedesc);&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;query.QueryType = &lt;span style="color:teal;"&gt;QueryType&lt;/span&gt;.Select;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;tempID = (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)query.ExecuteScalar();&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt;
tempID;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size:8pt;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;3. Its rediculously easy to set up. You need 1) Download the subsonic libraries, 2) Run the install so that VS will pick it up, and then 3) make an update the config file&amp;#39;s of the projects which will be using the ORM. Obviously you need to reference the subsonic libraries also.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Reasons I like Nettiers.&lt;/p&gt;&lt;p&gt;1.&amp;nbsp; The &lt;a href="http://nettiers.com/Introduction.ashx#ServiceLayer_11"&gt;documentation&lt;/a&gt; is pretty good.&lt;/p&gt;&lt;p&gt;2. Setting up nettiers is also straight forward. 1) Download the templates Codesmith Templates, 2) BUY a copy of codesmith and generate the ORM layer.&lt;/p&gt;&lt;p&gt;The Nettiers templates are written by the author of codesmith.... This.... in my opinion is a sales stunt although any intermediate programmer should use codesmith anyway. It&amp;#39;s and awesome template based code generation tool.&lt;/p&gt;&lt;p&gt;3. You can perform DeepSave and DeepLoad actions where you are able to save and load object trees based on relational database mappings.&lt;/p&gt;&lt;p&gt;4. You are able to create a web services layer. With some tinkering you can expose this layer as a WCF service and thus create middle-tier DAL that is accessible using your protocol/security strategy (aka Binding) of choice.&lt;/p&gt;&lt;p&gt;5. Nettiers also has its own cuncurrency functionality built in assuming that all the database tables used to generate the ORM have a timestamp field.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;/u&gt; Nettiers does generate a lot of code though, and if you don&amp;#39;t use the custom TList collection object (which doesn&amp;#39;t lend itself well to databinding) you won&amp;#39;t be able to deepsave and deepload. Hopefully this will be fixed in later versions of nettiers.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Jean &lt;br /&gt;&lt;/p&gt;&lt;img src="http://ehs-it.net/aggbug.aspx?PostID=27" width="1" height="1"&gt;</description><category domain="http://ehs-it.net/blogs/jeanhibbert/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://ehs-it.net/blogs/jeanhibbert/archive/tags/SQL/default.aspx">SQL</category><category domain="http://ehs-it.net/blogs/jeanhibbert/archive/tags/.Net+Framework+2.0/default.aspx">.Net Framework 2.0</category></item></channel></rss>