I wrote simple console application (based on "HOW TO: Upgrade a version 3.x database file to SQL Server Compact 4.0") to upgrade (convert) CE databases with previous verions to SQL Server Compact 4.0 There is the code: or you can download whole project of the tool.
/// Program.cs
using System;
using System.Data.SqlServerCe;
namespace CEUpdate
{
class Program
{
static void Main(string[] args)
{
Console.Write(@"Source DB (*.sdf file Ex.: C:\Database.sdf): ");
string sourceDB = Console.ReadLine().Trim();
Console.Write("Password (If DB is password protected, otherwise hit Enter): ");
string password = Console.ReadLine().Trim();
Console.Write(@"Destination DB (*.sdf file Ex.: C:\temp.sdf): ");
string destinationDB = Console.ReadLine().Trim();
if (string.IsNullOrEmpty(sourceDB))
{
Console.WriteLine("Error: source DB can't be empty.");
Console.Write("Press any key to exit...");
Console.ReadKey();
}
else
if (string.IsNullOrEmpty(destinationDB))
{
Console.WriteLine("Error: destination DB can't be empty.");
Console.Write("Press any key to exit...");
Console.ReadKey();
}
else
if (sourceDB.Equals(destinationDB, StringComparison.CurrentCultureIgnoreCase))
{
Console.WriteLine("Error: destination and source can't be the same.");
Console.Write("Press any key to exit...");
Console.ReadKey();
}
else
{
string connection = "Data Source=\"" + sourceDB + "\"";
if (!string.IsNullOrEmpty(password))
connection += ";Password=" + password;
using (var engine = new SqlCeEngine(connection))
{
engine.EnsureVersion40(sourceDB, destinationDB);
}
Console.Write("Done! \nPress any key to exit...");
Console.ReadKey();
}
}
}
}
/// SqlCeUpgrade.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Data.SqlServerCe;
public static class SqlCeUpgrade
{
public static void EnsureVersion40(this SqlCeEngine engine, string source, string destination)
{
SQLCEVersion fileversion = DetermineVersion(source);
if (fileversion == SQLCEVersion.SQLCE20)
throw new ApplicationException("Unable to upgrade from 2.0 to 4.0");
if (SQLCEVersion.SQLCE40 > fileversion)
{
engine.Upgrade(String.Format("Data Source=\"{0}\"", destination));
}
}
private enum SQLCEVersion
{
SQLCE20 = 0,
SQLCE30 = 1,
SQLCE35 = 2,
SQLCE40 = 3
}
private static SQLCEVersion DetermineVersion(string filename)
{
var versionDictionary = new Dictionary<int, SQLCEVersion>
{
{ 0x73616261, SQLCEVersion.SQLCE20},
{ 0x002dd714, SQLCEVersion.SQLCE30},
{ 0x00357b9d, SQLCEVersion.SQLCE35},
{ 0x003d0900, SQLCEVersion.SQLCE40}
};
int versionLONGWORD = 0;
try
{
using (var fs = new FileStream(filename, FileMode.Open))
{
fs.Seek(16, SeekOrigin.Begin);
using (BinaryReader reader = new BinaryReader(fs))
{
versionLONGWORD = reader.ReadInt32();
}
}
}
catch
{
throw;
}
if (versionDictionary.ContainsKey(versionLONGWORD))
{
return versionDictionary[versionLONGWORD];
}
else
{
throw new ApplicationException("Unable to determine database file version");
}
}
}
Sources:
Reply