2012-04-14 112 views
1

我想從使用自定義操作的Visual Studio 2010 web安裝項目創建一個新的數據庫。 首先我做了一個從哪裏用戶選擇他們的SQL服務器的名稱和身份驗證模式。我得到服務器名稱使用以下內容:MVC使用SMOLite創建SQL數據庫

public string ServerString { get; set; } 
    private void SetServerString() 
     { 
      string cs; 
      if (cbInstant.SelectedIndex == 0) // windows authentication 
       cs = cbServer.SelectedValue.ToString(); 
      else 
       cs = string.Format(cbServer.SelectedValue + ";" + txtUser.Text + ";" + txtPassword.Text); 

      ServerString = cs; 
     } 

     private void btnNext_Click(object sender, EventArgs e) 
     { 
       SetServerString(); 
       formContext.Parameters["ServerString"] = this.ServerString; 
       this.Close(); 
     } 

它運作良好,我得到例如「PCName \ SQLEXPRESS」。

在自定義操作:

public override void Install(System.Collections.IDictionary stateSaver) 
     { 
    string serverString = ""; 
      if (this.Context.Parameters["ServerString"] != null) 
       serverString = this.Context.Parameters["ServerString"]; 
base.Install(stateSaver); 
      MakeSQLDatabase(connectionString); 
} 
    private void MakeSQLDatabase(string serverString) 
     { 
      FileInfo file = new FileInfo("M:\\script.sql"); 
      string script = file.OpenText().ReadToEnd(); 
      file.OpenText().Close(); 
      SqlConnection sqlConnection = new SqlConnection(); 
      SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(); 
      sqlConnection.ConnectionString = sqlConnectionStringBuilder.ToString(); 
      Server server = new Server(sqlConnection); 
      server.ConnectionContext.ServerInstance = (serverString); 
      server.ConnectionContext.Connect(); 
      if (server.Databases["databasename"] != null) 
      { 
       server.KillAllProcesses("databasename"); 
       server.KillDatabase("databasename"); 
      } 
      Database database = new Database(server, "databasename"); 
      database.Create(); 
      database.ExecuteNonQuery(script); 
     } 

我得到「服務器未找到或accessiable」的錯誤,但是如果我改變變量serverString到

@"PCName\SQLEXPRESS" 

它的作品!我找不出什麼問題。我不能使用Microsoft.SqlServer.Management.Smo,因爲即使加入app.confg

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

我會感謝您的幫助版本2和4版本之間有衝突,或者你可以直接我一個更好的解決方案來完成這項任務提前致謝。

回答

1

我不明白,你想用.NET 2而不是.NET 4創建一個新的數據庫嗎?我nerver使用SMO的,但也會嘗試:) Atm我只是連接主數據庫使用SQL待辦事項作業與「CREATE DATABASE」。只要您具有到「主」數據庫的有效連接,就可以工作。

UPDATE:

var sql = ""; 
using (var cnn = new SqlConnection(connection)) 
{ 
    cnn.Open(); 
    sql = "CREATE DATABSE <databasename>"; 
    using (var cmd = new SqlCommand(sql, cnn)) 
    { 
    try 
    { 
     cmd.CommandTimeout = 120; 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex); 
    } 
    } 
    sql = "USE DATABSE <databasename>;EXEC sp_dbchangeowner <Username>"; 
    using (var cmd = new SqlCommand(sql, cnn)) 
    { 
    try 
    { 
     cmd.CommandTimeout = 120; 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex); 
    } 
    } 
    cnn.Close(); 
} 

連接必須是你的 「主」 數據庫的連接。 並需要更換。 如果你想這樣做動態事遂所願:

sql = string.Format("USE DATABSE {0};EXEC sp_dbchangeowner {1}",database,username); 

連接你與你的功能,你已經有一個設置,使用數據庫名「高手」。 然後你完成並可以像這樣設置任何數據庫。

要檢查SQL幫助,您可以添加到您的第一個SQL一個:

IF ((SELECT IsNull(db_id('latest'),-1))>0) 

希望這有助於。我不知道這是否是最聰明的方式,但在這種情況下,我可以簡單地連接,然後創建,更改等任何我想要的東西。 在我的情況下,我完全創建一個數據庫,使用stringbuilder加載一堆sql命令,並針對新數據庫執行所有CREATE table/column/query語句。 刪除DB是一個簡單的「DROP DATABASE」。

+0

這是安裝4.0應用程序的網絡安裝應用程序。我有兩個選擇,要麼使用SMO或SMOLite !.如果您可以與我分享您是如何連接到服務器並創建數據庫的,我將不勝感激。謝謝 – hncl 2012-04-14 07:27:30

+0

@ user373721我更新了我的帖子,以說明我的工作方式 – YvesR 2012-04-14 08:22:33

+0

是您的示例的第一行var sql 0「」;我得到錯誤,這不是一個虛擬聲明。謝謝 – hncl 2012-04-14 15:43:00