簡體   English   中英

生成數據庫創建腳本

[英]Generate database creation scripts

是否可以從.NET生成SQL Server數據庫的數據庫創建腳本?

我正在使用C#,我想為我的應用程序創建一些安裝程序項目,我可以在其上選擇現有數據庫,生成創建腳本並在另一個SQL服務器實例上運行它們。

對的,這是可能的。 使用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();
    }

如果你想用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;
}

這里是檢查數據庫中db存在的代碼:

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

它的工作代碼,希望它也適合你....

您必須自己編寫代碼來創建自己的安裝程序。 那里有框架使它更容易。

  • 像Windows Installer XML(WiX)
  • Windows安裝程序
  • 和更多...

我建議你看看WiX,使用它並且很容易,你可以做很多事情。 可以集成在Visual Studio中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM