2013-04-26 14 views
7

Czy można wygenerować skrypty do tworzenia bazy danych dla bazy danych SQL Server z .NET?Generowanie skryptów tworzenia bazy danych

Używam C# i chciałbym utworzyć jakiś projekt instalatora dla mojej aplikacji , na którym mogę wybrać istniejącą bazę danych, wygenerować skrypty tworzenia i uruchomić je na innej instancji serwera SQL.

+0

Można użyć 'SQL Server Development Tools' który zostanie zainstalowany jako szablonu projektu http://www.develop.com/sqlservertwelvedatatools – praveen

+1

Czy chcesz generować db dynamicznie? –

+0

@raman, tak - dynamicznie. – sTodorov

Odpowiedz

5

Tak, jest to możliwe. Łatwo to zrobić z SMO, patrz klasa Transfer dla operacji skryptowych i klasa Database dla operacji na bazie danych (tworzenie, upuszczanie itp.). Sposób użycia wygląda następująco:

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

Musisz stworzyć swój własny instalator, kodując go samodzielnie. istnieją ramy, które czynią go znacznie prostszym.

  • jak XML Instalatora Windows (WiX)
  • Instalator Windows
  • i więcej ...

chciałbym zaproponować Ci spojrzeć na Wix pracował z nim i jego dość łatwe i możesz zrobić wiele. Mogą być zintegrowane w Visual Studio

1

jeśli chcesz stworzyć bazę dynamicznie C# kod to tutaj jest kod:

można to zrobić jak to również:

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."); 
       } 
      } 

Oto kod "RollBackTheWholetransaction" metoda:

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

A oto kod do sprawdzenia istnienia dB w bazie:

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

jego kod roboczych, nadzieję, że będzie pracować dla Ciebie ....

Powiązane problemy