1

カスタムアクションを使用して、Visual Studio2010Webセットアッププロジェクトから新しいデータベースを作成しようとしています。最初に、ユーザーがSQLサーバーの名前と認証モードを選択するFromを作成しました。次を使用してサーバー名を取得します。

public string ServerString { get; set; }
   private void SetServerString()
        {
            string cs;
            if (cbInstant.SelectedIndex == 0) // windows authentication
                cs = cbServer.SelectedValue.ToString();
            else
                cs = string.Format(cbServer.SelectedValue + ";" + txtUser.Text + ";" + txtPassword.Text);

            ServerString = cs;
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
              SetServerString();
              formContext.Parameters["ServerString"] = this.ServerString;
              this.Close();
        }

それはうまく機能し、たとえば「PCName\SQLEXPRESS」を取得します。

カスタムアクションの場合:

public override void Install(System.Collections.IDictionary stateSaver)
        {
  string serverString = "";
            if (this.Context.Parameters["ServerString"] != null)
                serverString = this.Context.Parameters["ServerString"];
 base.Install(stateSaver);
            MakeSQLDatabase(connectionString);
}
   private void MakeSQLDatabase(string serverString)
        {
            FileInfo file = new FileInfo("M:\\script.sql");
            string script = file.OpenText().ReadToEnd();
            file.OpenText().Close();
            SqlConnection sqlConnection = new SqlConnection();
            SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
            sqlConnection.ConnectionString = sqlConnectionStringBuilder.ToString();
            Server server = new Server(sqlConnection);
            server.ConnectionContext.ServerInstance = (serverString);
            server.ConnectionContext.Connect();
            if (server.Databases["databasename"] != null)
            {
                server.KillAllProcesses("databasename");
                server.KillDatabase("databasename");
            }
            Database database = new Database(server, "databasename");
            database.Create();
            database.ExecuteNonQuery(script);
        }

「サーバーが見つかりませんでしたか、アクセスできませんでした」というエラーが表示されますが、変数serverStringを次のように変更すると

@"PCName\SQLEXPRESS"

できます!!何が問題なのかわかりません。バージョン2とバージョン4の間に競合があるため、Microsoft.SqlServer.Management.Smoを使用できませんでした。app.confgを追加しても

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

私はあなたの援助に感謝します、またはあなたはこのタスクを達成するためのより良い解決策に私を導くことができます。前もって感謝します。

4

1 に答える 1

1

わかりません。.NET 4 の代わりに .NET 2 を使用して新しいデータベースを作成しますか? 私は神経質にSMOを使用しましたが、試してみます:) Atmマスターデータベースに接続し、SQLを使用して「CREATE DATABASE」でジョブを実行します。これは、「マスター」データベースへの有効な接続がある限り機能します。

アップデート:

var sql = "";
using (var cnn = new SqlConnection(connection))
{
  cnn.Open();
  sql = "CREATE DATABSE <databasename>";
  using (var cmd = new SqlCommand(sql, cnn))
  {
    try
    {
      cmd.CommandTimeout = 120;
      cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
      Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex);
    }
  }
  sql = "USE DATABSE <databasename>;EXEC sp_dbchangeowner <Username>";
  using (var cmd = new SqlCommand(sql, cnn))
  {
    try
    {
      cmd.CommandTimeout = 120;
      cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
      Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex);
    }
  }
  cnn.Close();
}

connection は、「マスター」データベースへの接続である必要があります。交換する必要があります。これを動的にしたい場合は、次のようにします。

sql = string.Format("USE DATABSE {0};EXEC sp_dbchangeowner {1}",database,username);

データベース名「master」を使用して、すでに持っている関数で設定した接続。次に、このように任意の DB をセットアップできます。

SQL で支援を確認するには、最初の SQL に次を追加できます。

IF ( (SELECT IsNull(db_id('latest'),-1) )>0 )

お役に立てれば。これが最も賢明な方法かどうかはわかりませんが、この場合、単純に接続してから、必要なものを作成、変更などできます。私の場合、データベースを完全に作成し、stringbuilder を使用して一連の SQL コマンドをロードし、新しいデータベースに対してすべての CREATE テーブル/列/クエリ ステートメントを実行します。DBの削除は簡単な「DROP DATABASE」です。

于 2012-04-14T07:22:19.060 に答える