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

Sql server 2012 如何以编程方式创建localdb.mdf?,sql-server-2012,localdb,mdf,Sql Server 2012,Localdb,Mdf,如何以编程方式创建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")) {

如何以编程方式创建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中失败

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

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


所以。。。如何创建一个呢?

所以我认为您实际上想要做的是在LocalDB实例中创建一个名为test的数据库,但是您还没有为此数据库创建MDF文件

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

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

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

不得不从Stackoverflow和@AaronBertrand的伟大文章中拼凑出几个答案

代码假定安装了Dapper.NET:

PM>安装软件包

编程创建:

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");
    }
}
助手():


您可以使用创建、启动和停止LocalDB实例。一旦有了实例,就可以使用
SQLCMD
对该新实例执行类似
CREATE DATABASE(databasename)
的命令。不幸的是,SqlLocalDB没有创建可与AttachDbFilename一起使用的.mdf。
/// <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;
}
(localdb)\SERVER_NAME;Integrated Security=True;Database=DATABASE_NAME