2013-04-26 3 views
7

Можно ли создавать сценарии создания базы данных для базы данных SQL-сервера из .NET?Сгенерировать сценарии создания базы данных

Я использую C#, и я хотел бы создать своего рода проект-установщик для моего приложения , на котором я могу выбрать существующую базу данных, сгенерировать сценарии создания и запустить их на другом экземпляре SQL-сервера.

+0

Вы можете использовать 'SQL Tools' Development Server, которая устанавливается в качестве шаблона проекта http://www.develop.com/sqlservertwelvedatatools – praveen

+1

Вы хотите генерировать db динамически ?? –

+0

@raman, да - динамически. – sTodorov

ответ

5

Да, это возможно. Это легко сделать с помощью SMO, см. Transfer класс для сценариев и Database класс для операций с базой данных (создание, падение и т. Д.). Использование выглядит так:

private StringCollection GetTransferScript(Database database) 
    { 
     var transfer = new Transfer(database); 

     transfer.CopyAllObjects = true; 
     transfer.CopyAllSynonyms = true; 
     transfer.CopyData = false; 

     // additional options 
     transfer.Options.WithDependencies = true; 
     transfer.Options.DriAll = true; 
     transfer.Options.Triggers = true; 
     transfer.Options.Indexes = true; 
     transfer.Options.SchemaQualifyForeignKeysReferences = true; 
     transfer.Options.ExtendedProperties = true; 
     transfer.Options.IncludeDatabaseRoleMemberships = true; 
     transfer.Options.Permissions = true; 
     transfer.PreserveDbo = true; 

     // generates script 
     return transfer.ScriptTransfer(); 
    } 
0

Вы должны создать свой собственный установщик, закодировав все это самостоятельно. есть рамки, которые делают его намного легче.

  • как XML установщика Windows (WiX)
  • установщика Windows
  • и многое другое ...

Я хотел бы предложить вам взглянуть на WiX, работал с ним и его довольно легко и вы можете многое сделать. Может быть интегрирован в Visual Studio

1

, если вы хотите создать базу данных динамически с помощью C# код, то вот код:

вы можете сделать это так же:

String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = Connectionstring; 
     bool resultdbexistencx = CCMMUtility.CheckDatabaseExists(con, txt_DbName.Text); 
     if (!resultdbexistencx) 
     { 
      // if not exists create it check the user name for sub-admin avialibe or not. 

      if (txt_DbName.Text.Trim() == string.Empty) return; 

      string strDbCreate; 
      strDbCreate = "CREATE DATABASE " + txt_DbName.Text + " ON PRIMARY " + 
      "(NAME = " + txt_DbName.Text + "_Data, " + 
      "FILENAME = 'D:\\" + txt_DbName.Text + "Data.mdf', " + 
      "SIZE = 4MB, MAXSIZE = 10GB, FILEGROWTH = 100%) " + 
      "LOG ON (NAME = " + txt_DbName.Text + "_Log, " + 
      "FILENAME = 'D:\\" + txt_DbName.Text + ".ldf', " + 
      "SIZE = 4MB, " + 
      "MAXSIZE = 10GB, " + 
      "FILEGROWTH = 100%)"; 
      SqlConnection sqlconn = new SqlConnection(Connectionstring); 
      SqlCommand cmd = new SqlCommand(strDbCreate, sqlconn); 
      try 
      { 
       sqlconn.Open(); 
       sqlconn.ChangeDatabase("master"); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       Int32 dbRollbackResult = RollBackTheWholetransaction(txt_DbName.Text.Trim(), Convert.ToInt32(HospitalResult)); 
       if (dbRollbackResult == 1) 
       { 
        Response.Write(ex.Message); 
        lblMessage.DisplayMessage(StatusMessages.ErrorMessage, "There is some problem while generating the database or database name doesn't avialible."); 
       } 
      } 

Здесь есть код «RollBackTheWholetransaction» метод:

private Int32 RollBackTheWholetransaction(String DbName, Int32 HospitalId) 
{ 
    Int32 result = 0; 
    try 
    { 
     String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = Connectionstring; 

     String sqlCommandText = "ALTER DATABASE [" + DbName + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"; 
     String sqlCommandText1 = "DROP DATABASE [" + DbName + "]"; 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
      SqlConnection.ClearPool(con); 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
      SqlCommand sqlCommand1 = new SqlCommand(sqlCommandText1, con); 
      sqlCommand1.ExecuteNonQuery(); 

      ClsHospitals objHospiitals = new ClsHospitals(); 
      String resultDbdelete = objHospiitals.DeleteHospital(HospitalId, Session["devSuperAdmin"].ToString()); 
      if (resultDbdelete == "1") 
      { 
       result = 1; 
      } 
      else 
      { 
       result = 2; 
      } 
     } 
     else 
     { 
      SqlConnection.ClearPool(con); 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
      SqlCommand sqlCommand1 = new SqlCommand(sqlCommandText1, con); 
      sqlCommand1.ExecuteNonQuery(); 
     } 
     con.Close(); 
     con.Dispose(); 
     result = 1; 
    } 
    catch (Exception ex) 
    { 
     result = 0; 
    } 
    return result; 
} 

А вот код, чтобы проверить наличие БД в базе данных:

public static bool CheckDatabaseExists(SqlConnection tmpConn, string databaseName) 
{ 
    string sqlCreateDBQuery; 
    bool result = false; 

    try 
    { 
     // tmpConn = new SqlConnection("server=(local)\\SQLEXPRESS;Trusted_Connection=yes"); 



     sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name = '{0}'", databaseName); 

     using (tmpConn) 
     { 
      using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn)) 
      { 
       if (tmpConn.State == System.Data.ConnectionState.Open) 
       { 
        tmpConn.Close(); 
        tmpConn.Dispose(); 
       } 
       tmpConn.Open(); 
       tmpConn.ChangeDatabase("master"); 
       int databaseID = (int)sqlCmd.ExecuteScalar(); 
       tmpConn.Close(); 

       result = (databaseID > 0); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     result = false; 
    } 

    return result; 
} 

его рабочий код, надеюсь, что он будет работать для вас тоже ....