【问题标题】:how does one programmatically create a localdb .mdf?如何以编程方式创建 localdb .mdf?
【发布时间】:2014-08-29 23:46:58
【问题描述】:

如何以编程方式创建 localdb .mdf?

可接受的解决方案排除visual studio、ssms、aspnet_regsql。

一个天真的解决方案可能看起来像这样:

static void Main(string[] args)
{
    using (var con = new SqlConnection(@"Integrated Security=SSPI;Data Source=(LocalDb)\v11.0;AttachDbFilename=test.mdf"))
    {
        con.Open();
        using (var cmd = new SqlCommand("CREATE DATABASE test", con))
        {
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }
    }
}

当然,这在 SqlConnection.Open 中失败并出现错误

尝试为文件 test.mdf 附加自动命名的数据库失败。存在同名数据库,或指定文件无法打开,或位于 UNC 共享上。

如果指定的 .mdf 不存在,则无法连接到数据库。

那么...你如何创建一个?

【问题讨论】:

  • 您可以使用SqlLocalDB utility 来创建、启动和停止LocalDB 实例。拥有实例后,您可以使用 SQLCMD 对新实例执行类似 CREATE DATABASE (databasename) 的命令
  • 不幸的是 SqlLocalDB 没有创建一个可以与 AttachDbFilename 一起使用的 .mdf。

标签: sql-server-2012 localdb mdf


【解决方案1】:

必须拼凑出来自 Stackoverflow 的几个答案和来自 @AaronBertrand 的精彩 Getting Started with SQL Server 2012 Express LocalDB 文章

代码假定 Dapper.NET 已安装:

PM> 安装包Dapper

程序化创作:

var dbServerName = "SERVER_NAME";
var dbName = "DATABASE_NAME";

var infoResult = SqlLocalDbCommand($"info {dbServerName}");

var needsCreated = infoResult?.Trim().EndsWith($"\"{dbServerName}\" doesn't exist!");

if (needsCreated.GetValueOrDefault(false))
{
    var createResult = SqlLocalDbCommand($"create {dbServerName} -s");

    var success = createResult?.Trim().EndsWith($"\"{dbServerName}\" started.");

    if (false == success)
    {
        var msg = $"Failed to create database:{Environment.NewLine}{createResult}"
        throw new ApplicationException(msg);
    }

    var master = $@"Server=(localdb)\{dbServerName};Integrated Security=True;"
    using (var conn = new SqlConnection(master))
    {
        var result = conn.Execute($"CREATE DATABASE {dbName}");
    }

  var @new = $@"Server=(localdb)\{dbServerName};Integrated Security=True;Database={dbName}"
    using (var conn = new SqlConnection(@new))
    {
        //verify i can access my new database
        var tables = conn.Query($"SELECT * FROM {dbName}.INFORMATION_SCHEMA.Tables");
    }
}

助手(thanks T30):

/// <summary>
///     Executes a command against SqlLocalDB
/// </summary>
/// <remarks></remarks>
/// <param name="arguments">The arguments to pass to SqlLocalDB.exe</param>
/// <returns></returns>
/// <exception cref="System.ApplicationException">Error returned from process</exception>
private static string SqlLocalDbCommand(string arguments)
{
    var process = new Process
    {
        StartInfo =
        {
            FileName = "SqlLocalDB",
            Arguments = arguments,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        }
    };

    process.Start();
    //* Read the output (or the error)
    var output = process.StandardOutput.ReadToEnd();
    Console.WriteLine(output);
    var err = process.StandardError.ReadToEnd();
    Console.WriteLine(err);
    process.WaitForExit();

    if (err.Exists()) throw new ApplicationException(err); //Is LocalDB installed?

    return output;
}

请注意,使用此解决方案您将看不到 mdf 文件,我确定它们存在于某个用户文件夹中,但关键是您将通过连接字符串进行连接

(localdb)\SERVER_NAME;Integrated Security=True;Database=DATABASE_NAME

【讨论】:

    【解决方案2】:

    所以我认为你真正想要做的是在你的 LocalDB 实例中创建一个名为 test 的数据库,但是你还没有为这个数据库创建一个 MDF 文件?

    如果是这种情况,您的代码将在连接阶段失败,因为您已要求它附加您的 test.mdf 文件。

    在这种情况下,您通常会首先连接到主数据库,然后运行 ​​create database 语句,该语句将使用其关联的 MDF 文件创建测试数据库,也许尝试更改您的连接字符串,使其看起来更多像这样然后再次运行:

    Integrated Security=SSPI;Data Source=(localdb)\V11.0;Initial Catalog=master
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2013-03-10
      • 2013-11-15
      • 2013-12-28
      • 2011-02-10
      • 2011-04-02
      • 2012-02-26
      相关资源
      最近更新 更多