How to deploy SQL Server Compact Edition 4.0?

前端 未结 3 1798
花落未央
花落未央 2020-11-27 11:13

How do i deploy Microsoft SQL Server Compact 4.0?


SQL Server Compact Edition (currently at version 4.0) is:

a free, embedded database th

3条回答
  •  自闭症患者
    2020-11-27 11:56

    For Sql Server Ce 4.0 SP1:

    Instead of tackling all the gritty stuff of deployment, I just opted to include the setup files themselves into my exe as EmbeddedResource and did this little helper:

     public static class RedistHelper
        {
            private static readonly ILog Log = LogManager.GetLogger(
                                                  MethodBase.GetCurrentMethod().DeclaringType);
    
            private static readonly string SqlCeRedistName64 = "SSCERuntime_x64-ENU.exe";
            private static readonly string SqlCeRedistName32 = "SSCERuntime_x86-ENU.exe";
            private static readonly Dictionary Assemblies = 
                            new Dictionary(StringComparer.OrdinalIgnoreCase);
    
            private static string SqlCeRedistName
            {
                get 
                {
                    return Environment.Is64BitOperatingSystem 
                                           ? SqlCeRedistName64 
                                           : SqlCeRedistName32;
                }
            }
    
            public static bool IsSqlCeInstalled()
            {
                RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                                               RegistryView.Registry64);
                RegistryKey ret = localKey.OpenSubKey(
                        @"SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v4.0\ENU");
                return ret != null;
            }
    
            private static byte[] ReadFully(Stream input)
            {
                byte[] buffer = new byte[16 * 1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                        ms.Write(buffer, 0, read);
                    return ms.ToArray();
                }
            }
    
            public static Assembly OnCurrentDomainOnAssemblyResolve(object sender,
                                                                    ResolveEventArgs args)
            {
                Assembly dll;
                var name = new AssemblyName(args.Name).Name + ".dll";
                if (!Assemblies.TryGetValue(name, out dll))
                {
                    Assembly res = typeof(RedistHelper).Assembly;
                    using (Stream input =
                               res.GetManifestResourceStream(typeof(RedistHelper), name))
                    {
                        if (input == null)
                        {
                            Log.WarnFormat("Assembly {0} does not contain {1}", res, name);
                            return null;
                        }
                        dll = Assembly.Load(ReadFully(input));
                        if (dll == null)
                        {
                            Log.WarnFormat("Assembly {0} failed to load.", name);
                            return null;
                        }
                        Log.InfoFormat("Loaded assembly {0}.", name);
                        Assemblies[name] = dll;
                        return dll;
                    }
                }
                return dll;
            }
    
            public static void InstallSqlCe()
            {
                using (Stream stream =
                           typeof(RedistHelper).Assembly.GetManifestResourceStream(
                               typeof(RedistHelper), SqlCeRedistName))
                {
                    Debug.Assert(stream != null);
                    byte[] bytes = new byte[(int)stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    string path = Path.Combine(Path.GetTempPath(), SqlCeRedistName);
    
                    if (File.Exists(path))
                        File.Delete(path);
    
                    File.WriteAllBytes(path, bytes);
    
                    Process process = new Process
                                      {
                                          StartInfo = new ProcessStartInfo
                                                      {
                                                          FileName = path,
                                                          UseShellExecute = true
                                                      }
                                      };
                    process.Start();
                    process.WaitForExit();
                }
            }
        }
    

    The only thing that really gave me a headache was referencing the System.Data.SqlServerCe.dll - it simply wouldnt IlMerge, so instead I loaded it on demand, in my main:

    AppDomain.CurrentDomain.AssemblyResolve += RedistHelper.OnCurrentDomainOnAssemblyResolve;
    

提交回复
热议问题