9

是否可以从 .NET 为 SQL 服务器数据库生成数据库创建脚本?

我正在使用 C#,我想为我的应用程序创建某种安装程序项目,我可以在该项目上选择现有数据库、生成创建脚本并在另一个 SQL 服务器实例上运行它们。

4

3 回答 3

5

对的,这是可能的。使用SMO很容易做到这一点,请参阅用于脚本操作的传输类和用于数据库操作(创建、删除等)的数据库类。用法如下所示:

    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();
    }
于 2013-04-26T05:42:02.187 回答
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;
}

这是检查数据库中是否存在 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;
}

它的工作代码,希望它也对你有用....

于 2013-04-26T06:20:44.623 回答
0

您必须自己编码来创建自己的安装程序。有一些框架可以让它变得更容易。

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

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

于 2013-04-26T05:44:13.380 回答