C# 以编程方式在客户端计算机上创建SQL Server Compact数据库

C# 以编程方式在客户端计算机上创建SQL Server Compact数据库,c#,.net,ado.net,sql-server-ce,C#,.net,Ado.net,Sql Server Ce,我最近开始试验SQLServerCompact和EF6。我目前正在使用模型优先的方法,并从中生成我的类和表。不过,有一件事我很好奇。如何让我的程序动态创建数据库。它存在于我使用SQLServerCompact/SQLite工具包创建的计算机上,但当程序部署到客户端计算机时,将需要创建数据库 我希望在第一次运行时提示他们找到一个好的位置,然后创建整个DB模式,并在将来使用它。我查看了一下,但vs开始抱怨它不起作用,因为我没有使用代码优先的方法 如果你需要更多的信息,让我知道!谢谢。我有一个正在使用

我最近开始试验SQLServerCompact和EF6。我目前正在使用模型优先的方法,并从中生成我的类和表。不过,有一件事我很好奇。如何让我的程序动态创建数据库。它存在于我使用SQLServerCompact/SQLite工具包创建的计算机上,但当程序部署到客户端计算机时,将需要创建数据库

我希望在第一次运行时提示他们找到一个好的位置,然后创建整个DB模式,并在将来使用它。我查看了一下,但vs开始抱怨它不起作用,因为我没有使用代码优先的方法


如果你需要更多的信息,让我知道!谢谢。

我有一个正在使用SQL CE和EF开发的小应用程序,我在安装该应用程序时部署了模板数据库(clickonce)。然后,我在应用程序启动时使用spash屏幕加载以前创建的数据库,或者让用户创建一个新的数据库

当他们创建一个新的db时,我只需提示他们输入一个位置,然后用他们想要的名称将模板数据库复制到他们想要的位置。我还将其设置为使用已部署的数据库,而不让他们有机会拥有多个数据库文件

我们在这里处理以下几件事:

  • SQL CE数据库文件
  • 我的stock/template.sdf文件位于我的项目文件夹中,包含在VisualStudio的项目中(我使用的是2015)。在解决方案资源管理器中的文件上单击鼠标右键,然后选择要设置以下内容的属性:

    构建操作-内容
    复制到输出目录-始终复制

  • 创建全局变量
  • 使用现有模块文件或创建如下所示的新模块文件:

    Public Module Globals
    
      Friend g_recipeData As RecipeEntities
    
    End Module
    
  • 为最后一个文件路径创建设置
  • 在解决方案资源管理器中右键单击项目名称,然后选择属性。单击“设置”选项卡并添加新设置,如下所示:

    名称:lastpath
    类型:字符串
    范围:用户
    价值:

  • 创建启动屏幕窗体(frmSplash)
  • 我的看起来像这样:

    Public Module Globals
    
      Friend g_recipeData As RecipeEntities
    
    End Module
    

    表格上的控件如下所示:

    txtFile
    cmdSelectDatabase
    cmdNew
    cmdOpen
    cmdExit

  • 启动屏幕(frmSplash)代码
  • 区域“形式方法”
  • 设置全局变量值
  • 在主应用程序(上面的frmMain)的表单上,向构造函数添加以下内容:

    Public Sub New()
    
        InitializeComponent()
        g_recipeData = New RecipeEntities
    
    End Sub
    
    如果在模块文件中创建变量时执行上述操作,则实体的连接字符串已设置,您无法更改它。您必须首先在app.config中设置连接字符串(使用上述代码),然后实体将在实例化时使用所需的连接字符串


    我认为这是目前的基本情况。我强烈建议你现在再读一遍,我已经完成了。我做了一些更正,甚至为lastpath设置添加了一个步骤。如果有什么事情不起作用或让人困惑,请打电话给我,我会尽力帮助你。祝你好运

    您可以使用SqlCeEngine.CreateDatabase创建一个空数据库,并运行sql脚本来创建所需的对象。嗨,erik!谢谢你所有伟大的工作!我假设您推荐此路径,因为EF不提供任何运行时数据库生成?我的意思是:有没有办法在运行时获取用于创建数据库的原始SQL,并将其用作您所指的“SQL脚本”?嘿!这听起来正是我想做的。如果你愿意分享你的代码,我将非常感激。如果没有,我也很高兴了解自己,如果你能给我指出正确的方向,只是到现在为止,我不知道;我甚至不知道该找什么…我找到你了,先生。我现在在上下班路上骑车回家,一到那里我就会提供一些代码供你使用。待命。非常感谢!!!!我真的很感激你为此付出的努力。我将仔细阅读你写的每一行,并从中尽可能多地学习。这真是一个很棒的答案,我非常感谢你抽出时间来回答我的问题!!!你明白了,兄弟。我在SQL CE和EF方面很难得到帮助,所以我想提供帮助。必须删除注释和大量错误处理,但方法名称应该会有所帮助。我也有代码来处理密码,包括设置它,所以让我知道,如果你想要它。如果你需要什么,祝你好运并大声叫喊。
    Public Sub New()
    
        InitializeComponent()
        g_recipeData = New RecipeEntities
    
    End Sub