<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5238131531249720750</atom:id><lastBuildDate>Tue, 21 May 2013 17:09:12 +0000</lastBuildDate><category>SQL Compact 4.0</category><category>Windows Phone</category><category>Visual Studio</category><category>SQL Server Compact Edition</category><category>PowerShell</category><category>SQL CE</category><category>SQL Mobile</category><category>Window Store Apps</category><category>Linq to SQL</category><category>Sync Framework</category><category>SQL Server</category><category>SQLIte</category><category>ASP</category><category>CodeSmith</category><category>F#</category><category>SQL Compact 3.5</category><category>Merge Replication</category><category>Entity Framework</category><category>Silverlight</category><category>SSMS</category><category>ASP.NET</category><category>ADO.NET</category><title>Everything SQL Server Compact</title><description>This blog tries to keep up with everything SQL Compact related, including forays into subjects like Microsoft Sync Framework, Windows Phone and SQL Server Replication</description><link>http://erikej.blogspot.com/</link><managingEditor>noreply@blogger.com (ErikEJ)</managingEditor><generator>Blogger</generator><openSearch:totalResults>241</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ErikejBlogsAboutSqlCompactnetAndRelatedStuff" /><feedburner:info uri="erikejblogsaboutsqlcompactnetandrelatedstuff" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-3588240550991344700</guid><pubDate>Tue, 21 May 2013 17:09:00 +0000</pubDate><atom:updated>2013-05-21T19:09:12.838+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #15 : flush data to disk immediately</title><description>&lt;p&gt;Under normal operation, SQL Server Compact keeps all pending disk writes in memory, and flushes them to disk at least every 10 seconds. The &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.connectionstring(v=vs.100).aspx" target="_blank"&gt;connection string&lt;/a&gt; property to control this is called “Flush Interval”, and valid values are between 1 and 1000 seconds. But you may want to flush to disk immediately under certain circumstances, and this weeks code snippet demonstrates how to do just that. This is possible via the CommitMode property on the SqlCeTransaction object Commit method, as demonstrated below:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;using (SqlCeConnection conn = new SqlCeConnection(@"Data Source=C:\data\AdventureWorks.sdf;"))&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start a local transaction; SQL Server Compact supports the following &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // isolation levels: ReadCommitted, RepeatableRead, Serializable&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SqlCeTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SqlCeCommand cmd1 = conn.CreateCommand())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // To enlist a command in a transaction, set the Transaction property&lt;br&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd1.Transaction = tx;&lt;/strong&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd1.CommandText = "INSERT INTO FactSalesQuota " +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "(EmployeeKey, TimeKey, SalesAmountQuota) " +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "VALUES (2, 1158, 150000.00)";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd1.ExecuteNonQuery();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Commit the changes to disk immediately, if everything above succeeded;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use Deferred mode for optimal performance; the changes will &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // be flashed to disk within the timespan specified in the &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ConnectionString 'FLUSH INTERVAL' property (default 10 seconds); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tx.Commit(CommitMode.Immediate);&lt;br&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tx.Rollback();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/JmzD9_BtUmI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/JmzD9_BtUmI/sql-server-compact-code-snippet-of-week_21.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/05/sql-server-compact-code-snippet-of-week_21.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-1265589052269813161</guid><pubDate>Thu, 09 May 2013 07:23:00 +0000</pubDate><atom:updated>2013-05-09T09:23:00.220+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #14 : script all data in a table</title><description>&lt;p&gt;Another entry in the scripting API samples, you will find an overview of &lt;a href="http://erikej.blogspot.dk/2013/03/sql-server-compact-code-snippet-of-week.html" target="_blank"&gt;getting started with the API here.&lt;/a&gt; &lt;p&gt;This weeks entry demonstrates the general pattern for scripting smaller chunks of SQL based on a single table, in this case a INSERT statement for each row in the table. &lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;using (IRepository repository = new DBRepository(@"Data Source=C:\Northwind.sdf"))&lt;br&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Generator generator = new Generator(repository, null); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var tableName in repository.GetAllTableNames()) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; generator.GenerateTableContent(tableName, false); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IO.File.WriteAllText(@"C:\script.sqlce", generator.GeneratedScript); &lt;br&gt;}&lt;/font&gt;&lt;br&gt;&lt;br&gt;For SQL Server Compact 4.0, the scripting library is now available on NuGet, making it even easier to get started. &lt;a title="https://nuget.org/packages/ErikEJ.SqlCeScripting" href="https://nuget.org/packages/ErikEJ.SqlCeScripting"&gt;https://nuget.org/packages/ErikEJ.SqlCeScripting&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/i9sAzndEQNk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/i9sAzndEQNk/sql-server-compact-code-snippet-of-week_9.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/05/sql-server-compact-code-snippet-of-week_9.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-1848398222053232930</guid><pubDate>Fri, 03 May 2013 05:42:00 +0000</pubDate><atom:updated>2013-05-03T07:42:08.458+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #13 : reseed (reset) an IDENTITY column</title><description>&lt;p&gt;A question that keeps re-appearing in the forum is, how can I reseed/reset an IDENTITY column in SQL Server Compact, as no DBCC command is available. You can simply use a special syntax of the ALTER TABLE command to do this, as follows:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;ALTER TABLE [MyTableName] &lt;b&gt;ALTER COLUMN [Id] IDENTITY &lt;/b&gt;(1, 1)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;This will make the value of the next generated IDENTITY value 1 and increment with 1. Notice that you do not specify the column type, only the IDENTITY specification.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/JiedwVzemc8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/JiedwVzemc8/sql-server-compact-code-snippet-of-week.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>1</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/05/sql-server-compact-code-snippet-of-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-3310817399284951973</guid><pubDate>Wed, 17 Apr 2013 13:19:00 +0000</pubDate><atom:updated>2013-04-17T15:19:56.482+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #12 : get the SQL Server Compact runtime version</title><description>&lt;p&gt;Your app/web site may require a specific build version of the SQL Server Compact runtime, due to dependency on a bug fix, for example. This weeks code snippet will demonstrate how to get that information. I have an &lt;a href="http://erikej.blogspot.dk/2010/10/how-to-detect-sql-server-compact.html" target="_blank"&gt;older blog post here&lt;/a&gt;, that goes into deep details about the various ways to get SQL Server Compact related version information.&lt;/p&gt; &lt;p&gt;To get the SQL Server Compact build version for 3.5 SP2 and 4.0, you can simply use:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;var ver = new System.Data.SqlServerCe.SqlCeConnection().ServerVersion;&lt;br&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.serverversion(v=vs.100).aspx" target="_blank"&gt;MSDN docs here.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For SQL Server Compact 4.0 SP1, this returns: 4.0.8876.1.&lt;/p&gt; &lt;p&gt;And for SQL Server Compact 3.5 SP2 CU6, the value would be: 3.5.8088.0&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/eXWYESX299A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/eXWYESX299A/sql-server-compact-code-snippet-of-week_17.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/04/sql-server-compact-code-snippet-of-week_17.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-733759531438205809</guid><pubDate>Wed, 10 Apr 2013 16:59:00 +0000</pubDate><atom:updated>2013-04-17T15:18:38.455+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Generate a Windows Phone 8 Local Database DataContext from an existing database</title><description>&lt;p&gt;Despite my tooling for this having been available for more than 18 months, I have never posted a dedicated blog post for this subject. This post intends to remedy this.&lt;/p&gt; &lt;p&gt;The Local Database (a SQL Server Compact database accessed via LINQ to SQL) is a data access API available on Windows Phone 7.5 and 8.&lt;/p&gt; &lt;p&gt;The Microsoft documentation (listed &lt;a href="http://erikej.blogspot.dk/2011/07/windows-phone-sql-server-compact.html" target="_blank"&gt;here on my blog&lt;/a&gt;, together with many other useful Windows Phone Local Database links) always describes a Code First workflow, which makes it cumbersome to reuse existing effort in creating a SQL Server Compact database schema for Windows Mobile or desktop, and&amp;nbsp; also makes it hard to distribute a database prepopulated with data together with your app. My tooling, which is available with the SQL Server Toolbox &lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1/" target="_blank"&gt;Visual Studio add-in&lt;/a&gt;, and also available in a simpler form with the new standalone edition of the Toolbox for SQL Server Compact 3.5 &lt;a href="https://sqlcetoolbox.codeplex.com/releases/view/104781" target="_blank"&gt;(currently in alpha)&lt;/a&gt;, enables both scenarios. The standalone edition is useful for VS Express users and when you do not wish to install Visual Studio on a PC (it is a single .exe file, so very simple to distribute)&lt;/p&gt; &lt;p&gt;In the following walkthrough, using Visual Studio 2012, I will demonstrate how to use the SQL Server Compact Toolbox to take an existing SQL Server database and use it as an included Windows Phone database in an new (or existing) Windows Phone 8 App. The process to do this requires these steps: &lt;br&gt;&lt;br&gt;- Create the SQL Server Compact database from the server database and add it to the Windows Phone project&lt;br&gt;- Generate the LINQ to SQL DataContext and releated classes.&lt;br&gt;- Use the database from code&lt;/p&gt; &lt;p&gt;I assume you have Visual Studio 2012 Pro or higher with the Windows Phone 8 SDK installed.&lt;/p&gt; &lt;h3&gt;Create the SQL Server Compact database&lt;/h3&gt; &lt;p&gt;I have created a new Windows Phone Databound App for this sample, and selected Windows Phone OS 8.0 as the target OS.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-8RMMLWdPzp4/UWWZ3JqLDqI/AAAAAAAABL8/U4W1ch-j-uA/s1600-h/image4.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-Kfx5EXP9YGU/UWWZ4tPqp0I/AAAAAAAABME/BQCSBlmUMYk/image_thumb2.png?imgmax=800" width="438" height="330"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I then use the Toolbox to create a new SQL Server Compact 3.5 database in the folder where the Phone project resides, (you can determine the folder from by using the “Open Folder in File Explorer” context menu item).&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-EMgTmYm1TYw/UWWZ55ngZfI/AAAAAAAABMM/eyKPf_d0j8I/s1600-h/image8.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-7hEw0RHpxzE/UWWZ7AHr82I/AAAAAAAABMU/DsgsEjyaLMc/image_thumb4.png?imgmax=800" width="416" height="117"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I then click Create, navigate to the project folder, and type PostCodes.sdf, press OK.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-a69dA3-CaQU/UWWZ8k7kC9I/AAAAAAAABMc/-cifW4xzbOA/s1600-h/image12.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-iHf-wPFlj5g/UWWZ-VjccaI/AAAAAAAABMk/P_zua61ijGQ/image_thumb6.png?imgmax=800" width="439" height="332"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Click OK, and a new, empty database will be added to the database list in the Toolbox:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-t4L9YC4FaGc/UWWZ_RngajI/AAAAAAAABMs/XUzYNS41Irs/s1600-h/image16.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-JBUMTKzP36E/UWWaAgb7n7I/AAAAAAAABM0/6IYeLG_B1rs/image_thumb8.png?imgmax=800" width="331" height="197"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now we need to connect to the SQL Server database, and script it, then run the script against the new, empty database.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-AfqMdfki67A/UWWaCGLStCI/AAAAAAAABM8/L6zrLoAbQaw/s1600-h/image20.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-wCWL_5XzrZM/UWWaDgRfs-I/AAAAAAAABNE/6b22maXhKEI/image_thumb10.png?imgmax=800" width="446" height="127"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Create and save the database script using the Toolbox menu item above, and then open the SQL Editor against the PostCodes.sdf database file:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-qcaCLNfZBzk/UWWaE9bHh5I/AAAAAAAABNM/l1ciuRQ1W70/s1600-h/image24.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-UXWyyVmCSEw/UWWaGcRlbWI/AAAAAAAABNU/q61Cid9TytE/image_thumb12.png?imgmax=800" width="321" height="70"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Use the Open button in the editor to load the script, and the press the Execute button to run the script.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-1GbxaDfrMYY/UWWaHdkjdiI/AAAAAAAABNc/X9SMFZe2HnY/s1600-h/image28.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-xtk1hOf4YV8/UWWaIymJhiI/AAAAAAAABNk/PrM9WXLHRJc/image_thumb14.png?imgmax=800" width="359" height="155"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now the database contains a PostCode table (the script is available &lt;a href="https://skydrive.live.com/redir?resid=47E59E4BEB70472B!4486" target="_blank"&gt;here&lt;/a&gt;), which has all Danish postcodes.&lt;/p&gt; &lt;p&gt;The final step is adding the database file to the Phone project. In Solution Explorer, select “Show all files”, and include PostCodes.sdf. In this sample scenario, we would like the database to become writable on the Phone, so include it a “Embedded Resource” – it could also be included as Content, if it was just a read-only database, read &lt;a href="http://erikej.blogspot.dk/2012/01/windows-phone-local-database-tip.html" target="_blank"&gt;more here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ijD2t86hbBw/UWWaKBLQyxI/AAAAAAAABNs/noM-j6jSpmo/s1600-h/image33.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-SUC8rZqK7FE/UWWaLqBxqqI/AAAAAAAABN0/wj23cUUOZec/image_thumb17.png?imgmax=800" width="330" height="384"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Generate the LINQ to SQL DataContext&lt;/h3&gt; &lt;p&gt;In order to generate the DataContext based on the database, right click it in the Toolbox, and select “Add Windows Phone DataContext to current project”.&lt;br&gt;If this menu item is disabled, verify that the database file is in 3.5 format, and that the SQL Server Compact 3.5 SP2 runtime is properly installed, you can check this via the About dialog. “Yes” is required in both places, if that is not the case, repair/re-install.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-LNcoLaD4uVQ/UWqy2SLjFtI/AAAAAAAABPE/wBNT4TtbFJc/s1600-h/image%25255B3%25255D.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-TP0H506Qh-s/UWqy3jyiwFI/AAAAAAAABPM/_rSSJcRWngA/image_thumb.png?imgmax=800" width="221" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-J4Xf1i7Noko/UWWaM5C_JmI/AAAAAAAABN8/hjp04t3AZbY/s1600-h/image41.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-AMZcvMoC-KI/UWWaOLfZEnI/AAAAAAAABOE/0-pJ4V9KFpw/image_thumb21.png?imgmax=800" width="344" height="48"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-KSkidSdK1yM/UWWaO-mnzKI/AAAAAAAABOM/RFFjweI1xGw/s1600-h/image47.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-ycoHQJuZDL0/UWWaQSa-S1I/AAAAAAAABOU/AEVvd1n6NWU/image_thumb25.png?imgmax=800" width="406" height="506"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Let’s walk through the various options on this dialog:&lt;/p&gt; &lt;p&gt;Context name: The name of the generated DataContext class&lt;/p&gt; &lt;p&gt;Namespace: Allows you to specify another namespace for the generated code&lt;/p&gt; &lt;p&gt;Language: You can generate C# or VB code.&lt;/p&gt; &lt;p&gt;Pluralize: If checked, will rename tables (Person =&amp;gt; People) etc.&lt;/p&gt; &lt;p&gt;Create a file per table: Normally, just a single file is created&lt;/p&gt; &lt;p&gt;Advanced options:&lt;/p&gt; &lt;p&gt;Add schema version table: If you would like to include the database file a a writeable file, and allow use of the DatabaseSchemaUpdater class in a future app version select this option .&lt;/p&gt; &lt;p&gt;Add rowversion column to all tables: Checking this will ensure that all tables have a rowversion column (formerly timestamp), which enhances performance when doing UPDATE and DELETE (see my blog posts &lt;a href="http://erikej.blogspot.dk/2012/02/windows-phone-local-database-tip.html" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://erikej.blogspot.dk/2012/04/windows-phone-local-database-tip.html" target="_blank"&gt;here&lt;/a&gt;) &lt;/p&gt; &lt;p&gt;Include ConnectionStringBuilder: Will add a LocalDatabaseConnectionStringBuilder class to the project, to help with building connection strings in a strongly typed fashion.&lt;/p&gt; &lt;p&gt;For this sample project, just click OK, and a PostCodesContext.cs file will be added to the project, and we are done.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-gGWfwIHjqks/UWWaRoM230I/AAAAAAAABOc/a3GcpTphuqo/s1600-h/image51.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-ooM7SCBnqBw/UWWaS374ybI/AAAAAAAABOk/9k2Hv-f7v2A/image_thumb27.png?imgmax=800" width="285" height="318"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Use the database from code&lt;/h3&gt; &lt;p&gt;Finally, to demonstrate that we are able to include data with the app, alter the DataTemplate in MainPage.xaml as follows:&lt;/p&gt; &lt;p&gt;&amp;lt;DataTemplate&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;StackPanel Margin="0,0,0,17"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text="{Binding &lt;strong&gt;Zip&lt;/strong&gt;}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text="{Binding &lt;strong&gt;City&lt;/strong&gt;}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;/p&gt; &lt;p&gt;Replace the OnNavigatedTo event handler in MainPage.xaml.cs with the following code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnNavigatedTo(NavigationEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (PostCodesContext ctx = &lt;span class="kwrd"&gt;new&lt;/span&gt; PostCodesContext(PostCodesContext.ConnectionString))&lt;br /&gt;            {&lt;br /&gt;                ctx.CreateIfNotExists();&lt;br /&gt;                ctx.LogDebug = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                MainLongListSelector.ItemsSource = ctx.PostCode.ToList();                &lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This code initialize a new PostCodesContext instance (embraced in “using”, as it is Disposable). The CreateIfNotExists method extracts the PostCodes.sdf embedded resource from the project, and copies it to isolated storage (feel free to look at the code). Setting LogDebug to true will show all SQL statements as text in the Debug window while debugging:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;SELECT [t0].[Id], [t0].[Zip], [t0].[City], [t0].[Street], [t0].[Company], [t0].[IsProvince], [t0].[rowguid] AS [Rowguid], [t0].[ts] AS [Ts]&lt;br&gt;FROM [PostCode] AS [t0]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And finally, calling ToList() will execute the SELECT and return a list of PostCode objects, that is the bound to the ItemsSource property of the LongListSelector.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Result:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-mgHpOjuWsc4/UWWaTyukzvI/AAAAAAAABOs/m1NIkVlqk18/s1600-h/pc8.png"&gt;&lt;img title="pc" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="pc" src="http://lh4.ggpht.com/-4zt31VIWGYo/UWWaU2Bz4jI/AAAAAAAABO0/Dj9uHWJVW9w/pc_thumb4.png?imgmax=800" width="251" height="429"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Let us finish with a summary of advantages of this approach: &lt;br&gt;- Use desktop database tools for data population and schema design &lt;br&gt;- Saves time doing 1:1 mapping between database tables and DataContext classes &lt;br&gt;- DataContext class and entity classes are partial and can be extended&lt;br&gt;- The generated DataContext contains Index definitions (which SqlMetal does not support, as this is a Windows Phone extension) &lt;br&gt;- The generated DataContext contains the CreateIfNotExists method, that optionally extracts an included database (prepopulated with data) to Isolated Storage&lt;br&gt;- The generated DataContext includes the LogDebug property, that allows you to see all SQL statements generated on the device in the debug window&lt;br&gt;- Optionally split the generated Data Context classes into multiple files&lt;br&gt;- Optionally add a Version table if you include the table with your app, and want to enable use of the schema updater functionality.&lt;br&gt;- Optionally add rowversion columns to improve UPDATE and DELETE performance&lt;br&gt;- Optionally include a ConnectionStringBuilder class to build a valid connection string in a strongly typed way,&amp;nbsp; using advanced connection string options (see some of my Phone blog posts for candidates)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hope you find it useful.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/DheS286aBeI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/DheS286aBeI/generate-windows-phone-8-local-database.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-Kfx5EXP9YGU/UWWZ4tPqp0I/AAAAAAAABME/BQCSBlmUMYk/s72-c/image_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>20</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/04/generate-windows-phone-8-local-database.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-2531915644856302392</guid><pubDate>Mon, 08 Apr 2013 07:21:00 +0000</pubDate><atom:updated>2013-04-08T09:21:56.418+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #11 : detect if SQL Server Compact is available</title><description>&lt;p&gt;It can sometimes by useful to find out if SQL Server Compact is available on a system, for example in installers and if your application supports several database products. This week’s code snippet allows you to detect if the ADO.NET Provider is available and properly installed (it does not detect if the unmanaged DLL files are present). The code detects both if the AD.NET Provider is present, and if the DbProvider interface is properly registered (either in machine.config or in a local config file)&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsV40Installed()&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        System.Reflection.Assembly.Load(&lt;span class="str"&gt;"System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.IO.FileNotFoundException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        var factory = System.Data.Common.DbProviderFactories.GetFactory(&lt;span class="str"&gt;"System.Data.SqlServerCe.4.0"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.Configuration.ConfigurationException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.ArgumentException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;Replace Version=4.0.0.0 with Version=3.5.1.0 and use System.Data.SqlServerCe.3.5 for the DbProvider invariant name for SQL Server Compact 3.5&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/PLUPwaYbnJ4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/PLUPwaYbnJ4/sql-server-compact-code-snippet-of-week.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/04/sql-server-compact-code-snippet-of-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-504028794875305748</guid><pubDate>Tue, 19 Mar 2013 12:20:00 +0000</pubDate><atom:updated>2013-04-07T15:06:31.648+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Entity Framework</category><title>WCF Data Services with Windows Phone - bandwidth requirements measured</title><description>&lt;p&gt;In connection with testing Synchronization between a SQL Server Compact database on Windows Phone 8 and a SQL Server database (via a WCF Data Services service hosted in IIS), I have done some interesting observations regarding bandwidth requirements, that I would like to share.&lt;/p&gt; &lt;p&gt;I am testing against the &lt;a href="http://chinookdatabase.codeplex.com/" target="_blank"&gt;Chinook sample database&lt;/a&gt;, by downloading the entire PlaylistTrack table (8715 rows) to the device via my WCF Data Services service. On the server side, I am using the latest release version of the WCF Data Services server components, &lt;a href="http://nuget.org/packages/Microsoft.Data.Services/" target="_blank"&gt;version 5.3.0.&lt;/a&gt; &lt;a href="http://blogs.msdn.com/b/astoriateam/archive/2012/09/26/wcf-data-service-5-1-0-rc2-released.aspx" target="_blank"&gt;Version 5.1 or later&lt;/a&gt; includes the newer lightweight JSON format (just to compare I am also including sizes for the previous JSON format)&lt;/p&gt; &lt;p&gt;On the server side, I have created a ASP.NET Web Application with a WCF Data Service, that exposes the Chinook database on my SQL Server via an Entity Framework DbContext. The power of WCF Data Services is that this requires basically no code to configure. I have configured my service like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SyncService : DataService&amp;lt;ChinookEntities&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;// This method is called only once to initialize service-wide policies.&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeService(DataServiceConfiguration config)&lt;br /&gt;        {&lt;br /&gt;            config.UseVerboseErrors = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;            &lt;span class="rem"&gt;//config.SetEntitySetAccessRule("TrackPurchases", EntitySetRights.WriteAppend);&lt;/span&gt;&lt;br /&gt;            config.SetEntitySetAccessRule(&lt;span class="str"&gt;"*"&lt;/span&gt;, EntitySetRights.AllRead);&lt;br /&gt;            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In order to access the IIS Express hosted service from my Windows Phone 8 emulator, I followed the instructions here: &lt;a title="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj684580(v=vs.105).aspx" href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj684580(v=vs.105).aspx"&gt;http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj684580(v=vs.105).aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To measure the size of the payload, I am using Fiddler2, by following the instructions here: &lt;a title="http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx" href="http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx"&gt;http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The WCF Data Services team also supply a &lt;a href="http://blogs.msdn.com/b/astoriateam/archive/2012/10/30/odata-client-tools-for-windows-phone-apps-now-available.aspx" target="_blank"&gt;WCF Data Services client for Windows Phone&lt;/a&gt;, that can take advantage of a Service Reference, but this client has some severe limitations, that affects bandwidth consumption in a bad way: &lt;a href="http://www.bitwhys.com/odata-101-enabling-json-light-from-the-wcf-ds-5-1-0-rc1-client/" target="_blank"&gt;It only supports the XML based ATOM format&lt;/a&gt;, but you can enable compression, as described here: &lt;a title="http://blogs.msdn.com/b/astoriateam/archive/2011/10/04/odata-compression-in-windows-phone-7-5-mango.aspx" href="http://blogs.msdn.com/b/astoriateam/archive/2011/10/04/odata-compression-in-windows-phone-7-5-mango.aspx"&gt;http://blogs.msdn.com/b/astoriateam/archive/2011/10/04/odata-compression-in-windows-phone-7-5-mango.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On the client side, I am simply using HttpWebRequest to call the REST url, and including support for gzip via the ICSharpCode.SharpZipLib library (for example &lt;a title="http://nuget.org/packages/SharpZipLib-WP7/" href="http://nuget.org/packages/SharpZipLib-WP7/"&gt;http://nuget.org/packages/SharpZipLib-WP7/&lt;/a&gt; )&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here is the implementation of the WebClient:&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; async Task&amp;lt;T&amp;gt; GetData&amp;lt;T&amp;gt;(Uri uri, &lt;span class="kwrd"&gt;bool&lt;/span&gt; useJson = &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt; version3 = &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt; compress = &lt;span class="kwrd"&gt;true&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;                &lt;span class="rem"&gt;//uri = new Uri(uri.AbsoluteUri + "&amp;amp;format=json");&lt;/span&gt;&lt;br /&gt;                HttpWebRequest client = WebRequest.CreateHttp(uri);&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (compress)&lt;br /&gt;                        client.Headers[HttpRequestHeader.AcceptEncoding] = &lt;span class="str"&gt;"deflate, gzip"&lt;/span&gt;;&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (version3)&lt;br /&gt;                    {&lt;br /&gt;                        client.Headers[&lt;span class="str"&gt;"MaxDataServiceVersion"&lt;/span&gt;] = &lt;span class="str"&gt;"3.0"&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                    {&lt;br /&gt;                        client.Headers[&lt;span class="str"&gt;"MaxDataServiceVersion"&lt;/span&gt;] = &lt;span class="str"&gt;"2.0"&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (useJson)&lt;br /&gt;                        client.Accept = &lt;span class="str"&gt;"application/json"&lt;/span&gt;;&lt;br /&gt;                    &lt;br /&gt;                    &lt;span class="kwrd"&gt;using&lt;/span&gt; (WebResponse response = await client.GetResponseAsync())&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span class="kwrd"&gt;string&lt;/span&gt; result = await response.GetResponseText();&lt;br /&gt;&lt;br /&gt;                        DataContractJsonSerializer serializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractJsonSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));&lt;br /&gt;                        T resultType;&lt;br /&gt;                        &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(Encoding.Unicode.GetBytes(result)))&lt;br /&gt;                        {&lt;br /&gt;                            resultType = (T)serializer.ReadObject(stream);&lt;br /&gt;                        }&lt;br /&gt;                        &lt;span class="kwrd"&gt;return&lt;/span&gt; resultType;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; async Task&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; GetResponseText(&lt;span class="kwrd"&gt;this&lt;/span&gt; WebResponse response)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (&lt;br /&gt;            Stream stream = response.IsCompressed()&lt;br /&gt;                                   ? &lt;span class="kwrd"&gt;new&lt;/span&gt; GZipInputStream(response.GetResponseStream())&lt;br /&gt;                                   : response.GetResponseStream())&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(stream))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; await reader.ReadToEndAsync();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsCompressed(&lt;span class="kwrd"&gt;this&lt;/span&gt; WebResponse response)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Regex.IsMatch((response.Headers[&lt;span class="str"&gt;"Content-Encoding"&lt;/span&gt;] ?? &lt;span class="str"&gt;""&lt;/span&gt;)&lt;br /&gt;                                     .ToLower(), &lt;span class="str"&gt;"(gzip|deflate)"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(I am using Microsoft.Threading.Tasks.Extensions.dll to implement GetResponseAsync)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I am using DataContext classes generated by my SQL Server Compact Toolbox for deserialization, with a small addition - I have added this attribute to all EntitySet&amp;lt;T&amp;gt; and EntityRef&amp;lt;T&amp;gt; properties (this will be included in the next Toolbox release):&lt;/p&gt;&lt;br /&gt;&lt;p&gt;[global::System.Runtime.Serialization.IgnoreDataMember]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I am calling the following URL: &lt;a title="http://192.168.0.139:2065/SyncService.svc/PlaylistTracks" href="http://&amp;lt;MyIP&amp;gt;:2065/SyncService.svc/PlaylistTracks"&gt;http://&amp;lt;MyIP&amp;gt;:2065/SyncService.svc/PlaylistTracks&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is my test code: &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;//ATOM-XML&lt;/span&gt;&lt;br /&gt;await WebClient.GetData&amp;lt;PlaylistTrackRoot&amp;gt;(uri, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span class="rem"&gt;//Verbose json&lt;/span&gt;&lt;br /&gt;await WebClient.GetData&amp;lt;PlaylistTrackRoot&amp;gt;(uri, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span class="rem"&gt;//Verbose json + gzip&lt;/span&gt;&lt;br /&gt;await WebClient.GetData&amp;lt;PlaylistTrackRoot&amp;gt;(uri, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span class="rem"&gt;//Plain json&lt;/span&gt;&lt;br /&gt;await WebClient.GetData&amp;lt;PlaylistTrackRoot&amp;gt;(uri, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span class="rem"&gt;//Plain json + gzip&lt;/span&gt;&lt;br /&gt;await WebClient.GetData&amp;lt;PlaylistTrackRoot&amp;gt;(uri, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PlaylistTrackRoot { &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;PlaylistTrack&amp;gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; { get; set; } }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;And finally the unbelievable numbers for the download of the entire PlaylistTrack table with 8715 rows (remember, that ATOM is the default WCF Data Services client format)&lt;/p&gt;&lt;br /&gt;&lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;&lt;strong&gt;Payload type&lt;/strong&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="154"&gt;&lt;strong&gt;Body size (bytes)&lt;/strong&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="108"&gt;&lt;strong&gt;Body size (MB)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;ATOM-XML &lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="154"&gt;9,322,665 (100 % – default DS client implementation)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="108"&gt;8.89 MB&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;JSON (verbose)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="154"&gt;5,016,977 (54 %)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="108"&gt;4.78 MB&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;JSON (verbose) + gzip&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="154"&gt;328,410 (3,5 %)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="108"&gt;0.31 MB&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;JSON (plain)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="154"&gt;790,845 (8,5 %)&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="108"&gt;0.75 MB&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="136"&gt;JSON (plain) + gzip&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="163"&gt;&lt;em&gt;&lt;strong&gt;43,023 (0,5 %)&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="138"&gt;&lt;strong&gt;0.04 MB&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;So before you decide to use the WCF Data Services Windows Phone client, beware that the only format currently available is ATOM-XML. With the 5.1.0 or later desktop client, however, you can use the of the DataServiceContext to request JSON - ctx.Format.UseJson() – the default is still ATOM-XML.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/GtpRUzAPHdQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/GtpRUzAPHdQ/wcf-data-services-with-windows-phone.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/03/wcf-data-services-with-windows-phone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-8702514820281535494</guid><pubDate>Fri, 15 Mar 2013 11:14:00 +0000</pubDate><atom:updated>2013-03-15T12:14:20.389+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">Entity Framework</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Toolbox 3.3–Visual Guide of new features</title><description>&lt;p&gt;After more than 170.000 downloads, version 3.3 of my &lt;a href="http://sqlcetoolbox.codeplex.com/" target="_blank"&gt;SQL Server Compact Toolbox&lt;/a&gt; extension for Visual Studio 2012 and 2010 is now &lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1/" target="_blank"&gt;available for download&lt;/a&gt;. This blog post is a visual guide to the new features included in this release, many suggested by users of the tool via the &lt;a href="http://sqlcetoolbox.codeplex.com/workitem/list/basic" target="_blank"&gt;CodePlex issue tracker&lt;/a&gt; &lt;h3&gt;New text editor&lt;/h3&gt; &lt;p&gt;In this release, the text editor used for the SQL Query window has been updated to use the &lt;a href="http://nuget.org/packages/AvalonEdit/" target="_blank"&gt;AvalonEdit text control.&lt;/a&gt; The new control features improved syntax colour highlighting, also available during editing. In addition, the editor also enables search (use the new Search button on the toolbar), with hit highlighting: &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-I5MRdFDSjUQ/UUMCbrvhO4I/AAAAAAAABK0/imHFAmvaKIA/s1600-h/clip_image002%25255B4%25255D.jpg"&gt;&lt;img title="clip_image002" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002" src="http://lh5.ggpht.com/-Rlso5FIKtvQ/UUMCcZtkU0I/AAAAAAAABK8/CKP7jIVcTgA/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" width="475" height="291"&gt;&lt;/a&gt; &lt;h3&gt;New Maintenance menu&lt;/h3&gt; &lt;p&gt;In order to support the fact that the Server Explorer is no longer available for version 3.5 in Visual Studio 2012, I have now slowly begun adding features from the SQL Server Compact Server Explorer Tools. The first is the maintenance options: Shrink, Compact, Verify and Repair. &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-IdiOlad2uz0/UUMCdW1ao2I/AAAAAAAABLE/3IGUZIEdNhI/s1600-h/clip_image003%25255B4%25255D.png"&gt;&lt;img title="clip_image003" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image003" src="http://lh5.ggpht.com/-uAIEe9eodT8/UUMCecT8R3I/AAAAAAAABLM/T6Iib93anhw/clip_image003_thumb%25255B1%25255D.png?imgmax=800" width="451" height="123"&gt;&lt;/a&gt; &lt;h3&gt;Reinitialize Merge Replication subscriptions&lt;/h3&gt; &lt;p&gt;In addition to synchronizing Merge Replication subscriptions, it is now possible to re-initialize a subscription, meaning starting over with a new set of data from the server, but retaining any local data. &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Ccctdds8vCM/UUMCffE6JgI/AAAAAAAABLU/pPGkACfN_RQ/s1600-h/clip_image004%25255B4%25255D.png"&gt;&lt;img title="clip_image004" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image004" src="http://lh4.ggpht.com/-0zoQF_xrckI/UUMCgH2k1UI/AAAAAAAABLc/9IGzbjT6dO8/clip_image004_thumb%25255B1%25255D.png?imgmax=800" width="411" height="255"&gt;&lt;/a&gt; &lt;h3&gt;Script SQL Server data only&lt;/h3&gt; &lt;p&gt;The SQL Server scripting menu items have moved to a scripting menu and the missing “Script SQL Server Database Data” option is now there: &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-digrpXz7YA0/UUMChRbuLmI/AAAAAAAABLk/Iz3bHFd3fzg/s1600-h/clip_image006%25255B4%25255D.jpg"&gt;&lt;img title="clip_image006" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image006" src="http://lh4.ggpht.com/-Ox5Ys4Rw3e0/UUMCiohC3MI/AAAAAAAABLs/pAaxTngMms0/clip_image006_thumb%25255B1%25255D.jpg?imgmax=800" width="452" height="170"&gt;&lt;/a&gt; &lt;h3&gt;Improvements&lt;/h3&gt;&lt;br&gt; &lt;p&gt;SQL Server export - improved handling of default values and identical table names in different schemas (but this is not yet fully supported)&lt;br&gt;Less SmartAssembly prompts&lt;br&gt;CSV import error fixed&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/EEwMWM9zwJ0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/EEwMWM9zwJ0/sql-server-compact-toolbox-33visual.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-Rlso5FIKtvQ/UUMCcZtkU0I/AAAAAAAABK8/CKP7jIVcTgA/s72-c/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/03/sql-server-compact-toolbox-33visual.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-8179248491721685754</guid><pubDate>Tue, 12 Mar 2013 14:25:00 +0000</pubDate><atom:updated>2013-03-12T15:25:34.989+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #10 : generate a CREATE TABLE script</title><description>&lt;p&gt;Another entry in the scripting API samples, you will find an overview of &lt;a href="http://erikej.blogspot.dk/2013/03/sql-server-compact-code-snippet-of-week.html" target="_blank"&gt;getting started with the API here.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This weeks entry demonstrates the general pattern for scripting smaller chunks of SQL based on a single table, in this case a CREATE TABLE statement. The statement will also include any indexes and primary/foreign keys.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (IRepository repository = &lt;span class="kwrd"&gt;new&lt;/span&gt; DBRepository(&lt;span class="str"&gt;@"Data Source=C:\Northwind.sdf"&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;    Generator generator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Generator(repository, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var tableName &lt;span class="kwrd"&gt;in&lt;/span&gt; repository.GetAllTableNames())&lt;br /&gt;    { &lt;br /&gt;        generator.GenerateTableScript(tableName);&lt;br /&gt;    }&lt;br /&gt;    System.IO.File.WriteAllText(&lt;span class="str"&gt;@"C:\script.sqlce"&lt;/span&gt;, generator.GeneratedScript);    &lt;br /&gt;}&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The Generator / Generator4 class contains many methods to generate various script snippets, some of them &lt;a href="http://exportsqlce.codeplex.com/wikipage?title=Scripting%20API%20samples&amp;amp;referringTitle=Documentation" target="_blank"&gt;listed here.&lt;/a&gt; After a number of GenerateXx calls, you can use the GeneratedScript property to get the accumulated script.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/oFSwg0dXKYg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/oFSwg0dXKYg/sql-server-compact-code-snippet-of-week_12.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/03/sql-server-compact-code-snippet-of-week_12.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-9071528144332825556</guid><pubDate>Fri, 08 Mar 2013 13:20:00 +0000</pubDate><atom:updated>2013-03-08T14:20:30.976+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #9 : migrate a SQL Compact database to SQL Server</title><description>&lt;p&gt;This week’s snippet directly follows the one from &lt;a href="http://erikej.blogspot.dk/2013/03/sql-server-compact-code-snippet-of-week.html" target="_blank"&gt;previous week&lt;/a&gt;, demonstrating my SQL Server Compact &lt;a href="http://exportsqlce.codeplex.com/wikipage?title=Scripting%20API%20samples&amp;amp;referringTitle=Documentation" target="_blank"&gt;scripting API&lt;/a&gt; once again.&lt;/p&gt; &lt;p&gt;This time I will demonstrate how to migrate a complete SQL Server Compact database to SQL Server (LocalDB/Express/Full). The requirements are simply that the current user has access to an empty SQL Server database somewhere. Then all tables, constraints, indexes and data will be moved to the empty SQL Server database, all in just 6 lines of code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (IRepository ceRepository = &lt;span class="kwrd"&gt;new&lt;/span&gt; DB4Repository(&lt;span class="str"&gt;@"Data Source=C:\Data\SQLCE\Test\nw40.sdf"&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; fileName = Path.GetTempFileName();&lt;br /&gt;    var generator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Generator4(ceRepository, fileName);&lt;br /&gt;    generator.ScriptDatabaseToFile(Scope.SchemaData);&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; (IRepository serverRepository = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServerDBRepository4(&lt;span class="str"&gt;"Data Source=.;Trusted_Connection=true;Initial Catalog=Test"&lt;/span&gt;))&lt;br /&gt;    {&lt;br /&gt;        serverRepository.ExecuteSqlFile(fileName);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The code requires the following using statements:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;using ErikEJ.SqlCeScripting;&lt;br&gt;using System;&lt;br&gt;using System.IO;&lt;br&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The ServerDBRepository constructor simply requires any valid SQL Server ADO.NET connection string. &lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The ScriptDatabaseToFile creates a script file with all content of the database, and the ExecuteSqlFile method runs the script against a SQL Server database.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/v_ExG95Y5B0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/v_ExG95Y5B0/sql-server-compact-code-snippet-of-week_8.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/03/sql-server-compact-code-snippet-of-week_8.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-1521687583412384484</guid><pubDate>Sun, 03 Mar 2013 09:28:00 +0000</pubDate><atom:updated>2013-03-03T10:29:05.175+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #8 : script a database to SQLite</title><description>&lt;p&gt;This next instalment switches gears, and will demonstrate a simple usage of my SQL Server Compact scripting API, &lt;a href="http://exportsqlce.codeplex.com/" target="_blank"&gt;available on CodePlex.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This sample demonstrates how to create a script in SQLite format, but the general usage pattern is the same no matter what you are scripting. Notice that only three lines of code are required to complete this task!&lt;/p&gt; &lt;p&gt;In order to use the API, you must have the SQL Server Compact runtime installed and then reference the scripting API files. In order to script then add references to the scripting API DLL files,&amp;nbsp; SqlCeScripting40.dll and ISqlCeScripting.dll (use SqlCeScripting.dll instead of SqlCeScripting40.dll if you want to script 3.5 database files).&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; ErikEJ.SqlCeScripting;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SqlCeScript&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &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)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (IRepository repository = &lt;span class="kwrd"&gt;new&lt;/span&gt; DB4Repository(&lt;span class="str"&gt;@"Data Source=C:\Data\SQLCE\Test\nw40.sdf"&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                IGenerator generator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Generator4(repository, &lt;span class="str"&gt;@"C:\Temp\nwlite.sql"&lt;/span&gt;);&lt;br /&gt;                generator.ScriptDatabaseToFile(Scope.SchemaDataSQLite);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;First you initialize an IRepository instance, which takes a SQL Server Compact connection string as parameter. The you initialize a IGenerator instance, which takes a IRepository instance and an optional file name as parameter.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then you can simply call ScriptDatabaseToFile which takes a scope a parameter, which defines what to be scripted; data, schema, schema and data, or as in this case schema and data in SQLite format.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following IRepository implementations are available: DBRepository (SQL Server Compact 3.5 SP2), DB4Repository (SQL Server Compact 4.0) and ServerDBRepository (SQL Server 2005 or later)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In order to create a SQLite database for the script file created (c:\temp\nwlite.sql), you can use the sqlite3.exe command line utility like so:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New"&gt;sqlite3 nwlite.db &amp;lt; nwlite.sql&lt;/font&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/U9vparNuo8s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/U9vparNuo8s/sql-server-compact-code-snippet-of-week.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/03/sql-server-compact-code-snippet-of-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-5741099852139505871</guid><pubDate>Mon, 25 Feb 2013 13:25:00 +0000</pubDate><atom:updated>2013-02-25T14:25:15.458+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Some SQL Server Compact Toolbox usage graphs</title><description>&lt;p&gt;The anonymously collected usage statistics provide by SmartAssembly in the latest release of the Toolbox also provides some general counters, that may be of general interest. Keep in mind that these figures are collected amongst Visual Studio users, and therefore do not represent the general public. The figures represent about 2000 Toolbox installations.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;Visual Studio version used&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-G8BHjtCuJrg/UStmKe-QD2I/AAAAAAAABHg/3AaWqqBU0Rg/s1600-h/image4.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-K82NvSRPsNU/UStmK7-27KI/AAAAAAAABHo/LYcf1kEs0Ds/image_thumb2.png?imgmax=800" width="426" height="280"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;More than 50% of the Toolbox users have Visual Studio 2012 installed.&lt;/p&gt; &lt;h3&gt;OS platform&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Rw1iIorgS9A/UStmLvWW89I/AAAAAAAABHw/1yJBLJ5XeeQ/s1600-h/image13.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-2_bjglm7kys/UStmMKLg-oI/AAAAAAAABH4/8vwm6ATrT3M/image_thumb7.png?imgmax=800" width="424" height="278"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;30% of the Toolbox users are using Windows 8, 66% Windows 7 and hardly any use Vista/XP&lt;/p&gt; &lt;h3&gt;OS bitness&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-AciYmElBhQo/UStmMj8UxvI/AAAAAAAABIA/4hgQW4jemwg/s1600-h/image16.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-RLmVsluMdJI/UStmNsaH0FI/AAAAAAAABII/VlaVvdn2xRw/image_thumb8.png?imgmax=800" width="427" height="272"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Only 15% of the Toolbox users run a 32 bit OS.&lt;/p&gt; &lt;h3&gt;CPU cores&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-IuRTZzOvfLc/UStmOFwWL3I/AAAAAAAABIQ/lnEA0tbp2R0/s1600-h/image20.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-NuQL7QuhLZU/UStmOrsEyrI/AAAAAAAABIY/UjWZoOJu5n8/image_thumb10.png?imgmax=800" width="421" height="268"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Toolbox users have modern machines – 75% of the users have a CPU with 4 cores or more&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/0ukQg1DueKY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/0ukQg1DueKY/some-sql-server-compact-toolbox-usage.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-K82NvSRPsNU/UStmK7-27KI/AAAAAAAABHo/LYcf1kEs0Ds/s72-c/image_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/some-sql-server-compact-toolbox-usage.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-7783512568940446918</guid><pubDate>Tue, 19 Feb 2013 21:21:00 +0000</pubDate><atom:updated>2013-02-27T11:50:32.286+01:00</atom:updated><title>Fix for Entity Framework poor INSERT performance with SQL Server Compact and server generated keys</title><description>&lt;p&gt;In this blog post I will describe the steps I took in order to find out why the title above was the case, and how it could be fixed.&lt;/p&gt; &lt;p&gt;On Stackoverflow the general opinion was that the reported slowness was &lt;a href="http://stackoverflow.com/questions/7027711/inserting-a-large-number-of-rows-into-sql-ce-4-0-with-entity-framework-4-perfor/7028020#7028020" target="_blank"&gt;“by design”&lt;/a&gt; and could not be fixed, but looking at &lt;a href="http://stackoverflow.com/questions/14768394/exponentially-deteriorating-performance-on-inserts-in-sql-server-compact-4-0-tab" target="_blank"&gt;recent tests&lt;/a&gt; posted on Stackoverflow pointed to the fact that something was not done right.&lt;/p&gt; &lt;p&gt;Since Entity Framework is now Open Source and &lt;a href="http://entityframework.codeplex.com/" target="_blank"&gt;available on CodePlex,&lt;/a&gt; I decided to have a deeper look.&lt;/p&gt; &lt;p&gt;To test if the process could be improved, I created the following console app:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; EF6SqlCETest&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Entity;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &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)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var db = &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentContext())&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                Stopwatch sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                db.Database.Delete();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                sw.Start();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                db.Database.CreateIfNotExists();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                db.Configuration.AutoDetectChangesEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                db.Configuration.ProxyCreationEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                Console.WriteLine(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    &lt;span class="str"&gt;"Db created in {0}"&lt;/span&gt;, sw.Elapsed.ToString());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                sw.Restart();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 4000; i++)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                    var student = &lt;span class="kwrd"&gt;new&lt;/span&gt; Student { Name = Guid.NewGuid().ToString() };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                    db.Students.Add(student);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                Console.WriteLine(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                    &lt;span class="str"&gt;"Entities added in {0}"&lt;/span&gt;, sw.Elapsed.ToString());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                sw.Restart();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="kwrd"&gt;int&lt;/span&gt; recordsAffected = db.SaveChanges();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                sw.Stop();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                Console.WriteLine(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                    &lt;span class="str"&gt;"Saved {0} entities to the database, press any key to exit."&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                    recordsAffected);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                Console.WriteLine(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                    &lt;span class="str"&gt;"Saved entities in {0}"&lt;/span&gt;, sw.Elapsed.ToString());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                Console.ReadKey();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Student &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }        &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; StudentContext : DbContext&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Student&amp;gt; Students { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The test project and the related app.config is available for download here: &lt;a title="http://sdrv.ms/UCL2j5" href="http://sdrv.ms/UCL2j5"&gt;http://sdrv.ms/UCL2j5&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The test code is a simple Code First DbContext model. For each run I start with a new blank database, and creates it before doing SaveChanges, so that part of the process can be timed individually. The 2 options on lines 17 and 18 are there to ensure that the for loop runs quickly, without these option the loop adding objects takes much longer (test for yourself).&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The resulting table looks like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [Students] (&lt;br&gt;  [Id] &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;  &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt; (1,1)&lt;br&gt;  , [Name] nvarchar(4000) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;&lt;br&gt;);&lt;br&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [Students] &lt;span class="kwrd"&gt;ADD&lt;/span&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [PK_dbo.Students] &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; ([Id]);&lt;br&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;In order to find out where time was spent during SaveChanges, I ran a Visual Studio Performance Analysis. It turned out that all the time was spent in sqlceqp40.dll, the SQL Server Compact 4.0 unmanaged query processor – so something was amiss.&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;As described in my &lt;a href="http://erikej.blogspot.com/2011/08/viewing-sql-statements-created-by.html" target="_blank"&gt;earlier blogpost&lt;/a&gt;, the SQL statements generated in order to return the server generated id (the IDENTITY value), looked like the following:&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;SELECT [Id] FROM [Students] WHERE [Id] = @@IDENTITY&lt;/font&gt;&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;So using the SQL Server Compact Toolbox, I coulde analyze the 2 statements:&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-aqZUd-y0w7E/USPs083hHwI/AAAAAAAABGY/Rk7Ggb8g1ug/s1600-h/image3.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-i9bRnIPWIkc/USPs1x_-elI/AAAAAAAABGg/x83Zt1b5wE8/image_thumb1.png?imgmax=800" width="393" height="143"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;And got the following result:&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-8krVFjv96fg/USPs2I4dxlI/AAAAAAAABGo/76Qr2wMwzQI/s1600-h/image14.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-bgofJv3JXWg/USPs3AAiFsI/AAAAAAAABGw/BMQ64trpKh8/image_thumb8.png?imgmax=800" width="410" height="311"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;So for every INSERT, a table scan was performed, as for some reason, the SQL Server Compact query processor could not figure out to do an Index Seek. And the more rows to be scanned, the worse the performance got. And all the time for the operation was spent doing this.&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;In order to avoid this, I decided that the goal of the statement executed should be to avoid table scans, but return a value with the exact same shape as the previous statement executed, that is; it should have the name of the IDENTITY column, and be of the correct type (only bigint and int are supported as IDENTITY types with SQL Server Compact).&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The return value of @@IDENTITY &lt;a href="http://msdn.microsoft.com/en-us/library/ms174021.aspx" target="_blank"&gt;is numeric&lt;/a&gt;, so simply using “SELECT @@IDENTITY AS [Id]” would not work. So the statement could be:&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;SELECT [Id] FROM [Students] WHERE [Id] = CAST(@@IDENTITY as int)&lt;/font&gt;&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The type could then be either int or bigint and the column alias should of course be the correct column name.&lt;/p&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;I could then analyze the modified statement:&lt;/p&gt;&lt;a href="http://lh4.ggpht.com/-CAp1pPug8S0/US3k74tDvvI/AAAAAAAABI4/in9E-6CiX3A/s1600-h/image%25255B10%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-MRcacAStX9U/US3k8mchHDI/AAAAAAAABJA/cvnd2HL5EWE/image_thumb%25255B6%25255D.png?imgmax=800" width="470" height="131"&gt;&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-Pvh7kAi9S-c/US3k9Iq0eiI/AAAAAAAABJI/dKyC74qKIAQ/s1600-h/image%25255B9%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-027aAJG8Pqs/US3k9tQ4BxI/AAAAAAAABJQ/wRNGnNj5aiY/image_thumb%25255B5%25255D.png?imgmax=800" width="469" height="242"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And no table scan, instead an index seek, consuming only 19% of the total query cost instead of 100%.&lt;br&gt;&lt;br&gt;And so this is what I have &lt;a href="http://entityframework.codeplex.com/workitem/857" target="_blank"&gt;implemented in my fix&lt;/a&gt;, that I now need to figure out how to “submit a pull request” for.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/Zip_KYFh6eg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/Zip_KYFh6eg/fix-for-entity-framework-poor-insert.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-i9bRnIPWIkc/USPs1x_-elI/AAAAAAAABGg/x83Zt1b5wE8/s72-c/image_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/fix-for-entity-framework-poor-insert.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-8749771908898425765</guid><pubDate>Tue, 19 Feb 2013 03:59:00 +0000</pubDate><atom:updated>2013-02-19T04:59:01.677+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #7 : get the full path to a database file</title><description>&lt;p&gt;A SQL Server Compact &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.connectionstring(v=vs.100).aspx"&gt;connection string&lt;/a&gt; allows you to specify the database name in various ways:&lt;/p&gt; &lt;p&gt;Data Source=c:\data\mydb.sdf&lt;/p&gt; &lt;p&gt;Data Source=mydb.sdf&lt;/p&gt; &lt;p&gt;Data Source=|DataDirectory|\mydb.sdf&lt;/p&gt; &lt;p&gt;But sometimes you need the full path to the database file based on a user defined connection string. This week’s code snippet allows you to do exactly that, and it is a little bit quirky, as it works around a bug in SQL Server Compact 4.0 SP1, that causes use of |DataDirectory| to not be resolved correctly using only the SqlCeConnectionStringBuilder.&lt;/p&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PathFromConnectionString(&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionString)&lt;br /&gt; {&lt;br /&gt;      SqlCeConnectionStringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlCeConnectionStringBuilder(GetFullConnectionString(connectionString));&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.DataSource;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetFullConnectionString(&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionString)&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlCeReplication repl = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlCeReplication())&lt;br /&gt;     {&lt;br /&gt;         repl.SubscriberConnectionString = connectionString;&lt;br /&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; repl.SubscriberConnectionString;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;Notice that the code above only works with version 4.0, not 3.5 &lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/AmGv9RZttrY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/AmGv9RZttrY/sql-server-compact-code-snippet-of-week_19.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/sql-server-compact-code-snippet-of-week_19.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-1646686215442671600</guid><pubDate>Tue, 12 Feb 2013 13:31:00 +0000</pubDate><atom:updated>2013-02-12T14:31:52.335+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #6 : list all user tables in a database</title><description>&lt;p&gt;This week’s short code snippet shows how to list all the user table objects in a SQL Server Compact database file. Notice that a SQL Server Compact database can also contain a number of system tables, these can be created by the Merge Replication/RDA/Sync Framework APIs. The metadata (like list of tables) is not exposed as tables, but as something called views, specifically the &lt;a href="http://msdn.microsoft.com/en-us/library/ms174156.aspx" target="_blank"&gt;INFORMATION_SCHEMA views&lt;/a&gt; (despite the fact that SQL Server Compact does not support user defined views). &lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;SELECT table_name AS Name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE &amp;lt;&amp;gt; N'SYSTEM TABLE'&lt;/font&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/h5TNJg5-zdU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/h5TNJg5-zdU/sql-server-compact-code-snippet-of-week_12.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/sql-server-compact-code-snippet-of-week_12.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-2447693456292731870</guid><pubDate>Mon, 04 Feb 2013 16:43:00 +0000</pubDate><atom:updated>2013-02-04T17:43:02.854+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #5 : rename a table</title><description>&lt;p&gt;The SQL Server Compact ADO.NET provider allows you to rename a table name by using the &lt;a href="http://msdn.microsoft.com/en-us/library/bb726044(v=sql.105).aspx" target="_blank"&gt;special sp_rename&lt;/a&gt; T-SQL “command” (SQL Server Compact does not support stored procedures, but this “command” corresponds to the &lt;a href="http://msdn.microsoft.com/en-us/library/ms188351.aspx" target="_blank"&gt;sp_rename system stored procedure&lt;/a&gt; on SQL Server).&lt;/p&gt; &lt;p&gt;You cannot only use sp_rename against a table in SQL Server Compact using the ADO.NET interfaces, but using the native OLEDB interfaces, you can also rename columns, as Joao &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/53fcc9a6-265b-4b2d-9cbf-03ae4d8611db" target="_blank"&gt;demonstrates here.&lt;/a&gt; This is used in his &lt;a href="http://primeworks-mobile.com/Products/DataPortConsole.html" target="_blank"&gt;Data Port Console product&lt;/a&gt;. Otherwise you can just script a DROP and CREATE statement with the SQL Server Compact Toolbox, and rename both column and table names in the CREATE script.&lt;/p&gt; &lt;p&gt;To rename a table, use the following T-SQL code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;sp_rename &lt;span class="str"&gt;'OldName'&lt;/span&gt;, &lt;span class="str"&gt;'NewName'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/Nr3fJ9zcHBM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/Nr3fJ9zcHBM/sql-server-compact-code-snippet-of-week.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/sql-server-compact-code-snippet-of-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-983350834406692895</guid><pubDate>Fri, 01 Feb 2013 12:00:00 +0000</pubDate><atom:updated>2013-02-01T13:00:25.938+01:00</atom:updated><title>Fixing the Entity Framework designer “Generate Database from Model” T4 template</title><description>&lt;p&gt;The Entity Framework Designer include a reverse engineer feature called “Generate Database from Model” that enables a “Model first” workflow, and also enable you to persist any model modification in a new database. &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-O3NVegi9v-s/UQuuUfJBDlI/AAAAAAAABFg/-ePHXYz-NnY/s1600-h/image6.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-O0_w8tYI5qo/UQuuUyckclI/AAAAAAAABFo/eMA1_MOTPJQ/image_thumb2.png?imgmax=800" width="283" height="278"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The T4 template used for this feature supports both SQL Server and SQL Server Compact, but unfortunately lacks consistency in it’s use of the GO keyword. GO is used after each statement, except FOREIGN KEY constraint creation statements. Apart for being inconsistent, this also prevents SQL Server Compact Toolbox from executing the script, without a number of manual edits.&lt;/p&gt; &lt;p&gt;I have proposed a fix &lt;a href="http://entityframework.codeplex.com/workitem/824" target="_blank"&gt;on Codeplex&lt;/a&gt; for the next version of the designer, but it will not happen until version 7 (if ever).&lt;/p&gt; &lt;p&gt;So in the meantime, I have updated the template to fix this, you can start using it today as replacement for the current one as follows:&lt;/p&gt; &lt;p&gt;1: Download my updated T4 file &lt;a href="https://skydrive.live.com/redir?resid=47E59E4BEB70472B!1605&amp;amp;authkey=!AKX0WID8C9dJOzg" target="_blank"&gt;from here.&lt;/a&gt; (The same file is used in both Visual Studio 2010 and 2012)&lt;/p&gt; &lt;p&gt;2: Copy the downloaded SSDLToSQL10GOFixed.tt file to the&lt;br&gt;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen folder&lt;br&gt;(for VS 2012) &lt;br&gt;or to &lt;br&gt;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen &lt;br&gt;(for VS 2010).&lt;/p&gt; &lt;p&gt;3: With the Entity Framework designer open, go to properties, and select the new file as the DDL Generation template:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-_nu4VBCVA8A/UQuuVitB2zI/AAAAAAAABFw/joZhstv0qHc/s1600-h/image8.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-L5tOSKD2TSc/UQuuWVgYbCI/AAAAAAAABF4/oh7zI5PmZG4/image_thumb4.png?imgmax=800" width="373" height="266"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;4: Generate the script.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/Ax8_hDqavKQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/Ax8_hDqavKQ/fixing-entity-framework-designer.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-O0_w8tYI5qo/UQuuUyckclI/AAAAAAAABFo/eMA1_MOTPJQ/s72-c/image_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>15</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/02/fixing-entity-framework-designer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-3727933490455703295</guid><pubDate>Mon, 28 Jan 2013 11:20:00 +0000</pubDate><atom:updated>2013-01-28T17:16:57.936+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #4 : select rows 50 to 60 from a table</title><description>&lt;p&gt;For many scenarios it can be useful to be able to get only a subset of rows fro a long result set. SQL Server Compact version 4.0 adds support for the OFFSET – FETCH keywords, that allows you to retrieve a single “page” of data. Sadly, this is not possible with version 3.5. Notice, that &lt;a href="http://erikej.blogspot.dk/2011/11/windows-phone-local-database-tip.html" target="_blank"&gt;this syntax is supported&lt;/a&gt; on the SQL Server Compact version used on Windows Phone, despite the 3.5 label of that runtime.&lt;/p&gt; &lt;p&gt;For 4.0 you can use:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;SELECT [Order ID]&lt;br&gt;,[Product ID]&lt;br&gt;,[Unit Price]&lt;br&gt;,[Quantity]&lt;br&gt;,[Discount]&lt;br&gt;FROM [Order Details]&lt;br&gt;ORDER BY [Order Id]&lt;br&gt;OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY&lt;br&gt;GO&lt;/font&gt;  &lt;p&gt;This statement returns only 10 rows.  &lt;p&gt;For 3.5, you can only use TOP, and must then skip the rows that you do not need:  &lt;p&gt;&lt;font face="Courier New"&gt;SELECT TOP (60) [Order ID]&lt;br&gt;,[Product ID]&lt;br&gt;,[Unit Price]&lt;br&gt;,[Quantity]&lt;br&gt;,[Discount]&lt;br&gt;FROM [Order Details]&lt;br&gt;ORDER BY [Order Id]&lt;br&gt;GO&lt;/font&gt;  &lt;p&gt;This statement returns 60 rows, and you must manually skip the first 50.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/gFmtpe_1CoQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/gFmtpe_1CoQ/sql-server-compact-code-snippet-of-week_28.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/01/sql-server-compact-code-snippet-of-week_28.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-5000802205675717078</guid><pubDate>Tue, 22 Jan 2013 08:47:00 +0000</pubDate><atom:updated>2013-01-22T09:47:26.001+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #3 : locate the rowversion column in a table</title><description>&lt;p&gt;The third data type that is only allowed to appear in a single column per table is the rowversion &lt;a href="http://technet.microsoft.com/en-us/library/bb726005.aspx" target="_blank"&gt;data type&lt;/a&gt;, also known as timestamp (no relation to datetime). Rowversion is a data type that exposes automatically generated, unique binary numbers in a database, and contains unique values across the entire database. The size is 8 bytes. You can use the &lt;a href="http://technet.microsoft.com/en-us/library/bb734405.aspx" target="_blank"&gt;@@DBTS function&lt;/a&gt; to get the most recent rowversion value in the database.&lt;/p&gt; &lt;p&gt;Here is the code to determine if a table has a rowversion column, and get the column ordinal (position in the table):&lt;/p&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; Int32 GetRowVersionOrdinal(&lt;span class="kwrd"&gt;string&lt;/span&gt; tableName)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = ExecuteScalar(&lt;span class="str"&gt;"SELECT ordinal_position FROM information_schema.columns WHERE TABLE_NAME = '"&lt;/span&gt; + tableName + &lt;span class="str"&gt;"' AND data_type = 'rowversion'"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;span class="kwrd"&gt;value&lt;/span&gt; - 1;&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/krI2FFPXlUI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/krI2FFPXlUI/sql-server-compact-code-snippet-of-week_22.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/01/sql-server-compact-code-snippet-of-week_22.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-6941622783880623844</guid><pubDate>Mon, 14 Jan 2013 18:15:00 +0000</pubDate><atom:updated>2013-01-14T19:15:28.180+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #2 : locate the IDENTITY column in a table</title><description>&lt;p&gt;The next instalment in this series also concerns a column type that only exists once per table, the &lt;a href="http://msdn.microsoft.com/en-us/library/ms174639.aspx" target="_blank"&gt;IDENTITY column&lt;/a&gt;. The type of the column must be either bigint or int, and you must also specify an initial value (seed) and the value for the difference between each value (the increment), the default values for both being 1.&lt;/p&gt; &lt;p&gt;In order to detect which column is the IDENTITY column, you can use the following SQL statement (an code):&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; HasIdentityColumn(&lt;span class="kwrd"&gt;string&lt;/span&gt; tableName)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (GetIdentityOrdinal(tableName) &amp;gt; -1);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetIdentityOrdinal(&lt;span class="kwrd"&gt;string&lt;/span&gt; tableName)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = ExecuteScalar(&lt;span class="str"&gt;"SELECT ordinal_position FROM information_schema.columns WHERE TABLE_NAME = N'"&lt;/span&gt; + tableName + &lt;span class="str"&gt;"' AND AUTOINC_SEED IS NOT NULL"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;span class="kwrd"&gt;value&lt;/span&gt; - 1;&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/I842T0G5r0g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/I842T0G5r0g/sql-server-compact-code-snippet-of-week_14.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/01/sql-server-compact-code-snippet-of-week_14.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-412091605898658441</guid><pubDate>Fri, 11 Jan 2013 12:27:00 +0000</pubDate><atom:updated>2013-01-11T13:57:29.061+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">Merge Replication</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Toolbox 3.2–Visual Guide of new features</title><description>&lt;p&gt;After more than 150.000 downloads, version 3.2 of my &lt;a href="http://sqlcetoolbox.codeplex.com/" target="_blank"&gt;SQL Server Compact Toolbox&lt;/a&gt; extension for Visual Studio 2012 and 2010 is now &lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1/" target="_blank"&gt;available for download&lt;/a&gt;. This blog post is a visual guide to the new features included in this release, many suggested by users of the tool via the &lt;a href="http://sqlcetoolbox.codeplex.com/workitem/list/basic" target="_blank"&gt;CodePlex issue tracker&lt;/a&gt;&lt;br&gt; &lt;h3&gt;Export from SQL Server to SQL Server Compact 4.0 in a single workflow&lt;/h3&gt; &lt;p&gt;Previously with the Toolbox, in order to export a SQL Server database to SQL Server Compact, you had to export a script, create a new blank 4.0 database file, and then run the script against this new file. This process has been simplified to a single workflow, where you define the database and tables to export, and then specify the 4.0 database file name.  &lt;p&gt;To use the feature, right click the root node in the Toolbox:  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-QEwOL5TEsbM/UPALzPFDtUI/AAAAAAAABBI/t5odu2cUSdQ/s1600-h/clip_image0014.png"&gt;&lt;img title="clip_image001" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image001" src="http://lh3.ggpht.com/-VGNk0c7zdtc/UPAL0Az2PDI/AAAAAAAABBQ/yh9bS5ySl64/clip_image001_thumb1.png?imgmax=800" width="438" height="201"&gt;&lt;/a&gt;  &lt;p&gt;Select the server database:  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-9uWmiXmUsMM/UPAL09g3oII/AAAAAAAABBU/jDaLp7dlYKs/s1600-h/clip_image0024.png"&gt;&lt;img title="clip_image002" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002" src="http://lh5.ggpht.com/-s8o-jrop9s0/UPAL1xKZoII/AAAAAAAABBg/z4_OEOJ8ea0/clip_image002_thumb1.png?imgmax=800" width="315" height="408"&gt;&lt;/a&gt;  &lt;p&gt;If selecting a LocalDB database, type (localdb)\v11.0 in the server name box, and type the database name, do &lt;b&gt;not &lt;/b&gt;pick the database name from the dropdown list and do &lt;b&gt;not&lt;/b&gt; press the test connection button. This is caused by the fact that this connection dialog (that supports SQL Server authentication) uses an old API to connect to SQL Server, which only partially works with LocalDB.  &lt;p&gt;Select which tables to be scripted:  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-cxXtnp4bAus/UPAL2m1zcuI/AAAAAAAABBk/-fONfszSg8s/s1600-h/clip_image0034.png"&gt;&lt;img title="clip_image003" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image003" src="http://lh4.ggpht.com/-JnEbnylByAw/UPAL3Z56zsI/AAAAAAAABBw/MkfxHlIhY5M/clip_image003_thumb1.png?imgmax=800" width="319" height="323"&gt;&lt;/a&gt;  &lt;p&gt;And type the name of the new SQL Server Compact database file:  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-UjJTJGJAWXk/UPAL4dH-ReI/AAAAAAAABB0/bexRUQWydl0/s1600-h/clip_image0044.png"&gt;&lt;img title="clip_image004" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004" src="http://lh3.ggpht.com/-7-nGQBSwy9U/UPAL5NE2aEI/AAAAAAAABB8/wyVh4CMSwHQ/clip_image004_thumb1.png?imgmax=800" width="392" height="216"&gt;&lt;/a&gt;  &lt;p&gt;Once the background process completes, you can see in the Visual Studio status bar that the export completed:  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-S9rNH5PJ5Ok/UPAL53u2RHI/AAAAAAAABCE/wx_qDW_JjCc/s1600-h/clip_image0054.png"&gt;&lt;img title="clip_image005" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image005" src="http://lh6.ggpht.com/-6OJO24H4tnI/UPAL6noDWmI/AAAAAAAABCQ/TU39FRV0k8A/clip_image005_thumb1.png?imgmax=800" width="211" height="110"&gt;&lt;/a&gt;  &lt;p&gt;As this is a new feature, please provide any suggestion for improving it…&lt;br&gt; &lt;h3&gt;Option to preserve Server schema names as part of Server export files&lt;/h3&gt; &lt;p&gt;There is now a new option that enables you to keep the Server schema name (for example dbo) as part of the exported table name:  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-TdJbMl5HALc/UPAL7dVsvCI/AAAAAAAABCU/OBAq3pBpA4A/s1600-h/clip_image0064.png"&gt;&lt;img title="clip_image006" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image006" src="http://lh5.ggpht.com/-n3-Tq1MAcmU/UPAL8Acg9-I/AAAAAAAABCc/K40AoT32mwg/clip_image006_thumb1.png?imgmax=800" width="353" height="161"&gt;&lt;/a&gt;  &lt;p&gt;Once this feature is enabled, the resulting CREATE TABLE script will look like this:  &lt;p&gt;CREATE TABLE &lt;b&gt;[dbo.Shippers]&lt;/b&gt; (  &lt;p&gt;[Shipper ID] int NOT NULL IDENTITY (33,1)  &lt;p&gt;, [Company Name] nvarchar(40) NOT NULL  &lt;p&gt;);  &lt;p&gt;rather than the usual:  &lt;p&gt;CREATE TABLE &lt;b&gt;[Shippers]&lt;/b&gt; (  &lt;p&gt;[Shipper ID] int NOT NULL IDENTITY (33,1)  &lt;p&gt;, [Company Name] nvarchar(40) NOT NULL  &lt;p&gt;);  &lt;p&gt;This does not mean that SQL Server Compact now supports or understands the concept of schemas, it simply means that the table name is now: “dbo.Shippers”  &lt;p&gt;&amp;nbsp; &lt;h3&gt;Red Gate SmartAssembly integration&lt;/h3&gt; &lt;p&gt;As I &lt;a href="http://erikej.blogspot.dk/2012/12/integrating-red-gate-smartassembly-in.html" target="_blank"&gt;blogged about earlier&lt;/a&gt;, SmartAssembly is now integrated with the Toolbox for error reporting and anonymous feature usage tracking. If you encounter an error that merits being reported to me, so I can fix it in a future release, please do so.  &lt;p&gt;Once an error is encountered, you will see this dialog:  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-8WOv2zBb1qU/UPAL9DVQUPI/AAAAAAAABCo/ZQjYfjrKov0/s1600-h/clip_image0073.png"&gt;&lt;img title="clip_image007" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image007" src="http://lh3.ggpht.com/-JKtl1juZ340/UPAL94C7uFI/AAAAAAAABCs/Ya_fshY6EZI/clip_image007_thumb.png?imgmax=800" width="244" height="155"&gt;&lt;/a&gt;  &lt;p&gt;If the error is not expected, click “Send Error Report”:  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-d3MKsPIBGtA/UPAL-1PU47I/AAAAAAAABC0/j0fhsYrUFjk/s1600-h/clip_image0083.png"&gt;&lt;img title="clip_image008" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image008" src="http://lh4.ggpht.com/-QCjeRr8ONRQ/UPAL_pAVQ7I/AAAAAAAABC8/SvU6t3zsZFc/clip_image008_thumb.png?imgmax=800" width="244" height="155"&gt;&lt;/a&gt;  &lt;p&gt;Enter your email address if desired, and I will contact you regarding the error, and click send:  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-opGZZa0Ru0U/UPAMAUkIsMI/AAAAAAAABDE/hoC1dMksO8w/s1600-h/clip_image0093.png"&gt;&lt;img title="clip_image009" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image009" src="http://lh4.ggpht.com/-4vhkeI6YZrY/UPAMBUdqVYI/AAAAAAAABDQ/7rIslkDvgRo/clip_image009_thumb.png?imgmax=800" width="244" height="155"&gt;&lt;/a&gt;  &lt;p&gt;I have also added an option to opt out of feature tracking:  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-o-EMDuogTuQ/UPAMCXIIpPI/AAAAAAAABDU/KZbMVLuwJFI/s1600-h/image2.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-rC9dP-QI7y0/UPAMDOckNaI/AAAAAAAABDg/gHUroT9j4rQ/image_thumb.png?imgmax=800" width="244" height="164"&gt;&lt;/a&gt;  &lt;p&gt;&amp;nbsp; &lt;h2&gt;Improvements&lt;/h2&gt; &lt;p&gt;SQL Server tables displayed are properly sorted by schema.name:  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-jE4XVxo50kc/UPAMDzaXSNI/AAAAAAAABDo/405reJ7F-Uo/s1600-h/clip_image0104.png"&gt;&lt;img title="clip_image010" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image010" src="http://lh5.ggpht.com/-h8vWzcr4bOo/UPAME4CZYCI/AAAAAAAABDs/Bmk2nK4hijA/clip_image010_thumb1.png?imgmax=800" width="291" height="295"&gt;&lt;/a&gt;  &lt;p&gt;Notifying user that 3.5 SP2 is required for many features to work - this has now become an issue on new Windows 8 installation with Visual Studio 2012 only, as SQL Server Compact 3.5 SP2 is not installed on these systems:  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-_jHO1ILMXzk/UPAMGbnfupI/AAAAAAAABD4/Qp3vS1-sbZE/s1600-h/clip_image0114.png"&gt;&lt;img title="clip_image011" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image011" src="http://lh6.ggpht.com/-FTZGwZSOAKU/UPAMHEwZUVI/AAAAAAAABD8/Tq07LqHwZ60/clip_image011_thumb1.png?imgmax=800" width="300" height="83"&gt;&lt;/a&gt;  &lt;p&gt;Click the red link:  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-jaK7AvizInI/UPAMH1mdqWI/AAAAAAAABEE/UfWCcdrK4Vk/s1600-h/clip_image0124.png"&gt;&lt;img title="clip_image012" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image012" src="http://lh6.ggpht.com/-shmTn5lK1jk/UPAMIl9rGNI/AAAAAAAABEM/6YUfsOdo0Ow/clip_image012_thumb1.png?imgmax=800" width="324" height="159"&gt;&lt;/a&gt;  &lt;p&gt;As always, you can use the About box (blue question mark on the toolbar above) to see what SQL Server Compact components you have installed (notice that the Visual Studio 2012 Server Explorer does not support SQL Server Compact 3.5, so no DDEX provider in VS 2012):  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-7PftbF_5aOk/UPAMJfX-oTI/AAAAAAAABEU/J6rRCjg0z8Q/s1600-h/clip_image0134.png"&gt;&lt;img title="clip_image013" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image013" src="http://lh6.ggpht.com/-96Q7_dEcbJM/UPAMKnz_j7I/AAAAAAAABEg/HDTP3sZx0y4/clip_image013_thumb1.png?imgmax=800" width="261" height="298"&gt;&lt;/a&gt;  &lt;p&gt;Improved SQL Server DGML diagram, the DGML feature now works with AdventureWorks2012.&lt;br&gt;&lt;br&gt;Improved object tree view performance, in particular for databases with many objects.&lt;br&gt;&lt;/p&gt; &lt;h3&gt;Bug fixes&lt;/h3&gt; &lt;p&gt;SQL query editor button texts now visible with Visual Studio 2012 dark theme:  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-MQN2j0CU_P8/UPAMLSNFRJI/AAAAAAAABEk/FsNRDL2hR6M/s1600-h/clip_image014%25255B4%25255D.png"&gt;&lt;img title="clip_image014" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image014" src="http://lh5.ggpht.com/-ljT0Ag9E7xk/UPAMMCQ4wMI/AAAAAAAABEw/iIuWeek5_rE/clip_image014_thumb%25255B3%25255D.png?imgmax=800" width="421" height="89"&gt;&lt;/a&gt;  &lt;p&gt;Merge Replication dialog fixed to work with "Windows Integrated Authentication":  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ogaJKosdi4k/UPAMNNdxlsI/AAAAAAAABE0/0YxIp66gjjI/s1600-h/clip_image015%25255B1%25255D.png"&gt;&lt;img title="clip_image015" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image015" src="http://lh4.ggpht.com/-HAs9Pwsl0Qs/UPAMN1xgWQI/AAAAAAAABE8/x1UeauhAoUw/clip_image015_thumb.png?imgmax=800" width="376" height="385"&gt;&lt;/a&gt;  &lt;p&gt;Updated scripting API, with foreign key related bug fixes, and various performance improvements&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/z47DzW3Xgnk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/z47DzW3Xgnk/sql-server-compact-toolbox-32visual.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-VGNk0c7zdtc/UPAL0Az2PDI/AAAAAAAABBQ/yh9bS5ySl64/s72-c/clip_image001_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/01/sql-server-compact-toolbox-32visual.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-7038692347584325424</guid><pubDate>Mon, 07 Jan 2013 14:32:00 +0000</pubDate><atom:updated>2013-01-07T15:32:45.172+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Code Snippet of the Week #1 : locate the ROWGUIDCOL column in a table</title><description>&lt;p&gt;During the next many weeks, I plan to publish a short, weekly blog post with a (hopefully) useful code snippet relating to SQL Server Compact. The code snippets will come from 3 different areas: SQL Server Compact T-SQL statements, ADO.NET code and samples usage of &lt;a href="http://exportsqlce.codeplex.com/wikipage?title=Scripting%20API%20samples&amp;amp;referringTitle=Documentation" target="_blank"&gt;my scripting API.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The ROWGUIDCOL column property is defined like this in Books Online:&lt;/p&gt; &lt;p&gt;Indicates that the new column is a row global unique identifier column. Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.  &lt;p&gt;ROWGUIDCOL automatically generates values for new rows inserted into the table.  &lt;p&gt;(You can also use a default of NEWID() to automatically assign values to uniqueidentifier columns)  &lt;p&gt;The ROWGUIDCOL is used by Merge Replication, all Merge Replicated tables must have a ROWGUIDCOL column.  &lt;p&gt;Enough talk, show me the code snippet:&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; column_flags, column_name, table_name &lt;br /&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; information_schema.columns&lt;br /&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; column_flags = 378 &lt;span class="kwrd"&gt;OR&lt;/span&gt; column_flags = 282&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I am using the undocumented “column_flags” column to determine the ROWGUIDCOL column, and the reason for the 2 different values is that a uniqueidentifier column can be either NULL or NOT NULL.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/rn1ZaTwV5gM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/rn1ZaTwV5gM/sql-server-compact-code-snippet-of-week.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2013/01/sql-server-compact-code-snippet-of-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-3306777575700387598</guid><pubDate>Wed, 19 Dec 2012 10:25:00 +0000</pubDate><atom:updated>2012-12-19T11:25:02.606+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">SQL Server Compact Edition</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>Integrating Red Gate SmartAssembly in the SQL Server Compact Toolbox</title><description>&lt;p&gt;In the next release of the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1/" target="_blank"&gt;SQL Server Compact Toolbox&lt;/a&gt;, which is currently available in an &lt;a href="http://sqlcetoolbox.codeplex.com/releases/view/98714" target="_blank"&gt;alpha release&lt;/a&gt;, I will start using &lt;a href="http://www.red-gate.com/products/dotnet-development/smartassembly/" target="_blank"&gt;Red Gate SmartAssembly&lt;/a&gt; for Error Reporting and quality improvement. In this blog post I will describe the few steps required to integrate SmartAssembly with the Visual Studio VISX build process and in code. Some of these steps are not well documented on the SmartAssembly support site, as in this case we are protecting a DLL file, not an .exe (the more common case), so I thought I would share my findings.&lt;/p&gt; &lt;p&gt;SmartAssembly is a .NET instrumentation tool, that offers centralised error reporting and feature usage tracking (it also offers various obfuscation features, but I am not using these), and includes a nice desktop client, that integrates all the features of the product in a single UI, including viewing your Error Reports and Feature Usage statistics.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-3S3bExHCIow/UNGV7QoqBAI/AAAAAAAAA_w/6Q9DIopYIH4/s1600-h/image%25255B7%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-V8qd0KaoH28/UNGV8QTDpGI/AAAAAAAAA_4/rXLzZXzQH_c/image_thumb%25255B3%25255D.png?imgmax=800" width="352" height="320"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;h3&gt;MSBuild integration&lt;/h3&gt; &lt;p&gt;Once you have downloaded SmartAssembly, you can create a new SmartAssembly project (.saproj file) – do this for your add-in DLL, and save the file. Then look at the useful instructions &lt;a href="http://www.red-gate.com/supportcenter/Content/SmartAssembly/help/6.7/SA_UsingSmartAssemblyWithMSBuild" target="_blank"&gt;on this support page&lt;/a&gt;. You will need to make a change to the instructions on that page, and possibly also your .saproj file:&lt;/p&gt; &lt;p&gt;In your .csproj file (VISX Add-In project), change the SmartAssembly build task to run AfterCompile, not AfterBuild, like this, and add OverwriteAssembly="True" :&lt;/p&gt; &lt;p&gt;&amp;lt;Target&lt;b&gt; &lt;/b&gt;&lt;b&gt;Name&lt;/b&gt;&lt;b&gt;=&lt;/b&gt;&lt;b&gt;"AfterCompile"&lt;/b&gt; Condition=" '$(Configuration)' == 'Release' "&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;lt;SmartAssembly.MSBuild.Tasks.Build OverwriteAssembly="True" ProjectFile="C:\Data\SQLCE\CodePlexTFS\TFS07\SqlCeToolbox\SqlCe35Toolbox\SqlCeToolbox.saproj" /&amp;gt; &lt;p&gt;&amp;lt;/Target&amp;gt; &lt;p&gt;Change the source file in you .saproj file to point to the DLL file in the obj folder, not the bin folder, like so: &lt;p&gt;&amp;lt;MainAssemblyFileName&amp;gt;&lt;b&gt;.\obj\Release\SqlCeToolbox.dll&lt;/b&gt;&amp;lt;/MainAssemblyFileName&amp;gt; &lt;p&gt;This will allow SmartAssembly to instrument your DLL after it has been built, but before it is added to the .VSIX file (which is a .zip file) &lt;p&gt;&amp;nbsp; &lt;h3&gt;Invoking Error Reporting in Code&lt;/h3&gt; &lt;p&gt;As the Toolbox is an add-in, I prefer not to catch any unhandled Visual Studio exceptions, but would still like to be able to report any errors occurring in the Toolbox, in order to be able to improve it. SmartAssembly easily allows you to to this.&lt;/p&gt; &lt;p&gt;Start by adding references to&amp;nbsp; SmartAssembly.ReportException.dll and SmartAssembly.ReportUsage.dll in the C:\Program Files\Red Gate\SmartAssembly 6\SDK\bin folder from your project.&lt;/p&gt; &lt;p&gt;Then in order to invoke Error Reporting, use:&lt;/p&gt;&lt;pre class="csharpcode"&gt;SmartAssembly.ReportException.ExceptionReporting.Report(ex);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Then when a handled exception occurs, the user will see this dialog:&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-qQKK0B1K8Ug/UNGV-AdFzeI/AAAAAAAAA_8/6-0qVhr0QpE/s1600-h/image%25255B3%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-rBzq1p6Rdzg/UNGV-8Hn6RI/AAAAAAAABAI/sLgkb-Yw8D8/image_thumb%25255B1%25255D.png?imgmax=800" width="337" height="225"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;And to report usage use:&lt;pre class="csharpcode"&gt;SmartAssembly.ReportUsage.UsageCounter.ReportUsage(feature);&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Where feature is the name of the feature in question.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hope you found it useful.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/WEZbhTL381E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/WEZbhTL381E/integrating-red-gate-smartassembly-in.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-V8qd0KaoH28/UNGV8QTDpGI/AAAAAAAAA_4/rXLzZXzQH_c/s72-c/image_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://erikej.blogspot.com/2012/12/integrating-red-gate-smartassembly-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-3497012542599486007</guid><pubDate>Thu, 29 Nov 2012 14:27:00 +0000</pubDate><atom:updated>2012-11-29T15:27:26.721+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">Merge Replication</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>SQL Server Compact Merge Replication Library alpha released</title><description>&lt;p&gt;I have just published a new &lt;a href="https://sqlcemergelib.codeplex.com/" target="_blank"&gt;Codeplex project&lt;/a&gt;, that contains a library to help with SQL Server Merge Replication using SQL Server Compact 3.5 SP2.  &lt;p&gt;This library simplifies the code and configuration to do Merge Replication from a SQL Server Compact 3.5 SP2 desktop client, with a number of useful helper methods.&lt;br&gt;Features:  &lt;ul&gt; &lt;li&gt;Is intended for use from a WinForms or WPF application, and the Synchronize method runs async.  &lt;li&gt;Implements best practices for optimal performance, and attempt to properly detect expired subscriptions, by throwing a PublicationMayHaveExpiredException.  &lt;li&gt;Will create the database file for you as required, so an existing database file is not required.  &lt;li&gt;Optionally logs sync status to a SyncLog table (which is a part of the publication)  &lt;li&gt;Generate INSERT script in order to rescue local data in case of a disaster (for example publication expiry)  &lt;li&gt;Validate a Publication, for example after initial Sync  &lt;li&gt;Properly format a SqlCeException as a string to get all available error information  &lt;li&gt;Source includes a demo form to test app.config parameters and see the library in action&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;using ErikEJ.SqlCeMergeLib;&lt;br /&gt;using System.Data.SqlServerCe;&lt;br /&gt;...&lt;br /&gt;string sdfFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MergeTest.sdf");&lt;br /&gt;conn = new SqlCeConnection(string.Format("Data Source={0}", sdfFile));&lt;br /&gt;&lt;br /&gt;DateTime syncDate = sync.GetLastSuccessfulSyncTime(conn);&lt;br /&gt;textBox1.Text = "Last Sync: " + syncDate.ToString();&lt;br /&gt;&lt;br /&gt;sync.Completed += SyncCompletedEvent;&lt;br /&gt;sync.Progress += SyncProgressEvent;&lt;br /&gt;sync.Synchronize(conn, 1002);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Other useful methods:&lt;br&gt;Generate INSERT script for the local database (for disaster recovery):&lt;pre&gt;public string GenerateInsertScripts (&lt;br /&gt;        SqlCeConnection connection,&lt;br /&gt;        List&amp;lt;string&amp;gt; tableNames&lt;br /&gt;) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Format a SqlCeException as a String:&lt;pre&gt;public string ShowErrors (&lt;br /&gt;        SqlCeException e&lt;br /&gt;) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Validate that the local database is properly Merge Replicated;&lt;pre&gt;public bool Validate (&lt;br /&gt;        SqlCeConnection connection&lt;br /&gt;) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Configuration:&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;appSettings&amp;gt;&lt;br /&gt;    &amp;lt;add key="InternetLogin" value=""/&amp;gt;&lt;br /&gt;    &amp;lt;add key="InternetPassword" value=""/&amp;gt;&lt;br /&gt;    &amp;lt;add key="InternetUrl" value="http://erik-pc/ssce35sync/sqlcesa35.dll"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="Publication" value="PubPostCodes"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="Publisher" value="Erik-PC\SQL2008R2"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="PublisherDatabase" value="PostCodes"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="PublisherLogin" value="sa"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="PublisherPassword" value="pw"/&amp;gt;&lt;br /&gt;    &amp;lt;add key="UseNT" value="false"/&amp;gt;&lt;br /&gt;  &amp;lt;/appSettings&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;img title="repl.jpg" alt="repl.jpg" src="http://www.codeplex.com/Download?ProjectName=sqlcemergelib&amp;amp;DownloadId=553158"&gt; &lt;br /&gt;&lt;p&gt;Hope you will find it useful, and please post any bugs and suggestion via the &lt;a href="https://sqlcemergelib.codeplex.com/workitem/list/basic" target="_blank"&gt;Issue Tracker on CodePlex.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Note, that it appears that Merge Replication against SQL Server 2012 with SP1 or later &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/c3156645-f403-4ad6-aa30-3618e065068d" target="_blank"&gt;is currently broken&lt;/a&gt; (but works with SQL Server 2012 RTM).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/ys7kXFDaSvk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/ys7kXFDaSvk/sql-server-compact-merge-replication.html</link><author>noreply@blogger.com (ErikEJ)</author><thr:total>2</thr:total><feedburner:origLink>http://erikej.blogspot.com/2012/11/sql-server-compact-merge-replication.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5238131531249720750.post-8882568693329422273</guid><pubDate>Tue, 27 Nov 2012 08:20:00 +0000</pubDate><atom:updated>2012-11-27T09:20:23.630+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 3.5</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">SQL Compact 4.0</category><title>SQL Server Compact Toolbox 3.1.1 with support for Windows Phone 8 and VS 2012 released</title><description>&lt;p&gt;Just a short note to let you know, that the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1" target="_blank"&gt;SQL Server Compact Toolbox add-in&lt;/a&gt; has been updated beginning of this month to support the following new features:&lt;/p&gt; &lt;p&gt;Generation of a LINQ to SQL DataContext for Windows Phone 8 projects in Visual Studio 2012. (Like Windows Phone 7.5, Windows Phone 8 supports a so-called “Local Database”, which is a SQL Server Compact Database accessible only via LINQ to SQL). This feature will allow you to generate a Phone specific DataContext, I have blogged about this earlier as you can see under the heading &lt;strong&gt;ErikEJ &lt;/strong&gt;&lt;a href="http://erikej.blogspot.dk/2011/07/windows-phone-sql-server-compact.html" target="_blank"&gt;on this page.&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-b8Urh7USkdY/ULR3v1D0wkI/AAAAAAAAA_M/oHn9U6MLQA8/s1600-h/image%25255B4%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-ySanKWI_IMM/ULR3w-pCj-I/AAAAAAAAA_U/Ablxk5y_CD8/image_thumb%25255B2%25255D.png?imgmax=800" width="303" height="265"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In addition, the Toolbox is now able to use sqlmetal.exe on “clean” Windows 8 systems, with only Visual Studio 2012 Pro or higher installed.&lt;/p&gt; &lt;p&gt;Also note, that the Toolbox supports SQL Server Compact 3.5 database files even under VS 2012, despite the fact, that the VS 2012 Server Explorer no longer supports SQL Server Compact 3.5 (this requires the SQL Server Compact 3.5 SP2 desktop MSI to be installed, of course – &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=5783" target="_blank"&gt;download from here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~4/gpQAkQiQFJI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ErikejBlogsAboutSqlCompactnetAndRelatedStuff/~3/gpQAkQiQFJI/sql-server-compact-toolbox-311-with.html</link><author>noreply@blogger.com (ErikEJ)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-ySanKWI_IMM/ULR3w-pCj-I/AAAAAAAAA_U/Ablxk5y_CD8/s72-c/image_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://erikej.blogspot.com/2012/11/sql-server-compact-toolbox-311-with.html</feedburner:origLink></item></channel></rss>
