设为首页 收藏本站
查看: 974|回复: 0

[经验分享] 在.NET程序安装包中附带 SQL SERVER数据库安装功能

[复制链接]

尚未签到

发表于 2016-11-7 09:18:22 | 显示全部楼层 |阅读模式
在.NET程序安装包中附带 SQL SERVER数据库安装功能

左直拳

一、 安装文件夹中添加数据库安装程序dbInstall.dll以及建数据库脚本data.sql。dbInstall是一个自己编写的DLL,代码见附录。
二、 添加自定义功能。
方法:选定安装项目,鼠标右键,弹出快捷菜单,选视图-自定义操作。也可以直接点“解决方案资源管理器”上部的快捷图标。
进入“自定义操作”视图后,在“安装”目录下添加自定义操作,对应之前添加的dbInstall,命名为“安装数据库”。编辑属性,
CustomerActionData  

/targetdir=[TARGETDIR] /dbfile="data.sql"  

这是传递给数据库安装程序dbInstall.dll的参数。  

附录:  

dbInstall.dll  

这是一个Windows应用程序。主要由两部分组成。  

1、信息采集界面部分(dbpara.cs),采集必要的数据库安装信息,如下(不知道为什么,无法上传图片):
服务器 默认为(local)
数据库管理员帐户 默认为sa
数据库管理员密码
待安装数据库名称 自己填写

  

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 306pt; HEIGHT: 198pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/chenqu/LOCALS~1/Temp/msoclip1/01/clip_image001.png" o:title=""></imagedata></shape>  

2、数据库安装部分(组件类dbInstall.cs  

public override void Install(System.Collections.IDictionary stateSaver)  

{  

base.Install(stateSaver);  

  

string dbFile = this.Context.Parameters["dbfile"];  

if( dbFile == null || this.Context.Parameters["installstyle"] == null )  

{  

return;  

}  

  

//创建数据库  

CREATEDB:  

//激活信息采集界面  

dbInstall.FrmDbpara dbpara = new dbInstall.FrmDbpara();  

if( dbpara.ShowDialog() == DialogResult.Cancel )  

{  

throw(new InstallException("安装失败。"));  

}  

string server = dbpara.Server;//服务器  

string user = dbpara.User; //数据库管理员帐号,如sa  

string pwd = dbpara.Pwd; //数据库管理员帐号密码  

string db = dbpara.Db; //待建立的数据库名  

dbpara.Dispose();  

//开始安装数据库  

string strConn = String.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", server,user,pwd);  

string strCreateDB = String.Format("CREATE DATABASE {0} ON (NAME={0}_data,FILENAME=\'{1}data\\{0}_data.mdf\') LOG ON (NAME={0}_log,FILENAME=\'{1}data\\{0}_log.ldf\')",db,this.Context.Parameters["targetdir"]);  

try  

{  

ExecuteSql(strConn, "master", strCreateDB);  

System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();  

sqlProcess.StartInfo.FileName = "osql.exe";  

sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}" + dbFile,user,pwd,db,this.Context.Parameters["targetdir"]);  

sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;  

sqlProcess.Start();  

sqlProcess.WaitForExit();  

sqlProcess.Close();  

//把数据库脚本文件删掉  

System.IO.FileInfo fileSql = new System.IO.FileInfo(String.Format("{0}" + dbFile, this.Context.Parameters["targetdir"]));  

if( fileSql.Exists )  

{  

fileSql.Delete();  

}  

}  

catch( Exception ex )  

{  

switch( MessageBox.Show(ex.Message,"错误",MessageBoxButtons.AbortRetryIgnore,MessageBoxIcon.Exclamation) )  

{  

case DialogResult.Retry:  

goto CREATEDB;  

case DialogResult.Abort:  

throw(new InstallException("安装失败。"));  

case DialogResult.Ignore:  

break;  

default:  

throw(new InstallException(ex.Message + "\n安装失败。"));  

}  

}  

  

}  

  

/// <summary>  

/// 执行SQL  

/// </summary>  

/// <param name="strConn"></param>  

/// <param name="dbname"></param>  

/// <param name="sql"></param>  

private void ExecuteSql(string strConn,string dbname,string sql)  

{  

SqlConnection conn = new SqlConnection(strConn);  

SqlCommand cmd = new SqlCommand(sql,conn);  

cmd.Connection.Open();  

cmd.Connection.ChangeDatabase(dbname);  

try  

{  

cmd.ExecuteNonQuery();  

}  

catch(Exception ex)  

{  

MessageBox.Show(ex.Message);  

}  

finally  

{  

conn.Close();  

}  

}  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296848-1-1.html 上篇帖子: 【SQL Server】存储过程的设计与概念(2)从存储过程接收信息 下篇帖子: 数据库各厂商发展历史(6. MS SQL Server, PostgreSQL及其它)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表