Как программно создать локальный.ddf.mdf?
Как программно создать локальный.ddf.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 не существует.
Итак... как вы создаете один?
2 ответа
Пришлось собрать воедино несколько ответов от Stackru и замечательную статью " Начало работы с SQL Server 2012 Express LocalDB" от @AaronBertrand
Код предполагает, что Dapper.NET установлен:
PM> Install-Package 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");
}
}
Помощник ( спасибо Т30):
/// <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
Итак, я понимаю, что вы действительно хотите создать базу данных с именем test в вашем экземпляре LocalDB, но у вас еще нет файла MDF, созданного для этой базы данных?
Если это так, код, который у вас есть, потерпит неудачу на этапе подключения, поскольку вы попросили его прикрепить файл test.mdf.
Обычно в этой ситуации вы сначала устанавливаете соединение с главной базой данных, а затем запускаете оператор create database, который создаст тестовую базу данных с соответствующим файлом MDF, возможно, попробуйте изменить строку подключения, чтобы она выглядела примерно так и затем снова работает:
Integrated Security=SSPI;Data Source=(localdb)\V11.0;Initial Catalog=master