您的位置:首页 > 数据库

C#打包SQL数据库部署安装

2007-08-12 19:40 489 查看
借鉴MSDN webcasts的Asp.net程序部署李洪根的一篇文章,然后加上自己的亲身体会,把整个SQL和Asp.net(vb.net)一起打包的全过程写一下。
一.准备必要的文件

1. SQL脚本文件,生成以后安装过程中需要的表和存储过程等等;

Imports System.ComponentModel

2

3imports System.Configuration.Install

4

5imports System.IO

6

7imports System.Reflection

8

9

10

11

194

有点难度的就是那个Process类,它调用了osql.exe程序,来执行sql语句osql -U,-P,,-d,-i。

web.config的修改代码是利用xml的语法实现。不是很难理解。

最后编译生成!如图:



安装界面:如图



哈哈,总算写完了,也不知道有没有写好



最后还是感谢李洪根老师和微软的讲师。结合他们的共同的经验,部署起来真的很简单。

参考《ASP.NET与SQL一起打包部署安装》,这篇文章是针对VB.NET与SQL 一起打包的,但是我使用的是C#,当然只要修改一下主要安装类库就行了!C#的类库代码如下:DBCustomAction.cs

using System;
using System.Collections;
using System.Data.SqlClient;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Reflection;

namespace PMS
{
/// <summary>
/// DBCustomAction 的摘要说明。
/// </summary>
[RunInstaller(true)]
public class DBCustomAction : System.Configuration.Install.Installer
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public DBCustomAction()
{
// 该调用是设计器所必需的。
InitializeComponent();

// TODO: 在 InitializeComponent 调用后添加任何初始化
}

private void ExecuteSql(string conn,string DatabaseName,string Sql)
{
SqlConnection mySqlConnection=new SqlConnection(conn);
SqlCommand Command=new SqlCommand(Sql, mySqlConnection);
mySqlConnection.Open();
mySqlConnection.ChangeDatabase(DatabaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
//close Connection
mySqlConnection.Close();
}
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

//

public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);

// ------------------------建立数据库-------------------------------------------------

try
{
string connstr = String.Format("data source={0};user security info=false;packet size=4096", Context.Parameters["server"],Context.Parameters["user"], Context.Parameters["pwd"]);
//'根据输入的数据库名称建立数据库
ExecuteSql(connstr, "master", "CREATE DATABASE " +Context.Parameters["dbname"]);
//'调用osql执行脚本
Process sqlprocess=new System.Diagnostics.Process();
sqlprocess.StartInfo.FileName = "osql.exe ";
sqlprocess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", Context.Parameters["user"], Context.Parameters["pwd"],Context.Parameters["dbname"],Context.Parameters["targetdir"]);
sqlprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
sqlprocess.Start();
sqlprocess.WaitForExit(); // '等待执行
sqlprocess.Close();

//'删除脚本文件
FileInfo sqlfileinfo =new FileInfo(String.Format("{0}db.sql",Context.Parameters["targetdir"]));

if (sqlfileinfo.Exists)
{
sqlfileinfo.Delete();
}
}
catch(Exception ex)
{
throw ex;
}

//' ---------------------将连接字符串写入Web.config-----------------------------------
/*
try
{
FileInfo fileinfo = new FileInfo(Context.Parameters["targetdir"] + "\\web.config");
if (!fileinfo.Exists)
{
throw new InstallException("没有找到配置文件");

}

//'实例化xml文档

XmlDocument xmldocument=new XmlDocument();

xmldocument.Load(fileinfo.FullName);

//'查找到appsettings中的节点

//XmlNode node=new XmlNode();

Boolean FoundIt = false;

foreach(XmlNode node in xmldocument.SelectSingleNode("appSettings").ChildNodes)
{
if (node.Name == "add")
{
if (node.Attributes.GetNamedItem("key").Value == "connString")
{
//'写入连接字符串
node.Attributes.GetNamedItem("value").Value= String.Format("Persist Security Info=False;Data Source={0};Initial Catalog={1};User Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1",Context.Parameters["server"],Context.Parameters["dbname"], Context.Parameters["user"], Context.Parameters["pwd"]);
FoundIt= true;
}
}
}

if (!FoundIt)
{
throw new InstallException("web.Config 文件没有包含connString连接字符串设置");
}
xmldocument.Save(fileinfo.FullName);
}
catch(Exception ex)
{
throw ex;
}
*/
}

#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

我不需要修改Web.config的部分.
注意.如果不用SA用户登录数据库的,请先在服务器上建立特定的SQL用户
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: