|
とっちゃん様
すみません、確かに上記の説明では情報が足りませんね。
申し訳ありません。ソースコードから、該当箇所を抜き出しました。
========================================
インストール時に、アプリ初回起動時の処理として、
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の扱い方に問題があるのでしょうか。
度々申し訳ございませんが、ご教示お願いいたします。
|