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

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

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

全過去ログを検索

<< 0 | 1 >>
■88438  Re[14]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ -(2018/08/30(Thu) 18:11:27)
    とっちゃん様

    「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
    ことでうまくいきました。
    お忙しいところ、ありがとうございました。
    感謝申し上げます。

    今後ともよろしくお願いいたします。
記事No.88086 のレス / END /過去ログ152より / 関連記事表示
削除チェック/

■88722  Re[15]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ -(2018/09/21(Fri) 23:28:53)
    2018/09/21(Fri) 23:33:54 編集(投稿者)

    No88438 (ぽんすけ さん) に返信
    > とっちゃん様
    >
    > 「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
    > ことでうまくいきました。
    > お忙しいところ、ありがとうございました。
    > 感謝申し上げます。

    とっちゃん様

    上記、インストール時にはうまくいきましたが、結局アンインストール時に
    登録したLocalDBは消せないことに気づきました。

    今、LocalDBはWindows認証で接続して使っていますが、
    もし仮にSQL Server認証にして、初回起動時、CREATE LOGINでユーザ、パスワードを設定して
    おいて、 アンインストール時にこのユーザ名、パスワードでログインし、
    データベースをDROPするということができるのではと考えたのですが、どうなのでしょうか。

    実は試しにこのように修正してみたのですが、
    アンインストール時に上手く接続できていないようなのです。
    接続文字列が悪いのか、あるいは根本的に無理なのか・・・

    また、前にご教示いただきました「マシンアカウントで登録」とはどのような
    方法になりますでしょうか。

    度々申し訳ございませんが、ご教示お願いいたします。
記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88723  Re[16]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん -(2018/09/22(Sat) 02:40:27)
    No88722 (ぽんすけ さん) に返信
    > 2018/09/21(Fri) 23:33:54 編集(投稿者)
    >
    > ■No88438 (ぽんすけ さん) に返信
    >>とっちゃん様
    >>
    >>「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
    >>ことでうまくいきました。
    >>お忙しいところ、ありがとうございました。
    >>感謝申し上げます。
    >
    > とっちゃん様■No88722 (ぽんすけ さん) に返信
    > 今、LocalDBはWindows認証で接続して使っていますが、
    > もし仮にSQL Server認証にして、初回起動時、CREATE LOGINでユーザ、パスワードを設定して
    > おいて、 アンインストール時にこのユーザ名、パスワードでログインし、
    > データベースをDROPするということができるのではと考えたのですが、どうなのでしょうか。
    >
    できるかもしれないしできないかもしれません。

    前にも書いていますがDBの構造や、どこにどういう形で用意しているのかという具体的な情報がありませんよね。
    その状況でどうなのか?と聞かれても何とも言えないです。

    > 実は試しにこのように修正してみたのですが、
    > アンインストール時に上手く接続できていないようなのです。
    > 接続文字列が悪いのか、あるいは根本的に無理なのか・・・
    >
    デバッグしましょう。
    デバッガを使ってデバッグ実行することだけがデバッグではありません。

    エラーが発生したらメッセージボックスを出してできるだけ詳細を表示するというのもデバッグ手法の一つです。
    ほかにもいろいろあります(ここでは省略)。



    > また、前にご教示いただきました「マシンアカウントで登録」とはどのような
    > 方法になりますでしょうか。
    >
    マシンアカウント(SYSTEM)でDBを登録する形になります。
    LocalDBなら、任意のユーザーが読み書きできる %ProgramData% に配置することで対応できるかもしれません。

    ただ、複数のユーザーが同じDBを使うことになるので、影響が出ないようにDBを用意しておく必要があります。
記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■88750  Re[18]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん -(2018/09/23(Sun) 17:34:14)
    No88747 (ぽんすけ さん) に返信
    > とっちゃん様■No88747 (ぽんすけ さん) に返信
    > 以下、初回起動時の処理になります。
    > ※TestDb.mdf、TestDb.ldfは%ProgramData% に配置しております。

    ProgramData の直下ではなく
    会社名や、アプリ名など、ユニークになるであろうサブフォルダに格納することをお勧めします。


    昨今の状況では、会社名\バージョン依存アプリ名、会社名\バージョン非依存アプリ名、会社名だけ、アプリ名だけ
    などまちまちなので、どういう形が望ましいというものはあまりないようです。
    自分のマシンでの使われ方などを参考に考えてください。

    AppDataと同じ使い方でも問題はないと思います。


    >//コマンドラインを指定("/c"は実行後閉じるために必要)
    >p.StartInfo.Arguments = @"/c sqllocaldb create TEST";
    >
    これを行っているということは、TestDb.mdf/ldf の情報とは別のものを使っているということになると思います。
    mdf/ldf は事前に作ったDB(要するにテーブルと中身)を使う方法です。

    また、その場でDBを作るなら共有インスタンス(マシン内の複数ユーザーで使うインスタンス)にする必要があると思います。


    >//接続して、ログイン、パスワード追加
    >string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";

    とりあえず、一番最初の接続文字列を引っ張っていますが。。。

    ファイル参照させるなら
    「AttachDbFileName=ファイルパス」
    でパス指定する必要があるはずです。

    前に、LocalDBを使ったら?とあったスレッドでもいろいろ情報出ていたと思います。

    SQL Server は、自分で使わないのでこれ以上の詳しいことはよくわかりませんので、このスレッドでの回答はあまり望めないと思います。


    それと、もう一つ考えておかなければならないものがあります。

    以下の状況でDBをどうするのか?を考える必要があります。
    1. アプリをアンインストールしてインストールしなおした場合
    2. アプリをアップデートした場合

    1の時にDBは消えたほうがいいのか消えたら困るのか?
    同様に2の時はどうなのか?


    今の状況で正しく動いたとすれば最低でも1の時は必ず消えていることになります。
    (アンインストールで消しているため)。

    そして、1の状況で正しく消えるという場合、ほぼ間違いなく2の状況でも消えます。

    これは、アップデートの仕組みに基づいているのですが、インストールしてアンインストールまたは
    アンインストールしてインストールという処理を1回のアップデートインストール時にまとめて行うからです。

    どういうパターンの場合でもアンインストールという処理が行われるため
    アンインストール時にDBを消すという処理が行われた場合、
    結果として、アップデート時にもそのDBはなくなってしまうことになります。

記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88751  Re[19]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ -(2018/09/23(Sun) 21:44:04)
    No88750 (とっちゃん さん) に返信
    とっちゃん様

    ご返信いただきありがとうございます。
    いつもお手数をお掛けして申し訳ありません。
    DBファイルの格納先につきましては、もう少し考えて配置するようにします。

    共有インスタンスにすることにつきましては、確かに複数ユーザで
    使用するため、そのように変更いたします。

    あと、考えておかなければならないことについて、
    1.のアンインストール後の再インストールについては、DBは消えててもよいのですが、
    2.のアプリのアップデートの場合には消えないでほしいと思っておりました。
    ご説明いただいた内容によれば、これはできなさそうですね・・・。
    アンインストール時に消すか、あるいは残しておくか。。。
    もう少し検討してみたいと思います。

    ほんとにいつもありがとうございます。
    では失礼いたします。
記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88764  Re[20]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん -(2018/09/25(Tue) 16:51:17)
    No88751 (ぽんすけ さん) に返信
    > 共有インスタンスにすることにつきましては、確かに複数ユーザで
    > 使用するため、そのように変更いたします。
    >
    複数のユーザーが利用する場合、同じDBに書き込んで大丈夫ですか?
    「同じDBに書き込む==ほかの人が書いた内容でも読める」
    ということになります。

    もちろん、ユーザーごとの固有値をセットしておけば同じDBでも絞り込みできるから
    大きな問題はありませんが(カラムにログオンIDなどを用意しておいて、検索時には where で絞ればいいだけ)。

    > あと、考えておかなければならないことについて、
    > 1.のアンインストール後の再インストールについては、DBは消えててもよいのですが、
    > 2.のアプリのアップデートの場合には消えないでほしいと思っておりました。
    > ご説明いただいた内容によれば、これはできなさそうですね・・・。
    > アンインストール時に消すか、あるいは残しておくか。。。
    > もう少し検討してみたいと思います。
    >
    アンインストールが完全に使用終了を指す場合のアンインストールであればデータファイルに当たるものは
    一緒に消えたほうが便利だと思いますが、

    ほとんどすべてのアプリで、AppDataフォルダや、ProgramData に書き込んだファイルは残したままです。
    バージョンアップ時に古いものを削除(新しいところに吸い上げ)ということはありますが
    それ自体が珍しいほうです。

    商用アプリも、個人用アプリも。

    このあたりが、UWP アプリでは残らないといううたい文句につながっていたりします(レジストリも同様)。
記事No.88086 のレス /過去ログ152より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 >>

パスワード/

- Child Tree -