我在卸载自己打包的安装程序时提示这个请问怎么在卸载之前就先将数据库分离或删除呢?我已经重写了卸载方法Uninstall(),但该方法中的第一句提示信息就没运行,就提示了上图中的内容
///<summary>
/// 卸载应用程序
///</summary>
///<param name="savedState"></param>
public override void Uninstall(IDictionary savedState)
{
try
{
if (MessageBox.Show("你确定要移除数据库吗?", "确认", MessageBoxButtons.YesNo)
== DialogResult.Yes)
{
//指定DB名称
string dbname = "cjgl";
try
{
//在指定的DB上运行 删除DB的sql语句.
this.DropDataBase(dbname);
}
catch
{
MessageBox.Show(string.Format("删除 [{0}] 数据库失败. 请手动删除."), dbname);
}
}
base.Uninstall(savedState);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
string sqlDetach = "EXEC sp_detach_db @dbname='{0}'";//分离某数据库
string sqlAttach = " EXEC sp_attach_db @dbname='{0}',@filename1='{1}',@filename2='{2}'";//附加某数据库,并指定数据库文件.mdf和.ldf的路径
string sqlDrop = "drop database {0}";//删除某数据库
//string sqlAlter = "ALTER DATABASE {0} SET OFFLINE WITH ROLLBACK IMMEDIATE";//断开某数据库的所有用户连接
///<summary>
/// 执行sql脚本
///</summary>
///<param name="_databaseName"></param>
///<param name="_sql"></param>
private void ExecuteSql(string _databaseName, string _sql)
{
string server = this.Context.Parameters["server"];//服务器名称
string uid = this.Context.Parameters["user"];//SQlServer用户名
string pwd = this.Context.Parameters["pwd"];//密码
string path = this.Context.Parameters["targetdir"];//安装目录
string strSql = "server=" + server + ";uid=" + uid + ";pwd=" + pwd + ";database=master";//连接数据库字符串
//初始化一个sql connection对象
this.conn = new SqlConnection();
this.conn.ConnectionString = strSql;
//初始化一个sql command对象
SqlCommand command = new SqlCommand(_sql, conn);
command.Connection.Open();
//因为调用该方法之前,是在master 系统数据库上面运行,所以需要使用更换数据库.
command.Connection.ChangeDatabase(_databaseName);
try
{
command.ExecuteNonQuery();
}
finally
{
command.Connection.Close();
}
}
///<summary>
/// 删除数据库
///</summary>
///<param name="conn">连接数据库,连接master系统数据库</param>
///<param name="DataName">数据库名字</param>
public void DropDataBase(string DataName)
{
try
{
this.ExecuteSql("master", string.Format(sqlDrop, DataName));
MessageBox.Show("数据库删除成功!点击确定继续");
}
catch (Exception e)
{
MessageBox.Show("数据库删除失败!" + e.Message + "\n\n" + "您可以手动删除数据库");
}
}
附:上面的删除数据库的方法在按钮单击事件中测试通过
用完数据库后随手close下不行么?
试过了的,不行
.net 技术中心 qq群:203848576 技术交流 于解决方案
string dbname = "MyPark";
//string connectionString = "Data Source=" + server + ";Initial Catalog=master;User ID=" + user + ";Password=" + pwd;
string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=master;Integrated Security=True";
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
string path = targetdir;
string SqlString = "DROP DATABASE " + dbname;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = SqlString;
int result = cmd.ExecuteNonQuery();
conn.Close();
}
this.DialogResult = DialogResult.OK;
this.Close();
}
catch
{
this.Close();
}
你好,上面代码中的this.Close();其中this指的什么呢?
@盛行天宇:
看到他this.Close();上面的
this.DialogResult = DialogResult.OK;
这行代码,你应该就知道指什么了
@盛行天宇: 就是弹出的那个窗体啊。
请问你的问题解决了吗?楼主