<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>VistaDB .net database blog</title><link>http://www.vistadb.net/blog/</link><description>100% C# powered ado.net SQL engine</description><generator>Graffiti CMS 1.0 (build 1.0.1.963)</generator><lastBuildDate>Sat, 19 Jul 2008 02:40:00 GMT</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Vistadb" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Vistadb" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FVistadb" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Visit the VistaDB.Net forums for more discussions about database and dot net technology.</feedburner:browserFriendly><item><title>VistaDB 3.4 Build 63 Development</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/339543270/</link><pubDate>Sat, 19 Jul 2008 02:40:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/builds/vistadb-3-4-build-63-development/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/builds/">Builds</category><description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Build #63, 7/18/2008 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;NOTES&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We now have over 600 NUnit tests!&amp;nbsp; New tests are being added for SQL code syntax comparing to SQL CE and SQL Server.&amp;nbsp; Not all syntax will be added, but there are some changes on the way for sure.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The Data Migration Wizard has been changed to allow it to run on 64 bit Vista.&amp;nbsp; Simple fix.&amp;nbsp; The app was set to CPU Any - that meant it would JIT to 64 bit.&amp;nbsp; The problem is that the old VistaDB 2 runtime was only 32 bit.&amp;nbsp; Trying to load it meant you blew up pretty quickly.&amp;nbsp; Also updated DMW to state version 3.4.&amp;nbsp; Tested for SQL CE 3.1 only (built in VS 2005).&amp;nbsp; A SQL CE 3.5 version will come later after the 3.4 release.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;ISSUES AND FIXES&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;#40: Opening a table with 1024 columns in DataGridView - Issue is with an internal limit to the FillWeight in the DataGrid control. Added work around to force the fill weight to be 1 on column creation. This allows the code to run without issue.&lt;/p&gt;
&lt;p&gt;#151: DataBuilder &amp;gt; XML Export - Root Element Naming - Change was to the engine, not the databuilder. Altered the export code to make sure the name used is only the filename portion and not the full name of the file.&lt;/p&gt;
&lt;p&gt;#223: While viewing Data folder in Data Builder tree view there is no refresh button and F5 does not reload the grid - Added refresh button with icon and F5 hotkey to data viewer.&lt;/p&gt;
&lt;p&gt;#755: Identity Column Type bigint and @@identity - IntColumn now correctly looks at the inbound object type prior to attempting conversion.&lt;/p&gt;
&lt;p&gt;#709: CLR Proc which return a Table - Fixed sample for CLR Procs.&lt;/p&gt;
&lt;h3&gt;OTHER NON TICKETED ITEMS&lt;/h3&gt;
&lt;p&gt;CF framework strikes again - several of our fixes didn't work on the CF and we had to dumb them down.&amp;nbsp; The CF compiler apparently doesn't know how to support function prototypes that use a default param on a function type.&amp;nbsp; Wierd, they make you explicitly set it anyway.&amp;nbsp; And they decided to hide the Dispose method on the Filestream (private).&amp;nbsp; WHY?&amp;nbsp; Using() still works, but any other use and you can't dispose of it.&amp;nbsp; Just Close() it and hope for the best.&lt;/p&gt;
&lt;h3&gt;INTERFACE CHANGE&lt;/h3&gt;
&lt;p&gt;New public Interface IVistaDBTableList - this is used as an experiment to extending the DDA interface to include strongly typed members.&amp;nbsp; This interface gives you the ability to get back a strongly typed version of the EnumTables through a function called EnumTablesTyped().&amp;nbsp; This will return an IVistaDBTableList that may be used in a foreach loop for faster handling without casting, and contains optimized lookups for contains, etc.&lt;/p&gt;
&lt;p&gt;IVistaDBDatabase db = DDAUtils.BuildTestDatabase(ref DDAObj, dbname, false, null, false); &lt;br /&gt;
IVistaDBTableList tableList = db.EnumTablesTyped();&lt;br /&gt;
foreach (string table in tableList)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Table is named: &amp;quot; + table);&lt;br /&gt;
}&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=4hS74J"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=4hS74J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=oTeKrj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=oTeKrj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=c4Ahsj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=c4Ahsj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/339543270" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/builds/vistadb-3-4-build-63-development/</feedburner:origLink></item><item><title>Exposing strongly typed interfaces that are not CLS Compliant</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/339484187/</link><pubDate>Sat, 19 Jul 2008 00:00:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/articles/exposing-strongly-typed-interfaces-that-are-not-cls-compliant/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/articles/">Articles</category><description>&lt;h3&gt;Interface Change&lt;/h3&gt;
&lt;p&gt;There is a new public Interface &lt;strong&gt;IVistaDBTableList&lt;/strong&gt; - this is used as an experiment to extending the DDA interface to include strongly typed members.&amp;nbsp; This interface gives you the ability to get back a strongly typed version of the EnumTables through a function called EnumTablesTyped().&amp;nbsp; This will return an IVistaDBTableList that may be used in a foreach loop for faster handling without casting, and contains optimized lookups for contains, etc. Here is an example.&lt;/p&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;
 IVistaDBDatabase db = DDAUtils.BuildTestDatabase(&lt;span class="kwrd"&gt;ref&lt;/span&gt; DDAObj, dbname, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;); 
 IVistaDBTableList tableList = db.EnumTablesTyped();
 &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; table &lt;span class="kwrd"&gt;in&lt;/span&gt; tableList)
 {
    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Table is named: &amp;quot;&lt;/span&gt; + table);
 } &lt;/pre&gt;
&lt;h3&gt;CLSCompliant - Tagged IVistaDBTableList members as false&lt;/h3&gt;
&lt;p&gt;This is mostly an experiment at this point, and this interface may go away in the final build of 3.4.&amp;nbsp; The one major drawback is that the interface has to expose an unsigned long value - this makes us tag that interface and the function and non CLSCompliant.&amp;nbsp; I am not too happy about that, but the TableID is an unsigned long, so how else would you expose it?&lt;/p&gt;
&lt;p&gt;Internally the VistaDBTableList is used now for getting and testing all table lists.&amp;nbsp; The performance on this compared to the older ArrayList version is amazing.&amp;nbsp; For some complex table layouts the performance of the new strongly typed class more than twice as fast.&amp;nbsp; See the recent blog post about strongly typing everything!&lt;/p&gt;
&lt;p&gt;We need to think about how to expose these types of interfaces through an API without losing the CLSCompliance flag.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I wonder how others are handling this? I have a feeling for the final 3.4 release we will probably have to hide all the unsigned long variables in order to keep our clean interface CLSCompliant.&lt;/p&gt;
&lt;p&gt;On the one hand keeping everything CLSCompliant is a good idea for an API, and makes it much easier to run in low / medium trust environments.&amp;nbsp; On the other hand when you have a legitimate need to expose more than an Int64 to the world how would you do it?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=lLiC0J"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=lLiC0J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=PlwCcj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=PlwCcj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=AVJ1tj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=AVJ1tj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/339484187" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/articles/exposing-strongly-typed-interfaces-that-are-not-cls-compliant/</feedburner:origLink></item><item><title>Strongly type everything!</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/339387605/</link><pubDate>Fri, 18 Jul 2008 22:00:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/vistadb-news/strongly-type-everything/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/vistadb-news/">VistaDB News</category><description>&lt;h3&gt;Coming soon&lt;/h3&gt;
&lt;p&gt;Wow, we just wrapped up Build 63.&amp;nbsp; You should see it on the site sometime this weekend.&amp;nbsp; All I can say is that the new Mike has done a great job of pushing VistaDB along.&amp;nbsp; New bug fixes, NUnit tests, lots of good things happened the past two weeks.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vistadb.net/blog/files/media/image/WindowsLiveWriter/Stronglytypeeverything_F5B8/NUnitTiming_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="293" alt="Nunit timing" width="454" border="0" src="http://www.vistadb.net/blog/files/media/image/WindowsLiveWriter/Stronglytypeeverything_F5B8/NUnitTiming_thumb_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Nunit Suite runtime&lt;/h3&gt;
&lt;p&gt;The above numbers are the total time required to run the current NUnit test based on the engine from that date.&amp;nbsp; These dates do not correspond to any specific build of the engine, just what was in the revision control system on that date.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The 27 April 2008 Engine took 271 seconds to run the current complete Nunit tests.&lt;/p&gt;
&lt;p&gt;The 18 July 2008 Engine took 107.7 seconds to run the same set of tests.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Double performance&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;That is more than doubling of performance on these tests.&amp;nbsp; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not bad considering all we have done is minor tuning and tweaking of objects for strongly referencing.&amp;nbsp; We are not 100% complete with strongly typing all the internals of the engine, but the ones that are left are mostly there because they have to be.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are some aspects of ADO.NET that we can't change or it will break the public interface with the Provider Factories.&amp;nbsp; After seeing the performance differences I am really scratching my head wondering why Microsoft didn't provide strongly typed overloads for ADO.NET.&amp;nbsp; Why can't you request the schema in anything other than an ArrayList?&amp;nbsp; I don't see any changes in the 3.x line either as extension methods to help us here either.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vistadb.net/blog/files/media/image/WindowsLiveWriter/Stronglytypeeverything_F5B8/NUnit-Memory_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="285" alt="NUnit-Memory" width="454" border="0" src="http://www.vistadb.net/blog/files/media/image/WindowsLiveWriter/Stronglytypeeverything_F5B8/NUnit-Memory_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;VistaDB NUnit Memory footprint&lt;/h3&gt;
&lt;p&gt;The above numbers are the total time required to run the current NUnit test based on the engine from that&lt;/p&gt;
&lt;p&gt;This chart is likewise a graph of the same engine runs Peak Memory footprint and the amount of memory in use at the end of the complete run.&amp;nbsp; These are not very scientific due to the nature of the Garbage Collector in dot net.&amp;nbsp; If you run the same tests on this exact same machine with only 1 GB of memory you will see totally different results.&amp;nbsp; The only way you can compare is to run the same tests on the same machine.&amp;nbsp; All of these tests were run on the same machine with 4GB of RAM on Windows Vista x64.&lt;/p&gt;
&lt;p&gt;The peak memory footprint came down from 190MB to around 140MB.&amp;nbsp; That is respectable, but also shows just how much overhead you incur just by casting objects around.&amp;nbsp; All those temp objects add up, and the GC will get around to them when it is good and ready.&amp;nbsp; You could easily see higher numbers than this just due to when the GC decided to clean up (we don't force GC's in the NUnit suite).&lt;/p&gt;
&lt;h3&gt;Strongly type it all&lt;/h3&gt;
&lt;p&gt;Ah, I wish we could.&amp;nbsp; Some things will have to stay weakly typed for ADO.NET.&amp;nbsp; I am hoping that as the Entity Framework provider starts to take better shape we will have a better idea of how to stay strongly typed while providing services to the Entity Framework provider.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft did make some changes so we can pass around our internal command objects rather than requiring us to convert everything to strings.&amp;nbsp; This should help us quite a bit in managed land since we will not have to parse and tokenize strings all day before the engine can actually do something.&lt;/p&gt;
&lt;p&gt;We will continue to make changes in the engine to improve performance, drop the memory footprint, and hopefully improve throughput as well.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=sq3fRJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=sq3fRJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=G4Ar6j"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=G4Ar6j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=YEERUj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=YEERUj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/339387605" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/vistadb-news/strongly-type-everything/</feedburner:origLink></item><item><title>Algorithms – no one size fits all</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/333180659/</link><pubDate>Sat, 12 Jul 2008 01:50:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/articles/algorithms-no-one-size-fits-all/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/articles/">Articles</category><description>&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I have been spending quite a bit of time lately thinking about algorithms.&amp;nbsp;Not always specific concrete ones like sorting items in a list.&amp;nbsp;More in the general sense of how to determine the correct process to create a desired outcome.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Easy choices are... easy&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;There are some places where decisions are obvious.&amp;nbsp;If you need to keep a list of all the indexes contained in a database, or what categories of data are available the choice is usually pretty easy.&amp;nbsp;The choice is also usually minor in terms of the outcome.&amp;nbsp;The route you took to reach the decision is not always important.&amp;nbsp;As long as you get everything in alphabetical order no one cares how you did it.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Subtle choices are much harder&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Subtle choices become much harder.&amp;nbsp;Take as an example the caching of indexes from a database.&amp;nbsp;How much of your precious ram and heap do you spend on that?&amp;nbsp;That answer is almost always &amp;ndash; it depends.&amp;nbsp;What about things like when to store data in a cache rather than fetch it from disk or remote location?&amp;nbsp;Those choices start becoming harder and harder.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;How much is too much?&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Now take into account things like the volume of data.&amp;nbsp;Do you plan to store 1 million rows or 10?&amp;nbsp;There are general purpose algorithms that work for both, but then you have optimized for neither case.&amp;nbsp;What if optimizing for one case leads to a 100x improvement in performance for that specific case?&amp;nbsp;Do you implement the optimization all of the time, or conditionally?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Caching and storing of data is another difficult question to answer in general purpose terms.&amp;nbsp;What works great for a single user dedicated app will fail horribly under a severe multi user scenario. There are lots of cases where we in essence optimize for worst case scenarios &amp;ndash; always assuming disaster is about to happen.&amp;nbsp;What usually ends up happening is you kill performance for most of the general purpose cases just to handle that one really strange scenario.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;General purpose means optimized for none&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I have never been a big fan of general purpose systems.&amp;nbsp;I usually build for specific constraints in the system.&amp;nbsp;If I need to store a lookup of several million values I will implement it totally different that a quick look up in a list of less than ten.&amp;nbsp;But where do you draw the line?&amp;nbsp;&lt;/div&gt;
&lt;div&gt;With the database engine we have to handle all sorts of scenarios.&amp;nbsp;Should the engine special purpose for both ends of the performance spectrum?&amp;nbsp;Or do you maintain two code bases for such purposes?&amp;nbsp;I can remember years ago using a data engine that you could load the large or small version of the library.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I think in some ways SQL CE is doing this because you have to tell the engine the max size of the database.&amp;nbsp;The engine can then in some ways cheat to optimize what it expects you to do in that case.&amp;nbsp;Tables that would have been kept in RAM or cached will now be spooled to disk or partitioned.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Interesting to think about&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I don&amp;rsquo;t have any answers, but I have been spending a lot of time thinking about it lately for VistaDB and other projects I am working on.&amp;nbsp;It is always difficult to know when you have struck the right balance.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Optimization for your target means having a valid sample to optimize against.&amp;nbsp; But in programming, as with life, it is not always so neat or orderly.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=6mYlkJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=6mYlkJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=hWX3Rj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=hWX3Rj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=sky8wj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=sky8wj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/333180659" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/articles/algorithms-no-one-size-fits-all/</feedburner:origLink></item><item><title>Graffiti CMS 1.1 released with new pricing</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/322328407/</link><pubDate>Sun, 29 Jun 2008 01:48:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/news/graffiti-cms-1-1-released-with-new-pricing-also/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/news/">Industry News</category><description>&lt;p&gt;Teligent has released the new &lt;a href="http://graffiticms.com/blog/new-graffiti-cms-v1-1-release-new-pricing/"&gt;1.1 version of Graffiti CMS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Graffiti v1.1 edition includes &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;middot; bulk comment management&lt;/p&gt;
&lt;p&gt;&amp;middot; permissions functionality&lt;/p&gt;
&lt;p&gt;&amp;middot; the ability to delete and rename users&lt;/p&gt;
&lt;p&gt;&amp;middot; packages, and&lt;/p&gt;
&lt;p&gt;&amp;middot; more than 30 bugs fixes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Pricing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The newest version of Graffiti is only $99 for 3 content authors. (Additional users may be added for just $49 each). Developed with the small business owner in mind it is definately a great bargain for anyone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Graffiti CMS uses VistaDB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And of course we have to mention they use VistaDB as their default provider for their data storage.&amp;nbsp; It allows them to xcopy deploy to shared hosting and even Mono thanks to our 100% managed database engine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We use Graffiti CMS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This blog you are on right now is powered by Graffiti CMS!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=cWdPVI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=cWdPVI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=TOUYki"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=TOUYki" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=Xiogui"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=Xiogui" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/322328407" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/news/graffiti-cms-1-1-released-with-new-pricing-also/</feedburner:origLink></item><item><title>LINQ test for custom IEnumerator</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/321625221/</link><pubDate>Fri, 27 Jun 2008 22:07:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/articles/linq-test-for-custom-ienumerator/</guid><dc:creator>Jason Short</dc:creator><slash:comments>5</slash:comments><category domain="http://www.vistadb.net/blog/articles/">Articles</category><description>&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Mike and I had an interesting discussion this afternoon about LINQ and how it interprets enumerable rows.&amp;nbsp;Needless to say, some test code had to be written to prove or disprove some theories.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Concrete vs Interface&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Our thought experiment was what if you had an interface to an object and wanted to expose it to LINQ for query?&amp;nbsp;Did you need to implement IEnumerable on the concrete class, or the interface level?&amp;nbsp;Would it work on both?&amp;nbsp;What about strongly typing and intellisense in the IDE?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Interface wins&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;It turns out that you can implement it in either place.&amp;nbsp;But if you implement it only in the Concrete class then LINQ can&amp;rsquo;t see the IEnumerable to give you intellisense.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Concrete example (pun intended)&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;OK, how did we test this?&amp;nbsp;We took a Row as our base object.&amp;nbsp;We want to store a collection of Rows and iterate over them using a Table (something we do quite a bit).&amp;nbsp;In VistaDB all Table objects actually implement the ITable interface to give them a common set of controls (things like RowCount).&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;Parts&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Row &amp;ndash; Stores Data&lt;/div&gt;
&lt;div&gt;ITable &amp;ndash; Interface for the Table&lt;/div&gt;
&lt;div&gt;Table &amp;ndash; concrete class for the Table&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Questions you can ask with LINQ&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Once you have this done you can ask some interesting questions with LINQ.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Give me all the rows that have data &amp;gt; 0 starting with item #2&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;var foundrows = firsttable.Where(c =&amp;gt; c.StringData.Length &amp;gt; 0).Skip(1);&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Easier in SQL?&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;This would be MUCH harder to do without LINQ.&amp;nbsp;This is a powerful query with intellisense.&amp;nbsp;Don&amp;rsquo;t think of this in terms of SQL, you could do this with SQL as a single execute as well.&amp;nbsp;Think DDA.&amp;nbsp;In DDA you would have to set .First(), then .MoveNext() and then move through each row checking for the length &amp;gt; 0.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;DDA with LINQ?&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;No, this is NOT supported today.&amp;nbsp;We were just using it as a thought experiment.&amp;nbsp;Could you expose something like that through the IEnumerable interface and actually have it work?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The answer is yes.&amp;nbsp;It actually looks like you could do it.&amp;nbsp;Now, how much work would it be in VistaDB?&amp;nbsp;No idea yet.&amp;nbsp;But it is an interesting thought.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Sample Code&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; LinqTestEnumerator
{
    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            Table firsttable = &lt;span class="kwrd"&gt;new&lt;/span&gt; Table();

            var foundrows = firsttable.Where(c =&amp;gt; c.StringData.Length &amp;gt; 0).Skip(1);
            Console.WriteLine(&lt;span class="str"&gt;"The following rows where found after the filter was applied"&lt;/span&gt;);
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var c &lt;span class="kwrd"&gt;in&lt;/span&gt; foundrows)
            {
                Console.WriteLine(c.StringData);
            }

            var singlerow = firsttable.First(c =&amp;gt; c.StringData.Length &amp;gt; 0);
            Console.WriteLine(&lt;span class="str"&gt;"Single row: "&lt;/span&gt; + singlerow.StringData);


            ITable secondtable = &lt;span class="kwrd"&gt;new&lt;/span&gt; Table();
            var foundrows2 = secondtable.Where(c =&amp;gt; c.StringData.Length &amp;gt; 0).Skip(1);
            Console.WriteLine(&lt;span class="str"&gt;"The following were found using the ITable class rather than the Table concrete class"&lt;/span&gt;);
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var c &lt;span class="kwrd"&gt;in&lt;/span&gt; foundrows)
            {
                Console.WriteLine(c.StringData);
            }

        }
    }

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// This is our BASE for everything here.  We are trying to store a list of rows for this test&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Row
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringData;
    }

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// An interface for Table objects - common required data&lt;/span&gt;
    &lt;span class="rem"&gt;/// Note that IEnumerable MUST be implemented at this level, not at the Table level or LINQ can't see it&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ITable : IEnumerable&amp;lt;Row&amp;gt;
    {
        &lt;span class="rem"&gt;// How many rows are in this table&lt;/span&gt;
        &lt;span class="kwrd"&gt;int&lt;/span&gt; RowCount();
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Table : ITable
    {
        List&amp;lt;Row&amp;gt; rows;

        &lt;span class="kwrd"&gt;public&lt;/span&gt; Table()
        {
            rows = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Row&amp;gt; { &lt;span class="kwrd"&gt;new&lt;/span&gt; Row { StringData = &lt;span class="str"&gt;"row data 1"&lt;/span&gt; }, &lt;span class="kwrd"&gt;new&lt;/span&gt; Row { StringData = &lt;span class="str"&gt;"row data 2"&lt;/span&gt; }, &lt;span class="kwrd"&gt;new&lt;/span&gt; Row { StringData = &lt;span class="str"&gt;"row data 3"&lt;/span&gt; } };
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerator&amp;lt;Row&amp;gt; GetEnumerator()
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; (rows.GetEnumerator());
        }

        &lt;span class="rem"&gt;// Note that the namespace collision between the Generic and normal Collections of IEnumerator&lt;/span&gt;
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; (rows.GetEnumerator());
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; RowCount()
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; (rows.Count);
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=c9VirI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=c9VirI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=XcFtPi"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=XcFtPi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=xOInAi"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=xOInAi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/321625221" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/articles/linq-test-for-custom-ienumerator/</feedburner:origLink></item><item><title>VistaDB 3.4 Build 62 - New installer</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/320848713/</link><pubDate>Thu, 26 Jun 2008 22:18:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/builds/vistadb-3-4-build-62-new-installer/</guid><dc:creator>Jason Short</dc:creator><slash:comments>4</slash:comments><category domain="http://www.vistadb.net/blog/builds/">Builds</category><description>&lt;p&gt;&lt;u&gt;&lt;strong&gt;Build #62, 6/26/2008&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;NOTES&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;
NEW Setup Application.&amp;nbsp; This version does things very differently under the hood.&amp;nbsp; The serial number input is not validated yet (it will be later). But it should be smart enough to remember your serial number during upgrades.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Foreign Key Lists were using an arraylist internally and walking the entire list doing case insensitive string compares per entry of the value.&amp;nbsp; Changed to a strongly typed dictionary and OrdinalCaseInsensitive for the compare type.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;ISSUES AND FIXES&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;#779: Error 120 when adding a column to a table - Issue was related to a table with FK's casting into a strongly typed dictionary.&amp;nbsp; Fixed.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;OTHER NON TICKETED ITEMS&lt;br /&gt;
&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;There are a lot of internal changes in this build again.&amp;nbsp; Including some conversion in strongly types, and more changes to the engine for optimizations.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There is also a start of the new Membership Provider for asp.net and the partial implementation of the Role Provider that will be included in 3.4.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;&amp;nbsp;EDIT:&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Make sure you UNINSTALL 3.x from your machine before running the new installer.&amp;nbsp; It can't detect InnoSetup installs, so it doesn't know how to uninstall them.&amp;nbsp; I am working on that for the final build.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As a quick tip:&amp;nbsp;&lt;/em&gt; If you are ever worried about keeping a runtime for testing or anything like that just copy the install path FRAMEWORKS directories.&amp;nbsp; Each one contains a RUNTIME directory with the actual Runtime DLL.&amp;nbsp; Then you can keep them all in a path for testing or just for archival if you like.&lt;/p&gt;
&lt;p&gt;There are also some partially completed samples for 3.5 in the Frameworks\Net 3.5\ directory if you care to look.&amp;nbsp; Poke around in the directories, there are lots of interesting things tucked away in there.&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=hu6KkI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=hu6KkI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=N0U02i"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=N0U02i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=RrGe9i"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=RrGe9i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/320848713" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/builds/vistadb-3-4-build-62-new-installer/</feedburner:origLink></item><item><title>Another Mike coming to VistaDB in July</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/314396179/</link><pubDate>Thu, 19 Jun 2008 06:46:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/vistadb-news/another-mike-coming-to-vistadb-in-july/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/vistadb-news/">VistaDB News</category><description>&lt;p&gt;&lt;strong&gt;More people&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good news indeed.&amp;nbsp; We have another Mike coming to work with us.&amp;nbsp; Mike has accepted a full time position at VistaDB starting in July.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Another Mike?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes, that makes 4 officially associated with the product dev team.&amp;nbsp; Makes it easier on me I guess...&amp;nbsp; I can now always just state that it wasn't me&amp;nbsp;- MIKE broke it!&lt;/p&gt;
&lt;p&gt;I will post a brief write up about the new employee when he starts so you guys have a little background prior to seeing him posting on the forums, etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=cjtZhI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=cjtZhI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=7v8dji"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=7v8dji" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=GhFrei"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=GhFrei" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/314396179" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/vistadb-news/another-mike-coming-to-vistadb-in-july/</feedburner:origLink></item><item><title>VistaDB Coolest Feature?</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/314401989/</link><pubDate>Wed, 18 Jun 2008 06:57:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/articles/vistadb-coolest-feature/</guid><dc:creator>Jason Short</dc:creator><slash:comments>4</slash:comments><category domain="http://www.vistadb.net/blog/articles/">Articles</category><description>&lt;p&gt;What do you think the coolest feature of VistaDB is today?&amp;nbsp; I get asked this question quite a bit and I never know how to answer.&lt;/p&gt;
&lt;p&gt;Hmm, we have a lot to choose from.&amp;nbsp; I am going to rattle of a few of my favorites and see what you guys come up with also.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jason's Picks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;100% Dot Net &lt;/strong&gt;- A lot of people don't care about this, but I do.&amp;nbsp; The ability to write something this large and complex as 100% managed code has really proven out the development and runtime efforts of Microsoft.&amp;nbsp; They have a great platform, and it is only growing stronger.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have recently had to go back and write a bunch of C++ stuff.&amp;nbsp; In many cases my C# versions of the code were faster than the C++ code.&amp;nbsp; Simply amazing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XCopy deployment - &lt;/strong&gt;Very cool to be able to xcopy my databases across boxes / storage keys / etc and still open the same database from Mono, Windows, CF editions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL Server syntax &lt;/strong&gt;- This is a biggie to most people.&amp;nbsp; And it is very nice.&amp;nbsp; I would like to see the parser abstracted at some point so people could write their own parsers on top of VistaDB low level engine.&amp;nbsp; Something like lolcats query language would just be funny, but a parser for mySQL would be quite functional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolated Storage - &lt;/strong&gt;Cool to some people in Active Directory environments.&amp;nbsp; Otherwise I don't think a lot of people care.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Builder with Source&lt;/strong&gt; - It is a good tool, but I don't think it is great yet.&amp;nbsp; It still need a lot of cleanup and polish.&amp;nbsp; Mike and I have a few ideas here, but they will take more time to complete (and maybe the new hire can start here).&amp;nbsp; It does show images from a table (sort of nice), but need a few more friendly features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TSQL Procs &lt;/strong&gt;- This is the uber coolness that attracts most people.&amp;nbsp; SQL CE can't do it.&amp;nbsp; No one else runs SQL Server stored procedures like we do.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLR Procs &lt;/strong&gt;-&amp;nbsp;&amp;nbsp;I personally think that CLR Procs are about 100x more powerful than a TSQL Proc, but more difficult to create.&amp;nbsp; Have any good ideas for a CLR Proc demo?&amp;nbsp; Let us know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DDA - &lt;/strong&gt;Having a choice in APIs can be a good thing.&amp;nbsp; Need quick and dirty, go DDA.&amp;nbsp; A lot of people seem to shy away from it because they are then off the ADO.NET 2 provider roadmap.&amp;nbsp; It is not that bad of a thing.&amp;nbsp; Gets the job done, and you can create some very neat looking apps with very small code bases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visual Studio Integration &lt;/strong&gt;- This is pretty awesome, but I don't think that many people use it.&amp;nbsp; It involves some training, but is a very powerful tool.&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=YWANtI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=YWANtI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=vXLmfi"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=vXLmfi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=Hz2fMi"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=Hz2fMi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/314401989" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/articles/vistadb-coolest-feature/</feedburner:origLink></item><item><title>CLRProcs and VistaDBContext</title><link>http://feeds.feedburner.com/~r/Vistadb/~3/314396180/</link><pubDate>Tue, 17 Jun 2008 23:28:00 GMT</pubDate><guid isPermaLink="false">http://www.vistadb.net/blog/articles/clrprocs-and-vistadbcontext/</guid><dc:creator>Jason Short</dc:creator><slash:comments>0</slash:comments><category domain="http://www.vistadb.net/blog/articles/">Articles</category><description>&lt;p&gt;&lt;strong&gt;What is the VistaDBContext object?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think of the VistaDBContext as your host container for the CLRProc.&amp;nbsp; It is the part of the engine that is kept per connection and allows the hosted CLRProc to communicate to the Engine through a Pipe object.&amp;nbsp; This is very similar to how it works in SQL Server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why can't you communicate direct to the engine?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The VistaDB Engine is not in the same namespace as the procedure.&amp;nbsp; The procedure has to be loaded and then JIT'd in order to run from within the database.&amp;nbsp; But that does not mean the engine can trust the assembly entirely.&amp;nbsp; It keeps itself isolated from the stored proc as much as it can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about threading withing a CLR Proc?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you create a thread within a CLRProc is does not have any VistaDBContext associated with it.&amp;nbsp; This means you cannot call back to the engine from the worker thread.&amp;nbsp; You might do this if you are performing some very long process and only want to update the database that the process completed (could do this with a new Process as well).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The only way to communicate back to the database in this case would be as a totally new client (Open a new VistaDBConnection to the database).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This comes with all the normal drawbacks and benefits.&amp;nbsp; You get to use the ConnectionPool.&amp;nbsp; But if you have the database open in Exclusive mode you will not be able to access it from the second thread's connection.&lt;/p&gt;
&lt;p&gt;As an example let's say you had a CLRProc that FTP'd a file to another server and was going to take a while.&amp;nbsp; You decide to spin up a thread to complete this task.&amp;nbsp; The new thread then would have to create a new VistaDBConnection and perform an update to the table telling it the transfer completed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens when you open a connection to a database from within a CLR Proc?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you open a new Connection it is just like a separate application connecting to the database.&amp;nbsp; Unless you use the VistaDBContext your clr procedure may as well be running within another application.&amp;nbsp; There is no other communication channel other than the context pipes between the engine and hosted procedures.&amp;nbsp; This is important to understanding why certain things cannot be performed within a hosted clr procedure.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the difference between a method tagged with FillRow?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The difference is in how it may be called from within your SQL code.&amp;nbsp; Do you wish to call it like a UDF function?&amp;nbsp; Then FillRow is not required.&amp;nbsp; You may call the function using EXEC Functionname(someparam), or SET @VARIABLE = Functionname(someparam).&amp;nbsp; But you cannot select * from Functionname(someparam) unless you have a way to enumerate over the rows.&amp;nbsp; This is the purpose of the FillRow attribute - it tells the VistaDB Engine&amp;nbsp;what function must be called to assign the values to each row in the output.&lt;/p&gt;
&lt;p&gt;Context can be a&amp;nbsp;tricky subject because it is not one with much information (even from the SQL Server folks).&amp;nbsp; There is also a DDA ability to communicate through their own DDA Channel Pipe&amp;nbsp;which was moddled after the SQL Channel Pipe.&lt;/p&gt;
&lt;p&gt;I continue to be amazed at the great things you can do with VistaDB, and just how subtle from of the examples truely are.&amp;nbsp; The current CLRProcs demo is actually demonstrating around 15 topics that are not always apparent.&amp;nbsp; We will be breaking it up into multiple applications to demo key concepts better and hopefully remove some of the confusion around CLRProcs.&amp;nbsp; They are quite powerful and easy to code too.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=zeCoaI"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=zeCoaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=MYOk3i"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=MYOk3i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Vistadb?a=mFP5Gi"&gt;&lt;img src="http://feeds.feedburner.com/~f/Vistadb?i=mFP5Gi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Vistadb/~4/314396180" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.vistadb.net/blog/articles/clrprocs-and-vistadbcontext/</feedburner:origLink></item></channel></rss>
