做了一个安装包,里面包含SQL Server数据库文件,添加了自定义操作,安装到最后时居然弹出对话框.对话框信息"Installutil 执行每个给定程序集中的安装程序......",我根本没加入Installutil命令安装Assembly,感觉莫名奇妙,接着安装回滚,安装不成功。请问是什么原因。

解决方案 »

  1.   

    服务问题
    http://topic.csdn.net/t/20050113/17/3723464.html
      

  2.   

    在安装包中没有任何windows服务程序需要安装,不过有一个数据库安装对话框,引入了一个DBInstaller类代码如下,貌似无法调试,错误应该是出在这个类中。添加了一个安装节点的自定义操作并引入这个类,自定义对话框的CustomActionData属性设为/dbname=[TXTDBNAME] /server=[TXTDBSERVER] /user=[TXTUSERNAME] /pwd=[TXTPASSWORD] /targetdir="[TARGETDIR]\" /datapath="[ProgramFilesFolder]\CRMData\"
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Reflection;
    using System.IO;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;  namespace InstallDB
    {
        [RunInstaller(true)]
        public partial class DBInstaller : Installer
        {
            public DBInstaller()
            {
                InitializeComponent();
            }
            private string GetSql(string sqlFileName)
            {
                try
                {
                    string path = this.Context.Parameters["targetdir"] + sqlFileName;
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    StreamReader reader = new StreamReader(fs, System.Text.Encoding.Default);
                    return reader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    Console.Write("In GetSql:" + ex.Message);
                    throw ex;
                }
            }
            private void ExecuteSql(string dbName, string sql)
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = string.Format("server={0}; user id={1}; password={2}; Database=master", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
                try
                {
                    cmd.Connection.Open();
                    cmd.Connection.ChangeDatabase(dbName);
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.Write("In exception handler :" + ex.Message);
                }
                finally
                {
                    cmd.Connection.Close();
                }
            }        protected void AddDBTable(string dbName)
            {
                try
                {
                    ExecuteSql("master", "CREATE DATABASE " + dbName);
                    ExecuteSql(dbName, GetSql("sql.txt"));
                    ExecuteSql("master", "exec sp_addlogin 'myoamaster','myoamaster','" + dbName + "',Null,Null");
                    ExecuteSql(dbName, "EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
                    ExecuteSql(dbName, "exec sp_addrolemember 'db_owner','myoamaster'");
                }
                catch (Exception ex)
                {
                    Console.Write("In exception handler :" + ex.Message);
                }
            }        private void CreateDatabase(string dbName, string strMdf, string strLdf)
            {
                try
                {
                    string connString = string.Format("server={0}; user id={1}; password={2}; Database=master", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
                    SqlConnection conn = new SqlConnection(connString);
                    //EXEC sp_detach_db @dbname = 'BX_FreightMileage_2'//需要先将数据库分离出来
                    string sql = "EXEC sp_attach_db @dbname = '" + dbName + "', @filename1 = '" + strMdf + "',@filename2='" + strLdf + "'";
                    MessageBox.Show(sql);      
                    SqlCommand cmd = new SqlCommand(sql, conn);                conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);  
                    Console.Write("In exception handler :" + ex.Message);
                }        }
            public override void Install(System.Collections.IDictionary stateSaver)
            {
                base.Install(stateSaver);
                //AddDBTable(this.Context.Parameters["dbname"]);
                string dbName = this.Context.Parameters["dbname"];
                string strMdf = this.Context.Parameters["datapath"] + "AsiaAssetCRM.mdf";
                string strLdf = this.Context.Parameters["datapath"] + "AsiaAssetCRM_log.ldf";
               
                CreateDatabase(dbName, strMdf, strLdf);   
            }
        }}
      

  3.   

    看看EventViewer中的Application下面的异常,可能会得到更多信息。