C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.88747 の関連記事表示

<< 0 >>
■88747  Re[17]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ -(2018/09/23(Sun) 11:13:37)
    とっちゃん様
    
    すみません、確かに上記の説明では情報が足りませんね。
    申し訳ありません。ソースコードから、該当箇所を抜き出しました。
    
    
    ========================================
    インストール時に、アプリ初回起動時の処理として、
    sqllocaldbにTESTという名前でlocalDBインスタンス生成し、
    その後、ログイン、パスワード追加して、
    データベース TestDbを生成しております。
    以下、初回起動時の処理になります。
    ※TestDb.mdf、TestDb.ldfは%ProgramData% に配置しております。
    
    
                //sqllocaldbにTESTという名前でlocalDBインスタンス生成
                try
                {
                    //Processオブジェクトを作成
                    Process p = new Process();
    
                    //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
                    p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
                    //出力を読み取れるようにする
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.RedirectStandardInput = false;
    
                    //ウィンドウを表示しないようにする
                    p.StartInfo.CreateNoWindow = true;
                    //コマンドラインを指定("/c"は実行後閉じるために必要)
                    p.StartInfo.Arguments = @"/c sqllocaldb create TEST";
    
                    //起動
                    p.Start();
    
                    //出力を読み取る
                    String results = p.StandardOutput.ReadToEnd();
    
                    //プロセス終了まで待機する
                    //WaitForExitはReadToEndの後である必要がある
                    //(親プロセス、子プロセスでブロック防止のため)
                    p.WaitForExit();
                    p.Close();
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }
    
                //接続して、ログイン、パスワード追加
                string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";
    
                SqlConnection con = new SqlConnection(ConnectionStr);
                try
                {
                    con.Open();
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                    throw (e);
                }
                var command = con.CreateCommand();
    
                StringBuilder sbSql = new StringBuilder();
    
                sbSql.AppendLine("CREATE LOGIN abc WITH PASSWORD = 'abc1234'");
                sbSql.AppendLine("CREATE USER abc FOR LOGIN abc");
                command.CommandText = sbSql.ToString();
                command.ExecuteNonQuery();
                sbSql.Clear();
    
    
                command.CommandText =
                  "SELECT COUNT(*) FROM sysdatabases WHERE name='TestDb'";
                int count = (int)command.ExecuteScalar();
    
                //インスタンスにTestDbが残っている
                if (count > 0)
                {
            //一旦デタッチ
                    command.CommandText = String.Format("exec sp_detach_db 'TestDb'");
                    command.ExecuteNonQuery();
    
                    sbSql.Clear();
                }
    
                sbSql.AppendLine("EXEC sp_configure 'contained database authentication', 1 ");
                sbSql.AppendLine("RECONFIGURE ");
                command.CommandText = sbSql.ToString();
    
                command.ExecuteNonQuery();
                con.Close();
    
    
                sbSql.Clear();
    
    
                //ログインする
                ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;User ID=abc;Password=abc1234;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";
    
                con = new SqlConnection(ConnectionStr);
    
                try
                {
                    con.Open();
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                    throw (e);
                }
                command = con.CreateCommand();
    
                //データベース TestDbを生成
                sbSql.AppendLine("CREATE DATABASE [TestDb]");
                sbSql.AppendLine(" CONTAINMENT = PARTIAL");
                sbSql.AppendLine(" ON  PRIMARY ");
    
                sbSql.AppendLine(@"( NAME = N'TestDb', FILENAME = N'" +  "TestDb.mdf" + "' , SIZE = 73728KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )");
                sbSql.AppendLine(" LOG ON ");
                sbSql.AppendLine(@"( NAME = N'TestDb_Log', FILENAME = N'" + "TestDb.ldf" + "' , SIZE = 8384KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)");
                sbSql.AppendLine("COLLATE Japanese_XJIS_100_CS_AS_KS_WS ");
                command.CommandText = sbSql.ToString();
                command.ExecuteNonQuery();
                sbSql.Clear();
    
    
    以上が、初回起動時の処理で行っている箇所になります。
    このあと、テーブルも生成しております。
    ==============================================================================
    
    アンインストール時にlocalDB "TEST"に接続して、"TestDb"をDROPしようとしました。
    「Drop TestDb Database    1」までメッセージは表示されますが、
    openで失敗しております。
    前に書いておりました「アンインストール時に上手く接続できていない」っていうのが、
    ここになります。
    
    以下、Setup Project カスタム動作でのアンインストール時の処理になります。
    
    
                System.Windows.Forms.MessageBox.Show("DropTestDbDatabase");
                string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;User ID=abc;Password=abc1234;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";
    
                SqlConnection con = new SqlConnection(ConnectionStr);
                try
                {
                    System.Windows.Forms.MessageBox.Show("Drop TestDb Database    1");
                    con.Open();
    
                    System.Windows.Forms.MessageBox.Show("Drop TestDb Database    2");
                    var command = con.CreateCommand();
                    System.Windows.Forms.MessageBox.Show("Drop TestDb Database    3");
    
                    StringBuilder sbSql = new StringBuilder();
    
                    sbSql.AppendLine("DROP DATABASE [TestDb]");
                    command.CommandText = sbSql.ToString();
                    command.ExecuteNonQuery();
                    sbSql.Clear();
                    System.Windows.Forms.MessageBox.Show("Drop TestDb Database    4");
    
                    con.Close();
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                    throw (e);
                }
                System.Windows.Forms.MessageBox.Show("Drop TestDb Database    5");
            }
    ========================================
    
    アプリ起動して、DBの参照ができることは確認しておりますが、
    アンインストール時にDROPが出来ておりません。
    
    LocalDBの扱い方に問題があるのでしょうか。
    度々申し訳ございませんが、ご教示お願いいたします。
    
     
記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -