您的位置:首页 > 其它

制作安装包遇到的问题

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#来控制实现按顺序安装。

代码

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"。自动附加数据库没有办法执行。。。。

我想不到有更好的办法。希望路过的好友们指导一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: