I was recently trying to ressurect an older project developed in Windows XP, .NET Framework 2.0, Visual Studio 2005, NHibernate, and SQL Server CE 3.1. I’ve sinced moved to Windows 7 (64-bit) and Visual Studio 2008.
I ran into a surprising number of hurdles while trying to get the application up and running again on 64-bit Windows 7. I figure I would document this here, just in case anyone else runs into the same issues.
Step 1) Try to build the solution. Everything builds fine after installing SQL Server Compact Edition.
Step 2) Try to run the application. Get an exception immediately:
“Could not create the driver from NHibernate.Driver.SqlServerCeDriver.”
“The IDbCommand and IDbConnection implementation in the assembly System.Data.SqlServerCe could not be found. Ensure that the assembly System.Data.SqlServerCe is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly.”
Turns out the issue here is that the System.Data.SqlServerCe dll has to be in the same folder as the application executable. Pretty easy fix – set Copy Local to ‘True’ on the reference to System.Data.SqlServerCe.
Step 3) Run the application again – now I get a different exception:
“Unable to load DLL ‘sqlceme35.dll’: The specified module could not be found. (Exception from HRESULT: 0x8007007E)”
Turns out the issue with this exception is that SQL Server Compact Edition is built for x86 and has to run in WoW mode on x64 systems. My solution platform is set to ‘Any CPU’, which worked fine when I was developing on Windows XP. To fix the issue, go through all of the Visual Studio projects – go to Properties > Build > Platform Target, and set Platform Target to ‘x86′ instead of ‘Any CPU’.
Step 4) Try to run the application again… and I get yet another exception:
“ADOException: cannot open connection” with InnerException of:
“The database file has been created by an earlier version of SQL Server Compact. Please upgrade using SqlCeEngine.Upgrade() method.”
This is kind of annoying – the Visual Studio 2008 Upgrade Wizard changed all my references from SQL Server CE 3.1 to SQL Server 3.5. How thoughtful. Unfortunately, I don’t know what the implications of ‘upgrading’ the database are. Everything worked fine with 3.1 – why introduce any more change to the application? So, I set the references back to SQL Server CE 3.1 instead of 3.5.
Step 5) Run the application… again.
No exceptions! Everything works with SQL Server 3.1! Upgrade complete.