制作安装包遇到的问题
2011-01-28 18:24
381 查看
在一个桌面应用程序项目中,数据库用了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#来控制实现按顺序安装。
代码
程序的第一步安装MSSQL,接着安装驱动程序、接着安装项目程序,接着把数据文件附加到数据库。且每一步安装时候都进一步一个简单判断,如果是已经安装过的,不会再次安装,如果第一次安装则全新安装。虽然程序判断各种路径也是笨拙的。
在我的机子测试一下OK。当我兴致勃勃拿着安装程序到同事的机子上一安装问题又来了。数据库文件不会自动附加,其他都算OK。郁闷ing...查来查去原来,原来是程序安装附带的数据库版本是MSSQL2000个人版的,没有系统存储过程"sp_attach_db"。自动附加数据库没有办法执行。。。。
我想不到有更好的办法。希望路过的好友们指导一下。
部署安装的时候要求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#来控制实现按顺序安装。
代码
using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Data; using System.Data.SqlClient; using System.Text; using System.ServiceProcess; internal class DYSetup { private static void Main(string[] args) { ProcessStartInfo info1 = new ProcessStartInfo(); Process process1 = new Process(); string baseFile = AppDomain.CurrentDomain.BaseDirectory; Console.WriteLine("系统配置安装环境..."); try { //string eFilePath = @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"; //if (Directory.Exists(eFilePath)) //{ // Console.WriteLine(".NET Framwork2.0已经安装过"); //} //else //{ // info1.FileName = baseFile + "System\\dotnetfx2.0.exe"; // process1.StartInfo = info1; // process1.Start(); // process1.WaitForExit(); // process1.Close(); // Console.WriteLine("Framwork2.0 安装完成"); //} try { string sqlServePath = @"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe"; if (File.Exists(sqlServePath)) { Console.WriteLine("MSSQLserver2000数据库已经安装过"); } else { info1.FileName = baseFile + "SQL2000\\AutoRun.exe"; process1.StartInfo = info1; process1.Start(); process1.WaitForExit(); process1.Close(); Console.WriteLine("数据库安装完成"); Console.WriteLine("正在启动数据库管理器服务"); //Process.Start(@"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe"); } ServiceController sc = new ServiceController("MSSQLSERVER");//启动数据库服务 if (sc.Status.Equals(ServiceControllerStatus.Stopped)) { sc.Start(); sc.Refresh();//刷新服务 } } catch (System.Exception ex) { Console.WriteLine(ex.Message); } finally { try { string filePath = @"C:\Program Files\ScanDrv6\5800"; if (Directory.Exists(filePath)) { Console.WriteLine("仪器驱动程序已经安装过..."); } else { info1.FileName = baseFile + "driver\\BQDriver\\setup.exe"; process1.StartInfo = info1; process1.Start(); process1.WaitForExit(); process1.Close(); Console.WriteLine("仪器驱动程序安装完成"); } Console.WriteLine("系统正在启动USB转串口驱动程序安装..."); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } finally { string usbPath = @"C:\WINDOWS\Temp\PL-2303_loggedDrv"; if (Directory.Exists(usbPath)) { Console.WriteLine("USB转串口驱动已经安装"); } else { info1.FileName = baseFile + "driver\\USBToCOM\\USBToPort.exe"; process1.StartInfo = info1; process1.Start(); process1.WaitForExit(); process1.Close(); Console.WriteLine("USB转串口驱动程序安装完成"); } } } Console.WriteLine("正在启动DY-7000软件程序安装..."); info1.FileName = baseFile + "soft\\DY-7000V1.3.msi"; process1.StartInfo = info1; process1.Start(); process1.WaitForExit(); process1.Close(); Console.WriteLine("正在配置数据库,请稍等..."); string dbPath = @"C:\Program Files\Dayuan\DY-7000\App_Data"; Console.WriteLine("请输入数据库SA用户密码,然后Enter进入!"); string pwd = Console.ReadLine(); if (!Directory.Exists(dbPath)) { dbPath = @"D:\Program Files\Dayuan\DY-7000\App_Data"; if (!Directory.Exists(dbPath)) { dbPath = @"E:\Program Files\Dayuan\DY-7000\App_Data"; } } if (!Directory.Exists(dbPath)) { Console.WriteLine("数据库文件路径不存在,不能配置数据文件,请手动完成数据库配置。"); } else { DbInstall(dbPath, pwd); Console.WriteLine("配置完成"); } } catch (Exception ex) { Console.WriteLine("安装中断"); Console.WriteLine(ex.Message); Console.ReadKey(); } finally { Console.WriteLine("安装完成"); } } private static void ExecuteSql(string connStr, string DatabaseName, string Sql) { SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(Sql, conn); conn.Open(); conn.ChangeDatabase(DatabaseName); try { cmd.ExecuteNonQuery(); } finally { if (cmd != null) { cmd.Dispose(); } if (conn != null) { conn.Dispose(); } } } private static void DbInstall(string path,string sPwd) { string server = ".";//服务器地址 string dbName = "DY7000"; string user = "DY7000_USER";//这个用户数据库不是master sa string pwd = "ndy7000"; try { string connStr = string.Format("data source={0};user id=sa;password={1};", server, sPwd); StringBuilder cmdText = new StringBuilder(); cmdText.Append("IF NOT EXISTS(SELECT [NAME] FROM master.dbo.sysdatabases WHERE([NAME]='DY7000'))"); cmdText.AppendFormat("EXEC sp_attach_db @dbname = N'{0}', @filename1 = N'{1}\\DY7000.mdf',@filename2=N'{1}\\DY7000_log.LDF';", dbName, path); // cmdText.AppendFormat("IF NOT EXISTS(select sid from sysxlogins a where a.name='{0}')", user); cmdText.AppendFormat("EXEC sp_addlogin '{0}','{1}','{2}',null,null;", user, pwd, dbName);//增加登录用户 cmdText.AppendFormat("EXEC sp_grantdbaccess '{0}', '{0}';", user); cmdText.AppendFormat("USE {0};", dbName); cmdText.AppendFormat("EXEC sp_dropuser '{0}' ;", user); cmdText.AppendFormat("EXEC sp_adduser '{0}' ;", user); cmdText.AppendFormat("EXEC sp_addrolemember 'db_owner','{0}';", user); ExecuteSql(connStr, "Master", cmdText.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("按任意键完成!"); Console.ReadKey(); } } }
程序的第一步安装MSSQL,接着安装驱动程序、接着安装项目程序,接着把数据文件附加到数据库。且每一步安装时候都进一步一个简单判断,如果是已经安装过的,不会再次安装,如果第一次安装则全新安装。虽然程序判断各种路径也是笨拙的。
在我的机子测试一下OK。当我兴致勃勃拿着安装程序到同事的机子上一安装问题又来了。数据库文件不会自动附加,其他都算OK。郁闷ing...查来查去原来,原来是程序安装附带的数据库版本是MSSQL2000个人版的,没有系统存储过程"sp_attach_db"。自动附加数据库没有办法执行。。。。
我想不到有更好的办法。希望路过的好友们指导一下。
相关文章推荐
- .Net web 项目安装包制作中遇到的小问题
- 解决使用Visual Studio 2005制作Windows Mobile安装包遇到的一个小问题
- 制作安装包遇到的问题安装netframewo
- c# 安装包制作 可能遇到的问题及处理方法
- Andriod 版本更新以及安装包下载等遇到问题以及解决
- 移动端制作遇到的各种问题
- 贪吃蛇的制作过程中遇到的一些小问题
- 网站制作中可能遇到的问题
- VS .NET 安装包制作需要注意的问题
- 制作IOS 后台推送时,遇到的小问题
- 制作cab安装包时出现“Windows ce向导遇到了错误……”的解决方案
- VS2010安装包制作 [桌面快捷图标 右键属性 打开文件位置]问题解决
- 【Unity】制作手游的帧同步时遇到的问题
- HTML 静态页面制作遇到问题
- 制作手机页面过程中遇到的一点问题
- cocoa pod 制作私有静态库时写完codspec文件又遇到了linker command failed却没有具体错误原因的问题
- Unity3d中制作Loading场景进度条所遇到的问题
- 制作tab切换时遇到的问题
- 小车制作过程中遇到的几个问题
- Unity3d中制作异步Loading进度条所遇到的问题