在一个桌面应用程序项目中,数据库用了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"。自动附加数据库没有办法执行。。。。
我想不到有更好的办法。希望路过的好友们指导一下。