sql-server-2008 - 如何部署SQL Server Compact Edition 4.0?

标签 sql-server-2008 deployment sql-server-ce ado xcopy

如何部署 Microsoft SQL Server Compact 4.0

<小时/>

SQL Server Compact Edition(当前版本为 4.0)是:

a free, embedded database that software developers can use for building Windows desktop applications. It has a small footprint and supports private deployment of its binaries within the application folder.

但是您如何实际部署它呢?

问题是除非注册了 ADO OLEDb 提供程序,否则您无法使用它。必须以管理员身份注册 OLEDb 提供程序。这意味着 SQL Server Compact 版本对于非管理员用户将失败。

SQL Server Compact 4.0 附带一个 redist_enu.txt 文件:

The listed .exe files each install its enclosed components to a specific location on the destination computer. This helps to ensure serviceability and technical support. The .dll files enclosed in these .exe files are also available separately in this redist.txt. However, distributions of these separate .dlls may result in issues of serviceability. For more details, please see http://go.microsoft.com/fwlink/?LinkId=94589

Private deployment detection via BreadCrumb: Private deployment of just the native stack and explicit loading of SQL Server Compact Assembly via Assembly.LoadFrom(), .local file, or the use of DLL/COM redirection strategies are not supported and may result in serviceability issues. For more information see http://support.microsoft.com/kb/835322 and http://msdn2.microsoft.com/en-us/library/aa375142.aspx

Microsoft SQL Server Compact 4.0

SSCERuntime_x86-ENU.exe
SSCERuntime_x86-DEU.exe
SSCERuntime_x86-FRA.exe
SSCERuntime_x86-JPN.exe
SSCERuntime_x86-RUS.exe
SSCERuntime_x86-ESN.exe
SSCERuntime_x86-ITA.exe
SSCERuntime_x86-KOR.exe
SSCERuntime_x86-CHT.exe
SSCERuntime_x86-CHS.exe
SSCERuntime_x64-ENU.exe
SSCERuntime_x64-DEU.exe
SSCERuntime_x64-FRA.exe
SSCERuntime_x64-JPN.exe
SSCERuntime_x64-RUS.exe
SSCERuntime_x64-ESN.exe
SSCERuntime_x64-ITA.exe
SSCERuntime_x64-KOR.exe
SSCERuntime_x64-CHT.exe
SSCERuntime_x64-CHS.exe
sqlcese40.dll
sqlceqp40.dll
sqlceoledb40.dll
sqlceca40.dll
sqlceme40.dll
sqlcecompact40.dll
sqlceer40en.dll
sqlceer40cn.dll/sqlceer40zh-CHS.dll
sqlceer40de.dll
sqlceer40es.dll
sqlceer40fr.dll
sqlceer40it.dll
sqlceer40ja.dll
sqlceer40ko.dll
sqlceer40tw.dll/sqlceer40zh-CHT.dll
sqlceer40ru.dll
System.Data.SqlServerCe.dll
System.Data.SqlServerCe.Entity.dll

但它没有提供有关如何重新分发 SQL Server Compact 4.0 的任何信息。

随机拼写未记录的 Program Files 文件夹,我发现了 7 个 dll:

C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\
      sqlceoledb40.dll
      sqlceqp40.dll
      sqlcese40.dll
      sqlceca40.dll
      sqlcecompact40.dll
      sqlceer40EN.dll
      sqlceme40.dll

注意:还有一些包含更多 dll 的子文件夹

我尝试将这 7 个 dll 复制到一个文件夹中,并尝试打开 ADO Connection使用the connection string :

Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source="store.sdf"

但失败并显示 0x80004005 未指定错误

i tried frobbing the widget, but it grobbed the frobber.

最佳答案

我已经创建了解决方案。

SQL Server Compact Edition 由 7 个 dll 组成:

  • sqlceme40.dll未记录的、 native 、平面 API 库(.net System.Data.SqlServerCe.dll 程序集是此 dll 的包装器)
  • sqlceca40.dll实现 Engine 的 COM dll , Replication , Error以及其他一些 COM 对象
  • sqlceoledb40.dll为 SSCE 实现 OLEdb 提供程序的 COM dll(允许使用 ADO)
  • sqlcese40.dll 未知
  • sqlceqp40.dll 未知
  • sqlcecompact40.dll 未知
  • sqlceer40en.dll 未知

尝试简单地传送这些 dll 的问题是其中两个是 COM 对象。 COM 对象 dll 需要注册,例如:

>regsvr32 sqlceca40.dll
>regsvr32 sqlceoledb40.dll

问题是注册 COM 对象需要管理权限 ( using a global solution to solve a local problem )。这意味着您的用户会

  • 必须安装您的应用程序(您不想这样做)
  • 要求您的用户拥有管理权限(您不希望这样做)

幸运的是,从 2001 年的 Windows XP 开始,Microsoft 解决了这个常见问题:Registration-Free COM .

首先,您将声明您的应用程序“依赖” SQL Server Compact Edition 4.0。您可以通过编写程序集 list 来完成此操作:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
        version="1.0.0.0"
        processorArchitecture="X86"
        name="client"
        type="win32"
    /> 

    <description>Hyperion Pro</description> 

    <!-- We have a dependancy on SQL Server CE 4.0 -->
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.SQLSERVER.CE.4.0"
                version="4.0.0.0" processorArchitecture="x86"
            />
        </dependentAssembly>
    </dependency>
    <!-- We are high-dpi aware on Windows Vista -->
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
        <asmv3:windowsSettings
            xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>

    <!-- We were designed and tested on Windows 7 -->
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!--The ID below indicates application support for Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!--The ID below indicates application support for Windows Vista -->
            <!--supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/-->
        </application>
    </compatibility>

    <!-- Disable file and registry virtualization -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

您可以将此文件放在可执行文件旁边(如 Hyperion.exe.manifest ),也可以将其作为 RT_MANIFEST 构建到您的应用程序中。资源。

请注意,我们对名为 Microsoft.SQLSERVER.CE.4.0 的程序集有依赖关系。 。我们首先通过创建一个名为的目录来创建此程序集:

Microsoft.SQLSERVER.CE.4.0

当您部署应用程序时,您会将组成此“程序集”的所有 7 个 dll 放入此 Microsoft.SQLSERVER.CE.4.0 中。子文件夹,以及一个特殊的 .manifest文件:

📁C:\
╰──📁Users
   ╰──📁Ian
      ╰──📁AppData
         ╰──📁Local
            ╰──📁Hyperion Pro
               ├──📄Hyperion.exe
               ├──📄Hyperion.exe.manifest
               ╰──📁Microsoft.SQLSERVER.CE.4.0
                  ├──📄sqlceme40.dll
                  ├──📄sqlceca40.dll
                  ├──📄sqlceoledb40.dll
                  ├──📄sqlcese40.dll
                  ├──📄sqlceqp40.dll
                  ├──📄sqlcecompact40.dll
                  ├──📄sqlceer40en.dll
                  ╰──📄Microsoft.SQLSERVER.CE.4.0.manifest

换句话说,应用程序文件夹包含您的应用程序和 Microsoft.SQLSERVER.CE.4.0 文件夹:

 Directory of C:\Users\Ian\AppData\Local\Hyperion Pro

05/29/2012  09:23 AM         1,899,008 Hyperion.exe
05/28/2012  01:46 PM             1,587 Hyperion.exe.manifest
05/29/2012  09:27 AM    <DIR>          Microsoft.SQLSERVER.CE.4.0
           2 File(s)      1,900,675 bytes
           1 Dir(s)  20,851,503,104 bytes free

您的任务的下一部分是定义 Microsoft.SQLSERVER.CE.4.0.manifest文件。免注册 COM 允许 list 文件声明所有 COM 对象及其 clsid。这需要大量的逆向工程。但 SQL Server Compact Edition 4.0 的程序集 list 是:

Microsoft.SQLSERVER.CE.4.0.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity 
       type="win32"
       name="Microsoft.SQLSERVER.CE.4.0"
       processorArchitecture="x86"
       version="4.0.0.0" />

<!-- OLEDB Provider -->
<file name = "sqlceoledb40.dll">
    <comClass
            description = "Microsoft SQL Server Compact OLE DB Provider for Windows"
            clsid="{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}"
            threadingModel = "Both"
            progid = "Microsoft.SQLSERVER.CE.OLEDB.4.0" />
</file>

<!-- Native flat engine library -->
<file name="sqlceme40.dll" />

<!-- Engine and Replication COM object -->
<file name="sqlceca40.dll">
    <comClass description="Active SSCE Engine Object"
            clsid="{68D45319-3702-4837-9F8E-DA6845D82482}"
            threadingModel="Both"
            progid="SSCE.Engine.4.0" />
    <comClass description="SSCE Error Object"
            clsid="{36228F21-B5C7-4054-8DC2-47D3E236E8B5}"
            threadingModel="Both"
            progid="SSCE.Error.4.0" />
    <comClass description="SSCE Param Object"
            clsid="{0B3A7B75-A9B0-4580-9AA5-1A7DA47AD1CB}"
            threadingModel="Both"
            progid="SSCE.Param.4.0" />
    <comClass description="Active SSCE Replication Object"
            clsid="{11D5B2D4-26A4-44F5-A48B-0FAC3A919ED8}"
            threadingModel="Both"
            progid="SSCE.Replication.4.0" />
    <comClass description="Active SSCE remote data access Object"
            clsid="{58BC9AD6-BF11-40B3-9AB1-E3F2ED784C08}"
            threadingModel="Both"
            progid="SSCE.RemoteDataAccess.4.0" />

    <typelib tlbid="{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}"
            version="4.0" 
            helpdir=""/>
</file>

<comInterfaceExternalProxyStub 
    name="ISSCEEngine"
    iid="{10EC3E45-0870-4D7B-9A2D-F4F81B6B7FA2}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCEError"
    iid="{31155A3B-871D-407F-9F73-DEBFAC7EFBE3}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCERDA"
    iid="{4F04F79D-1FF1-4DCD-802B-3D51B9356C14}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCEParams"
    iid="{A78AFF90-049C-41EC-B1D8-665968AAC4A6}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCEParam"
    iid="{A9876C60-2667-44E5-89DB-E9A46ED392C0}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCEErrors"
    iid="{C40143CA-E9F9-4FF4-B8B4-CC02C064FC1B}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<comInterfaceExternalProxyStub 
    name="ISSCEMerge"
    iid="{C6EB397F-D585-428D-A4F4-454A1842CB47}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />

<file name="sqlceqp40.dll" />
<file name="sqlcese40.dll" />
<file name="sqlcecompact40.dll" />
<file name="sqlceer40EN.dll" />

</assembly>

最后一个问题是,以同样的方式,我们依赖于一个名为 Microsoft.SQLSERVER.CE.4.0 的程序集。 ,SQL Server Compact Edition 4.0 又依赖于名为 Microsoft.VC90.CRT 的程序集。 。幸运的是,您安装的 SQLCE 附带了此程序集的副本:

📁Microsoft.VC90.CRT
├──📄Microsoft.VC90.CRT.manifest 
╰──📄msvcr90.dll

这意味着最终的目录结构是:

📁C:\
╰──📁Users
   ╰──📁Ian
      ╰──📁AppData
         ╰──📁Local
            ╰──📁Hyperion Pro
               ├──📄Hyperion.exe
               ├──📄Hyperion.exe.manifest
               ╰──📁Microsoft.SQLSERVER.CE.4.0
                  ├──📄Microsoft.SQLSERVER.CE.4.0.manifest
                  ├──📄sqlceme40.dll
                  ├──📄sqlceca40.dll
                  ├──📄sqlceoledb40.dll
                  ├──📄sqlcese40.dll
                  ├──📄sqlceqp40.dll
                  ├──📄sqlcecompact40.dll
                  ├──📄sqlceer40en.dll
                  ╰──📁Microsoft.VC90.CRT
                     ├──📄Microsoft.VC90.CRT.manifest
                     ╰──📄msvcr90.dll
               

关于sql-server-2008 - 如何部署SQL Server Compact Edition 4.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739845/

相关文章:

sql-server - 我可以使用部署后脚本更改现有表架构吗?

java - jar 文件需要旁边的 db 文件夹,以便应用程序运行,我如何使用 'javapackager' 或任何其他工具捆绑该文件夹

c# - 为什么 SQL Server Compact 中的日期时间类型会对值进行舍入?

database - 两个不同的数据库(数据从一个复制到另一个)并比较它们的数据

SQL Server代理作业帐户问题

sql - 从按另一个 ID 分组的表中选择最新的(前 1 个)

xcode - 将 OS X 部署目标从 10.6 更改为 10.5 clang 错误

java - 发布java spring web应用程序时,部署/发布的步骤是什么?

c# - 从 Visual Studio C# 和 SQL Compact(连接、选择、插入)开始?

c# - 使用 C# 执行 SQLCommand 时出错