制作安装包遇到的问题

在一个桌面应用程序项目中,数据库用了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"。自动附加数据库没有办法执行。。。。

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

原文地址:https://www.cnblogs.com/cgli/p/1947199.html