2014-08-29 1 views
2

comment crée-t-on par programme un fichier .ddf localdb?comment crée-t-on par programme un fichier .ddf localdb?

solutions acceptables exclure visual studio, ssms, aspnet_regsql.

un coup de poignard naïf à une solution pourrait ressembler à ceci:

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

mais bien sûr, cela ne fonctionne pas en SqlConnection.Open avec l'erreur

Une tentative de joindre une base de données nommée auto- pour le fichier test.mdf a échoué. Une base de données portant le même nom existe ou le fichier spécifié ne peut pas être ouvert ou se trouve sur le partage UNC.

Vous ne pouvez pas vous connecter à une base de données si le .mdf spécifié n'existe pas.

Alors ... comment en créer un?

+0

Vous pouvez utiliser le créer, démarrer et arrêter les instances LocalDB [ 'utilitaire SqlLocalDB'] (http://msdn.microsoft.com/en-us/library/hh212961.aspx). Une fois que vous avez une instance, vous pouvez utiliser 'SQLCMD' pour exécuter une commande comme' CREATE DATABASE (databasename) 'contre cette nouvelle instance –

+0

Malheureusement, SqlLocalDB ne crée pas de fichier .mdf que vous pouvez utiliser avec AttachDbFilename. – Spongman

Répondre

0

Donc, je suppose que ce que vous voulez vraiment faire est de créer une base de données appelée test dans votre instance LocalDB, mais vous n'avez pas de fichier MDF déjà créé pour cette base de données?

Si c'est le cas, le code que vous avez échouera à la phase de connexion puisque vous lui avez demandé d'attacher votre fichier test.mdf. Ce que vous feriez normalement dans cette situation est d'établir une connexion à la base de données master, puis d'exécuter l'instruction create database qui créera la base de test avec son fichier MDF associé, peut-être essayer de changer votre chaîne de connexion plus comme celui-ci puis à courir:

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

Had à rassembler plusieurs réponses de Stackoverflow et le grand Getting Started with SQL Server 2012 Express LocalDB article de @AaronBertrand

code suppose Dapper.NET est installé:

PM> Installer-Package Dapper

création Programmatic:

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 = [email protected]"Server=(localdb)\{dbServerName};Integrated Security=True;" 
    using (var conn = new SqlConnection(master)) 
    { 
     var result = conn.Execute($"CREATE DATABASE {dbName}"); 
    } 

    var @new = [email protected]"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"); 
    } 
} 

Aide (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; 
} 

Notez que cette solution vous ne verrez pas le mdf fichiers, je suis sûr qu'ils existent dans un dossier utilisateur, mais la clé à emporter est que vous vous connecterez par la connexion chaîne

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