2012-04-14 44 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