zoukankan      html  css  js  c++  java
  • 制作安装包遇到的问题

    在一个桌面应用程序项目中,数据库用了MSSQLServer2000,开发语言使用C#2.0。即使用.NetFramework2.0框架。系统开发完成,部署安装的时候遇到的一些小问题。困扰我很久。

    部署安装的时候要求MSSQLserver2000数据库、.netframework2.0、驱动程序、应用程序一并安装,并需要一键完成。

    我刚开始是使用一个批量处理文件作为安装引导程序。

    处理文件内容如下:

    system\dotnetfx2.0.exe   '//.netframework2.0安装包
    SQL2000\AUTORUN.EXE  '//MSSQL2000数据库安装包
    Driver\BQDriver\setup.exe  '//系统驱动程序安装包
    Driver\USBToCOM\USBToPort.exe  '//串口转USB驱动安装包

    soft\XX.exe  '//应用程序

    就这么几个鸟东西,写在记事本,另存为setup.bat .最原始的初衷就是安装完了第一个,接着第二个启动安装,接着第三个...直到最后安装本系统应用程序。

    安装时,点击setup.bat也能安装,可以是遇到了配置稍高一点的电脑上安装就不能了,几个进程一起进行安装,引发操作系统IO冲突。显然达不到目的。

    因此,我想到用C#来控制实现按顺序安装。

    代码
    1 using Microsoft.Win32;
    2 using System;
    3 using System.Diagnostics;
    4 using System.IO;
    5 using System.Data;
    6 using System.Data.SqlClient;
    7 using System.Text;
    8 using System.ServiceProcess;
    9
    10 internal class DYSetup
    11 {
    12 private static void Main(string[] args)
    13 {
    14 ProcessStartInfo info1 = new ProcessStartInfo();
    15 Process process1 = new Process();
    16 string baseFile = AppDomain.CurrentDomain.BaseDirectory;
    17 Console.WriteLine("系统配置安装环境...");
    18 try
    19 {
    20 //string eFilePath = @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727";
    21 //if (Directory.Exists(eFilePath))
    22 //{
    23 // Console.WriteLine(".NET Framwork2.0已经安装过");
    24 //}
    25 //else
    26 //{
    27 // info1.FileName = baseFile + "System\\dotnetfx2.0.exe";
    28 // process1.StartInfo = info1;
    29 // process1.Start();
    30 // process1.WaitForExit();
    31 // process1.Close();
    32 // Console.WriteLine("Framwork2.0 安装完成");
    33 //}
    34   try
    35 {
    36 string sqlServePath = @"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe";
    37 if (File.Exists(sqlServePath))
    38 {
    39 Console.WriteLine("MSSQLserver2000数据库已经安装过");
    40 }
    41 else
    42 {
    43 info1.FileName = baseFile + "SQL2000\\AutoRun.exe";
    44 process1.StartInfo = info1;
    45 process1.Start();
    46 process1.WaitForExit();
    47 process1.Close();
    48 Console.WriteLine("数据库安装完成");
    49 Console.WriteLine("正在启动数据库管理器服务");
    50 //Process.Start(@"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe");
    51   }
    52
    53 ServiceController sc = new ServiceController("MSSQLSERVER");//启动数据库服务
    54   if (sc.Status.Equals(ServiceControllerStatus.Stopped))
    55 {
    56 sc.Start();
    57 sc.Refresh();//刷新服务
    58 }
    59 }
    60 catch (System.Exception ex)
    61 {
    62 Console.WriteLine(ex.Message);
    63 }
    64 finally
    65 {
    66 try
    67 {
    68 string filePath = @"C:\Program Files\ScanDrv6\5800";
    69 if (Directory.Exists(filePath))
    70 {
    71 Console.WriteLine("仪器驱动程序已经安装过...");
    72 }
    73 else
    74 {
    75 info1.FileName = baseFile + "driver\\BQDriver\\setup.exe";
    76 process1.StartInfo = info1;
    77 process1.Start();
    78 process1.WaitForExit();
    79 process1.Close();
    80 Console.WriteLine("仪器驱动程序安装完成");
    81 }
    82 Console.WriteLine("系统正在启动USB转串口驱动程序安装...");
    83 }
    84 catch (System.Exception ex)
    85 {
    86 Console.WriteLine(ex.Message);
    87 }
    88 finally
    89 {
    90 string usbPath = @"C:\WINDOWS\Temp\PL-2303_loggedDrv";
    91 if (Directory.Exists(usbPath))
    92 {
    93 Console.WriteLine("USB转串口驱动已经安装");
    94 }
    95 else
    96 {
    97 info1.FileName = baseFile + "driver\\USBToCOM\\USBToPort.exe";
    98 process1.StartInfo = info1;
    99 process1.Start();
    100 process1.WaitForExit();
    101 process1.Close();
    102 Console.WriteLine("USB转串口驱动程序安装完成");
    103 }
    104 }
    105 }
    106
    107 Console.WriteLine("正在启动DY-7000软件程序安装...");
    108 info1.FileName = baseFile + "soft\\DY-7000V1.3.msi";
    109 process1.StartInfo = info1;
    110 process1.Start();
    111 process1.WaitForExit();
    112 process1.Close();
    113 Console.WriteLine("正在配置数据库,请稍等...");
    114
    115 string dbPath = @"C:\Program Files\Dayuan\DY-7000\App_Data";
    116 Console.WriteLine("请输入数据库SA用户密码,然后Enter进入!");
    117 string pwd = Console.ReadLine();
    118 if (!Directory.Exists(dbPath))
    119 {
    120 dbPath = @"D:\Program Files\Dayuan\DY-7000\App_Data";
    121 if (!Directory.Exists(dbPath))
    122 {
    123 dbPath = @"E:\Program Files\Dayuan\DY-7000\App_Data";
    124 }
    125 }
    126 if (!Directory.Exists(dbPath))
    127 {
    128 Console.WriteLine("数据库文件路径不存在,不能配置数据文件,请手动完成数据库配置。");
    129 }
    130 else
    131 {
    132 DbInstall(dbPath, pwd);
    133 Console.WriteLine("配置完成");
    134 }
    135 }
    136 catch (Exception ex)
    137 {
    138 Console.WriteLine("安装中断");
    139 Console.WriteLine(ex.Message);
    140 Console.ReadKey();
    141 }
    142 finally
    143 {
    144 Console.WriteLine("安装完成");
    145 }
    146 }
    147
    148 private static void ExecuteSql(string connStr, string DatabaseName, string Sql)
    149 {
    150 SqlConnection conn = new SqlConnection(connStr);
    151 SqlCommand cmd = new SqlCommand(Sql, conn);
    152 conn.Open();
    153 conn.ChangeDatabase(DatabaseName);
    154 try
    155 {
    156 cmd.ExecuteNonQuery();
    157 }
    158 finally
    159 {
    160 if (cmd != null)
    161 {
    162 cmd.Dispose();
    163 }
    164 if (conn != null)
    165 {
    166 conn.Dispose();
    167 }
    168 }
    169 }
    170 private static void DbInstall(string path,string sPwd)
    171 {
    172 string server = ".";//服务器地址
    173 string dbName = "DY7000";
    174 string user = "DY7000_USER";//这个用户数据库不是master sa
    175 string pwd = "ndy7000";
    176 try
    177 {
    178 string connStr = string.Format("data source={0};user id=sa;password={1};", server, sPwd);
    179 StringBuilder cmdText = new StringBuilder();
    180 cmdText.Append("IF NOT EXISTS(SELECT [NAME] FROM master.dbo.sysdatabases WHERE([NAME]='DY7000'))");
    181 cmdText.AppendFormat("EXEC sp_attach_db @dbname = N'{0}', @filename1 = N'{1}\\DY7000.mdf',@filename2=N'{1}\\DY7000_log.LDF';", dbName, path);
    182
    183 // cmdText.AppendFormat("IF NOT EXISTS(select sid from sysxlogins a where a.name='{0}')", user);
    184 cmdText.AppendFormat("EXEC sp_addlogin '{0}','{1}','{2}',null,null;", user, pwd, dbName);//增加登录用户
    185 cmdText.AppendFormat("EXEC sp_grantdbaccess '{0}', '{0}';", user);
    186 cmdText.AppendFormat("USE {0};", dbName);
    187 cmdText.AppendFormat("EXEC sp_dropuser '{0}' ;", user);
    188 cmdText.AppendFormat("EXEC sp_adduser '{0}' ;", user);
    189 cmdText.AppendFormat("EXEC sp_addrolemember 'db_owner','{0}';", user);
    190 ExecuteSql(connStr, "Master", cmdText.ToString());
    191 }
    192 catch (Exception ex)
    193 {
    194 Console.WriteLine(ex.Message);
    195 Console.WriteLine("按任意键完成!");
    196 Console.ReadKey();
    197 }
    198 }
    199 }

      

    程序的第一步安装MSSQL,接着安装驱动程序、接着安装项目程序,接着把数据文件附加到数据库。且每一步安装时候都进一步一个简单判断,如果是已经安装过的,不会再次安装,如果第一次安装则全新安装。虽然程序判断各种路径也是笨拙的。

    在我的机子测试一下OK。当我兴致勃勃拿着安装程序到同事的机子上一安装问题又来了。数据库文件不会自动附加,其他都算OK。郁闷ing...查来查去原来,原来是程序安装附带的数据库版本是MSSQL2000个人版的,没有系统存储过程"sp_attach_db"。自动附加数据库没有办法执行。。。。

    我想不到有更好的办法。希望路过的好友们指导一下。

  • 相关阅读:
    数据库迁移到Amazon RDS 的问题
    排序算法之希尔排序
    第一个 Shell脚本
    排序算法之直接插入排序
    当前工作参考
    cerr
    阿里云典型应用案例
    云服务引擎ACE
    阿里云SLB
    指针使用注意事项
  • 原文地址:https://www.cnblogs.com/cgli/p/1947199.html
Copyright © 2011-2022 走看看