如何以编程方式创建 localdb .mdf? [英] how does one programmatically create a localdb .mdf?

查看:14
本文介绍了如何以编程方式创建 localdb .mdf?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

how does one programmatically create a localdb .mdf?

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

acceptable solutions exclude visual studio, ssms, aspnet_regsql.

对解决方案的天真尝试可能如下所示:

a naive stab at a solution might look like this:

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 中失败并出现错误

but of course, this fails in SqlConnection.Open with the error

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

An attempt to attach an auto-named database for file test.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

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

You cannot connect to a database if the specified .mdf doesn't exist.

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

So... how do you create one?

推荐答案

必须拼凑 Stackoverflow 和伟大的 SQL Server 2012 Express LocalDB 入门 文章来自@AaronBertrand

Had to piece together several answers from Stackoverflow and the great Getting Started with SQL Server 2012 Express LocalDB article from @AaronBertrand

代码假定安装了 Dapper.NET:

Code assumes Dapper.NET is installed:

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");
    }
}

Helper(感谢 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 文件,我确定它们存在于某个用户文件夹中,但关键是您将通过连接字符串进行连接

Note that with this solution you won't see the mdf files, i'm sure they exist in some user folder but the key take away is that you'll connect by the connection string

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

这篇关于如何以编程方式创建 localdb .mdf?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆