9

.NET から SQL サーバー データベースのデータベース作成スクリプトを生成することはできますか?

私は C# を使用しており、既存のデータベースを選択し、作成スクリプトを生成して、別の SQL サーバー インスタンスで実行できる、アプリケーション用のある種のインストーラー プロジェクトを作成したいと考えています。

4

3 に答える 3

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();
    }
于 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;
}

そして、 Database 内の 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 インストーラー XML (WiX) など
  • Windows インストーラー
  • もっと...

WiX を見て、それを使用することをお勧めします。これは非常に簡単で、多くのことができます。Visual Studio に統合可能

于 2013-04-26T05:44:13.380 に答える