【问题标题】:How to manually create a mdf file for localdb to use?如何手动创建一个 mdf 文件供 localdb 使用?
【发布时间】:2022-04-07 15:46:45
【问题描述】:

我正在设置一些单元测试来测试使用数据库完成的工作。我想使用 localdb v11 但首先我需要创建数据库。我该怎么做?

只需在 sql management studio 中连接到 (localdb)v11 即可将我连接到(我假设)在 C:\Users\George\ 中的数据库。如何指定一个新的?

代码使用手动 ADO.Net,而不是实体框架,据我所知,我不能依赖它来简单地创建数据库。

【问题讨论】:

    标签: .net visual-studio-2012 localdb


    【解决方案1】:

    只需使用 CREATE DATABASE 语句

    SqlConnection connection = new SqlConnection(@"server=(localdb)\v11.0");
    using (connection)
    {
        connection.Open();
    
        string sql = string.Format(@"
            CREATE DATABASE
                [Test]
            ON PRIMARY (
               NAME=Test_data,
               FILENAME = '{0}\Test_data.mdf'
            )
            LOG ON (
                NAME=Test_log,
                FILENAME = '{0}\Test_log.ldf'
            )",
            @"C:\Users\George"
        );
    
        SqlCommand command = new SqlCommand(sql, connection);
        command.ExecuteNonQuery();
    }
    

    【讨论】:

    • 啊..我只是想弄清楚如何从 sql manager studio 中做到这一点,但这有效。关键是我没有意识到我可以提供一个 FILENAME 参数。然后我将如何使用这个数据库,AttachDbFileName=.\\Test_data.mdf
    • 为了完整性 - 我需要在运行时计算 mdf 的路径,因为这是一个单元测试,我就是这样做的:datamart = String.Format(@"Data Source=(LocalDB)\v11.0;Integrated Security=True;AttachDbFileName='{0}\MockDatamart.mdf'", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"));
    • 缺少一些东西,可能是使用,因为编译器不理解SqlConnection
    【解决方案2】:

    我知道,老问题,但我发现以下方式仍然相关且快速。以下是完整的步骤,但实际上只有最后一部分是真正相关的:

    先决条件:

    1. MS Sql LocalDb 引擎
    2. MS Sql 服务器管理工​​作室

    步骤:

    1. 打开命令提示符
    2. 运行SqlLocalDb info 列出当前安装的LocalDb 实例。对于 Sql Server 2012/Visual Studio 2012,至少应该有 v11.0,对于 Sql Server 2014/Visual Studio 2015,至少应该有 MSSQLLocalDB
    3. 打开 Sql Server Management Studio,如果已在运行,则显示连接对话框
    4. 使用服务器名称(localdb)\v11.0(localdb)\MSSQLLocalDB,无论您感兴趣。选择 Windows 身份验证
    5. 创建新查询
    6. 粘贴以下模板,根据需要调整路径和名称:

      CREATE DATABASE __YourDbName__ ON (
        NAME='__YourDbName__', 
        FILENAME='YourDrive:\Your\path\to\data\files\__YourDbName__.mdf')
      
    7. 运行查询

    8. 刷新对象资源管理器的数据库列表

    在对象资源管理器中,您现在应该看到新创建的数据库,而在 Windows 资源管理器中,您现在应该在指定路径看到新创建的 .mdf.ldf 文件。

    HTH

    【讨论】:

    • 这个解释很清楚。虽然它可能在那里,但我在 Microsoft Docs 中找不到这样的说明。
    【解决方案3】:

    不确定您所说的“手动”是什么意思。我将使用 Visual Studio 2013 和 LocalDb 添加一个选项:

    打开服务器资源管理器,右键单击数据连接,选择创建新 SQL Server 数据库。对于“服务器名称”,请使用“(LocalDB)\v11.0”。

    还有另一个选项,如 here 所述,但它需要安装 SQL Server Data Tools。 Visual Studio 2012 的说明版本也是available

    由于您还提到了 SQL Server Management Studio,您可以简单地连接到 LocalDb 实例并右键单击数据库,然后单击创建,这是标准方式。它或多或少是一个常规的 SQL Server 实例,所有标准操作都将照常运行。

    显然,也可以从应用程序代码中创建数据库,但这需要设置适当的数据库权限。根据您的环境,这可能是一个好主意,也可能不是一个好主意。

    【讨论】:

      【解决方案4】:

      Edit 2022:现在我可能更愿意在 Docker 上使用 SQL Server 实例,而不是使用 localdb。 :)

      --

      如果您(像我一样)正在寻找一种在您的代码之外执行此操作的方法,您可能需要考虑使用 .bat 脚本来执行此操作。我将它作为 .txt 文件保存在解决方案中,当我需要再次设置开发环境时可以使用该文件。

      LocalDB 和 SQLCmd

      此脚本假设已安装 LocalDB。我还没有找到关于它的明确信息,但如果您使用实体框架,它似乎可以与 Visual Studio 2012 和 2015 一起安装。如果不是这种情况,您可以从独立安装程序或 SQL Server express 下载页面安装它(您可以选择它作为您想要的下载。更多详细信息在这里:How to install localdb separately?

      SQLCmd 可以从 SQLServer Feature Pack 以相同的方式下载,查找 SQLCmdlnUtility.msi。这是 2012 版的link

      如果你和我的版本不同,你可能需要更改 LocalDbDir 和 SQLCmdDir 路径。

      脚本

      :: Script to Create Local DB Instance and a database
      
      ::echo setting variables - Default Server is v11 but it may be useful to evolve in a server instance of your own...
      SET localdDbDir=C:\Program Files\Microsoft SQL Server\120\Tools\Binn
      SET sqlCmdDir=C:\Program Files\Microsoft SQL Server\120\Tools\Binn
      SET SRV_NAME=your-dev-srv
      SET DB_NAME=your-dev-db
      SET DB_PATH=C:\CurDev\Temp
      
      echo Creates the localDB server instance
      pushd "%localdDbDir%"
      :: uncomment those lines if you want to delete existing content
      ::SqlLocalDb stop %SRV_NAME%
      ::SqlLocalDb delete %SRV_NAME%
      SqlLocalDb create %SRV_NAME%
      SqlLocalDb start %SRV_NAME%
      popd
      
      echo Create the database intance
      pushd "%sqlCmdDir%"
      sqlcmd -S "(localdb)\%SRV_NAME%" -Q "CREATE DATABASE [%DB_NAME%] ON PRIMARY ( NAME=[%DB_NAME%_data], FILENAME = '%DB_PATH%\%DB_NAME%_data.mdf') LOG ON (NAME=[%DB_NAME%_log], FILENAME = '%DB_PATH%\%DB_NAME%_log.ldf');"
      popd
      echo completed
      

      希望这会有所帮助!

      【讨论】:

      • 首先,问题很清楚地询问了代码中的in。更重要的是,SqlLocalDbsqlcmd 命令不会在任何环境中始终可用。为了使这个答案真正有用,您应该提及您假设的全局依赖关系。最后,绝对不需要删除或重新创建 localdb 实例,也不需要启动一个实例,因为尝试访问它的 sqlcmd 命令会自行完成。
      • 感谢乔治的澄清。我最终这样做是因为我在两个视觉工作室安装之间存在差异。这样我就可以确定我可以开始干净了。我费了很大劲才找到 VS 如何为我创建这个实例,所以我最终得到了这个脚本。但我同意这可能是一个矫枉过正的解决方案。此外,即使问题详细信息没有要求,标题可能会暗示您会在其中找到此类内容 google 在查找 localdb 手动创建时在此页面上带给我的内容。我希望这可以帮助其他人。
      • 这很公平,但为了对其他人有用,您至少应该编辑问题以解释如何在您的 shell 中获取 SqlLocalDbsqlcmd。默认情况下两者都不可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多