SQL Server 2022 LocalDB Download

TLDR: here is the URL to download the English (en-US) MSI installer for SQL Server 2022 LocalDb:

For (my) future reference: here’s how I found it

  • Download the SQL Server 2022 Express Installer SQL2022-SSEI-Expr.exe from the the SQL Server downloads page.
  • Open it in ILSpy.
  • Save the Microsoft.Sql.Installer.UI.Externals.InstallerEngine.dll embedded resource to a new file.
  • Open this file in ILSpy also and locate the Manifest_Media_Express_en-US.xml embedded resource, in which you will find a reference to SqlLocalDB.msi, which combined with the DownloadRoot URL just above it gives you the required location.

If you want the installer for other languages (e.g. German (de-DE), Spanish (es-ES)) then look in the Manifest_Media_Express XML file for that language.

SOLVED: Connecting iPhone to L2TP/IPSec VPN on EE

TLDR: VPNs sometimes don’t work on EE’s mobile network due to IPv6. This blog post contains a ready-made device profile that forces IPv4 on EE’s mobile data network.

I set up a L2TP/IPSec VPN on my Synology Diskstation to be able to connect to the home network when out and about. While this works fine when I’m on WiFi, I couldn’t get it to work when on EE’s mobile data network on my iPhone. When connecting VPN I would get the message “The L2TP-VPN server did not respond. Try reconnecting. if the problem continues, verify your settings and contact your Administrator”

There are various posts on https://community.ee.co.uk that suggested it might be to do with Data Content Controls, but enabling Full Access here didn’t help.

There are other posts that suggest it is something to do with IPv6, and disabling IPv6 would do the trick, but iOS 12 doesn’t appear to have an end-user configurable option to do so.

Thankfully, there is a way I discovered thanks to this Apple StackExchange answer using the Apple Configurator which is a freely-available macOS tool typically used by businesses to customise their employees’ iOS devices. Using the Apple Configurator you can create a profile file which is an XML file with a “.mobileconfig” file extension.

By creating a cellular configuration you can specify the APN settings (Access Point Names) used by your phone that lets it know how to log onto the mobile data network of your provider and you can force it to use just IPv4. The EE ones available from apn-settings.com so I filled them in and also set the IP versions to just IPv4

To install the EE IPv4-only profile

Here is the profile I created: EE APN IPv4.mobileconfig ← click this link to download the profile. You will be prompted: “This website is trying to open Settings to show you a configuration profile. Do you want to allow this?”

Click Allow and on the Install Profile screen click Install at the top right:

Follow any prompts to install the profile.

To remove the profile

If you switch to another carrier, especially if you are roaming in another country you might need to remove the profile for mobile data to work (I don’t know for sure, not tried it abroad yet). To remove the profile, go to Settings > General > Profile & Device Management:

From here you can remove the profile.

How to get YouTube to permanently use the larger video player size (without extensions or plugins)

It’s annoyed me for some time that the player size option in YouTube has become increasingly hidden away, and is forgotten every time you restart your browser.


Thankfully the option is stored simply in a cookie (wide=1), which is easy enough to set so that it is reasonably permanent without using any browser plugins or extensions.

Google Chrome

If you use the Google Chrome browser follow these instructions:

  1. First go to youtube.com (important, otherwise the cookie will not get set)
  2. In your browser address bar type javascript: (lowercase, the colon is important)
  3. Paste this code after the javascript: you just typed:
    document.cookie = "wide=1;domain=youtube.com;expires=Fri, 31 Dec 9999 23:59:59 GMT"

Now any videos you watch from now on should be in the larger video player every time you visit YouTube.

Internet Explorer

Recent versions of Internet Explorer don’t seem to allow you to type in arbitrary JavaScript into the browser address bar so you have to use the F12 Developer Tools to run the script.

  1. First go to youtube.com (important, otherwise the cookie will not get set)
  2. Press the F12 function key , or choose F12 Developer Tools from the Tools menu button at the top right:
  3. In the window that appears, click the Console tab and at the very bottom at the >> prompt paste the following code;
    document.cookie = "wide=1;domain=youtube.com;expires=Fri, 31 Dec 9999 23:59:59 GMT"

You can now close the F12 Developer Tools window and enjoy the larger video player every time you visit YouTube.

Hope that helps!

Detecting if .NET Framework 4.5 is installed

There have been a number of posts on this already by Scott Hanselman and Rick Strahl, but I needed a simple way to detect if .NET 4.5 was installed from somewhere basic like a batch file.

I’m not sure where I came across this but it works well for me. The solution is to query for the existence of the following registry key:


So in my batch file I can simply use reg query to do the work:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5" 2>nul
if errorlevel 1 (
    echo .NET Framework 4.5 is NOT installed
) else (
    echo .NET Framework 4.5 is installed

Note that there’s a more complicated way documented on MSDN, but the above method is easy to use from a batch file and works well for my purposes.

Hope that helps!

Backing up AppHarbor SQL Server databases using BACPACs

One of the regularly requested features for AppHarbor is a way to get full backups from SQL Server databases there. The official line so far has been to use the AppHarbor-SqlServerBulkCopy tool to bulk copy the data from the hosted server to a local copy. This requires you to have an empty target database into which to squirt the data.

I’ve found a more convenient mechanism to get a simple backup of AppHarbor hosted databases using the *.BACPAC files, which it seems were created originally for getting databases in and out of Microsoft’s Azure cloud-hosting platform.

BACPAC files are Data-Tier Applications (aka DAC) packages which are essentially ZIPs that contain an XML representation of the schema:

… and the actual table data stored in JSON format:

Schema-only packages have a DACPAC file extension instead.

(Bob Beauchemin has some good info on Data-Tier Applications (DAC) on his blog)

You can backup and restore databases in SQL Server Management Studio 2012 (the Express version is fine) – look for the Import/Export “Data-tier Applications” commands on the context menu.

I think “Data-tier Applications” are what we are supposed to call databases now…


If you want to do this programmatically, use Microsoft.SqlServer.Dac.dll which can be found in C:Program Files (x86)Microsoft SQL Server110DACbin if you have some flavour of SQL Server 2012 installed.

Exporting is simple enough:

using Microsoft.SqlServer.Dac;
// Export
var dacServices = new DacServices(remoteConnectionString);
dacServices.Message += (sender, e) => Console.WriteLine(e.Message);
dacServices.ExportBacpac(@"C:tempMyDb.bacpac", "MyDb");

And importing is similarly straightforward:

// Import
var dacServices = new DacServices(localConnectionString);
dacServices.Message += (sender, e) => Console.WriteLine(e.Message);

var package = BacPackage.Load(@"C:tempMyDb.bacpac");
dacServices.ImportBacpac(package, "MyDb");


There is a command-line tool called SqlPackage which provides access to the same functionality, but it wasn’t until recently that it got the ability to export a bacpac for some reason. The SqlPackage.exe export feature was included as part of the SQL Server Data-Tier Application Framework (September 2012) update.

Download (http://go.microsoft.com/fwlink/?LinkID=266427) and install the appropriate flavour of DACFramework.msi.


"C:Program Files (x86)Microsoft SQL Server110DACbinSqlPackage.exe" ^
    /Action:Export ^
    /SourceConnectionString:"Server=foo.sqlserver.sequelizer.com; Database=dbXYZ; User ID=blah; Password=Pa55w0rd" ^


"C:Program Files (x86)Microsoft SQL Server110DACbinSqlPackage.exe" ^
    /Action:Import ^
    /SourceFile:"C:tempMyDb.bacpac" ^
    /TargetConnectionString:"Server=.sqlexpress; Database=MyDb; Integrated Security=True"

Hope that comes in useful for you!

Build Views command for Visual Studio

A simple command to add to your Visual Studio External Commands menu that will do a sanity check of all your views (and plain old ASPX pages for that matter):

It calls the aspnet_compiler tool on the current web project displaying the results n the Output window:

To set this up, go to Tool > External Tools and add an item with the Command set to to cmd.exe and Arguments set to:

/c echo Build Views for $(ProjectFileName) && if not exist "$(ProjectDir)web.config" (echo ERROR: Not a web project! && exit) else (call "%VS110COMNTOOLS%vsvars32.bat" && aspnet_compiler.exe -v temp -p $(ProjectDir) && echo SUCCESS)

If you are running Visual Studio 2010 then change  %VS110COMNTOOLS% to %VS100COMNTOOLS%.

FIXED: iCloud Photo Stream stops syncing on Windows

I’ve had this happen a few times now, not sure what causes it, but iCloud Photo Stream occasionally stops syncing on Windows 7 for me.

The way I have fixed it is to reset iCloud  by:

  1. stopping the Photo Stream process ApplePhotoStreams.exe using Windows Task Manager
  2. renaming the %APPDATA%Apple ComputerMediaStream directory (i.e. C:UsersusernameAppDataRoamingApple ComputerMediaStream)
  3. log out and back in again
  4. restart iCloud (Start, type iCloud, press Enter) and re-enable Photo Stream.

Judging by this thread on the Apple Forums uninstalling and re-installing iCloud also seems to do the trick, but of you’re reasonably computer savvy, my method may be a little bit quicker.

With any luck, the next version of iCloud will fix this issue.

Solution for “Package ‘Microsoft SQL Management Studio Package’ failed to load”

I had an odd issue where SQL Server Management Studio (SSMS) 2008 R2 would start up, display the following error message, then exit:

Package ‘Microsoft SQL Management Studio Package’ failed to load

Using SysInternals Process Monitor tool to monitor SSMS.exe it seemed that it was looking for the following registry key but not finding it:

HKEY_CURRENT_USERSoftwareMicrosoftMicrosoft SQL Server100Tools

By renaming a parent key (rather than delete it – just in case it didn’t fix the issue) solved the issue for me. The key I renamed was:

HKEY_CURRENT_USERSoftwareMicrosoftMicrosoft SQL Server

Running SSMS again recreated the 100Tools sub keys and all was well again. I hope it works for you too.

Once helper for ASP.NET MVC

Here’s an ASP.NET MVC HTML Helper that helps in the following scenario. Let’s say you have a partial that can be included a number of times in a view but has a bit of common code that need only be included once. Typically that bit of common code would be some script.

In ASP.NET such a scenario is addressed by RegisterClientScriptBlock. In the Spark View Engine it’s taken care of by the once attribute.

So, inspired by Phil Haack’s Templated Razor Delegates post from earlier this year I knew you could write helper functions for Razor that could take arbitrary markup. The key to it is taking a Func argument that returns a HelperResult.

To use it you invoke it like so:

@Html.Once("some unique key", @<div>arbitrary markup that gets rendered just once</div>)

More typically, for including script, e.g.:

@Html.Once("TABLE_SORTER_INIT_SCRIPT", @<script type="text/javascript">
    $(function() {
        $('table.sortable th').each(function(){
            // . . .

Here’s the implementation that adds the Once extension method to HtmlHelper:

using System;
using System.Web.Mvc;
using System.Web.WebPages;

namespace Foo
    public static class HtmlUtils
        public static HelperResult Once(this HtmlHelper html, string key, Func<object, HelperResult> template)
            var httpContextItems = html.ViewContext.HttpContext.Items;
            var contextKey = "HtmlUtils.Once." + key;
            if (!httpContextItems.Contains(contextKey))
                // Render and record the fact in HttpContext.Items
                httpContextItems.Add(contextKey, null);
                return template(null);
                // Do nothing, already rendered something with that key
                return new HelperResult(writer => { /*no-op*/ });

Hope that helps!

How to change the font size in Chrome Developer Tools

When presenting on JavaScript or jQuery I’ll typically spend a lot of time in the Chrome Developer Tools window at the console. The problem is that, depending on the projection facilities and the resolution the fonts can be too small to read.

The Chrome devtools themselves are built out of HTML and CSS so I started digging for how I could edit the stylesheet. You can view the default devtool stylesheet by navigating to chrome-devtools://devtools/devTools.css. You can’t easily edit this though (it’s probably buried as a resource within Chrome), but you can override its styles using the standard custom user stylesheet Custom.css!

Custom.css lives at:

  • Windows: C:Users<user>AppDataLocalGoogleChromeUser DataDefaultUser StyleSheets
  • Mac OS X: ~/Library/Application Support/Google/Chrome/Default/User Stylesheets/

The style(s) to add and override in Custom.css are:

body.platform-mac .monospace, body.platform-mac .source-code {
    font-family: Monaco, monospace;

/* Keep .platform-mac to make the rule more specific than the general one above. */
body.platform-mac.platform-mac-snowleopard .monospace,
body.platform-mac.platform-mac-snowleopard .source-code {
    font-size: 11px !important;
    font-family: Menlo, monospace;

body.platform-windows .monospace, body.platform-windows .source-code {
    font-size: 12px !important;
    font-family: Consolas, Lucida Console, monospace;

body.platform-linux .monospace, body.platform-linux .source-code {
    font-size: 11px !important;
    font-family: dejavu sans mono, monospace;

A nice touch is that the styles update automatically as you save Custom.css so you can tweak it on the fly to get the right font-size for your audience.

Chrome DevTools with a larger font-size

Hope that helps!