2014-08-29 21 views
2

如何以編程方式創建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")) 
    { 
     con.Open(); 
     using (var cmd = new SqlCommand("CREATE DATABASE test", con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

但當然,失敗的SqlConnection.Open與錯誤

試圖附加自動命名的數據庫爲文件test.mdf失敗。具有相同名稱的數據庫存在,或指定的文件無法打開,或位於UNC共享上。

如果指定的.mdf不存在,則無法連接到數據庫。

那麼...你如何創建一個?

+0

您可以使用['SqlLocalDB'工具(http://msdn.microsoft.com/en-us/library/hh212961.aspx)創建,啓動和停止的LocalDB實例。一旦你有了一個實例,你可以使用'SQLCMD'來執行一個像CREATE DATABASE(databasename)這樣的命令來對付這個新的實例 – 2014-08-30 06:28:12

+0

,不幸的是SqlLocalDB不會創建一個可以用於AttachDbFilename的.mdf。 – Spongman 2014-08-30 18:31:12

回答

0

因此,我認爲你實際想要做的是在你的LocalDB實例中創建一個名爲test的數據庫,但是你沒有爲這個數據庫創建一個MDF文件?

如果是這樣的話,那麼您連接階段的代碼會失敗,因爲您已經要求它連接test.mdf文件。

在這種情況下,你通常要做的就是先連接master數據庫,然後運行create database語句,它將創建與其相關的MDF文件的測試數據庫,也許嘗試更改連接字符串,更多類似這樣的,然後再次運行:

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

只好拼湊幾個#1的答案和從@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 = [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"); 
    } 
} 

助手(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 
相關問題