这个思路是在昨天写了一个数据库安装类以后想及的,昨天稍微研究了一下自定义安装的东西,感觉里面东西很多,以前我一直在找WISE和INSTALL SHIELD的FOR 。NET的程序,但现在觉得,对于一般应用而言,用。NET自己带的工具是绰绰有余了。
我目前的想法是让安装程序除了建立虚拟目录以外还得建立数据库,省得用户的手工操作,那样就会避免很多麻烦。这个工作我昨天晚上在家的时候做了,今天我想我是不是应该能建立这样的一个工具,能够让别的开发人员省掉这一步,包括导数据结构和建立安装时候的数据库设置窗体,我想用插件的形式做这个工作。
显然BIGEAGLE知道我们大部分人的毛病,太浮躁了,不能把一件事情很专心的做好,于我而言,前辈的话是要听的,毛病还是要犯的,所以我决定做完第一步以后剩下的事情就先不理了,:)
其实只是因为前些日子论坛上的一些事情,我希望能够通过自己的努力让更多人去关注自己应该关注的东西,去珍惜这个网上家园。
废话说了这么多,:(
------------------------------------------------------------
文件SQLDMODemo.cs,实现操作的类
using System;
using SQLDMO;
using System.Windows.Forms;
namespace GenerateSQLScript
{
/// <summary>
/// SQLDMODemo 的摘要说明。
/// </summary>
public class SQLDMODemo
{
private const SQLDMO_SCRIPT_TYPE SQLDMOScript_Drops = SQLDMO_SCRIPT_TYPE.SQLDMOScript_Drops;
private const SQLDMO_SCRIPT_TYPE SQLDMOScript_IncludeHeaders = SQLDMO_SCRIPT_TYPE.SQLDMOScript_IncludeHeaders;
private const SQLDMO_SCRIPT_TYPE SQLDMOScript_Default = SQLDMO_SCRIPT_TYPE.SQLDMOScript_Default;
private const SQLDMO_SCRIPT_TYPE SQLDMOScript_AppendToFile =SQLDMO_SCRIPT_TYPE.SQLDMOScript_AppendToFile;
private const SQLDMO_SCRIPT_TYPE SQLDMOScript_Bindings = SQLDMO_SCRIPT_TYPE.SQLDMOScript_Bindings;
private SQLDMO.SQLDMO_SCRIPT_TYPE intOptions;
private SQLDMO.SQLDMO_SCRIPT2_TYPE int2Options;
public SQLDMODemo()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.intOptions = SQLDMOScript_Drops | SQLDMOScript_IncludeHeaders | SQLDMOScript_Default | SQLDMOScript_AppendToFile | SQLDMOScript_Bindings;
this.int2Options = SQLDMO_SCRIPT2_TYPE.SQLDMOScript2_Default;
}
/// <summary>
/// 导出SCRIPT的函数
/// </summary>
/// <param name="strServerName"></param>
/// <param name="strUserName"></param>
/// <param name="strPassword"></param>
/// <param name="strDataBase"></param>
/// <param name="strFilePath"></param>
public void GenerateSqlScript(string strServerName,string strUserName,string strPassword,string strDataBase,string strOwner,string strFilePath)
{
try
{
SQLDMO.SQLServer sql = new SQLDMO.SQLServer();
SQLDMO.Database db = new SQLDMO.Database();
SQLDMO.Trigger trigger = new SQLDMO.Trigger();
//连接数据库
sql.Connect(strServerName,strUserName,strPassword);
db = (SQLDMO.Database)sql.Databases.Item(strDataBase,strOwner);
//导出自定义类型
foreach (SQLDMO.UserDefinedDatatype objGen in db.UserDefinedDatatypes)
{
objGen.Script(intOptions,strFilePath,int2Options);
}
//导出表和触发器,过滤掉系统表
foreach (SQLDMO.Table objTable in db.Tables)
{
if (objTable.SystemObject == false)
{
objTable.Script(intOptions,strFilePath,null,int2Options);
foreach(SQLDMO.Trigger objTrigger in objTable.Triggers)
{
if (objTrigger.SystemObject == false)
{
objTrigger.Script(intOptions,strFilePath,int2Options);
}
}
}
}
//导出规则
foreach (SQLDMO.Rule objRule in db.Rules)
{
objRule.Script(intOptions,strFilePath,int2Options);
}
//导出存储过程
foreach (SQLDMO.StoredProcedure objProcedure in db.StoredProcedures)
{
if (objProcedure.SystemObject == false)
{
objProcedure.Script(intOptions,strFilePath,int2Options);
}
}
foreach (SQLDMO.View objView in db.Views)
{
if (objView.SystemObject == false)
{
objView.Script(intOptions,strFilePath,int2Options);
}
}
MessageBox.Show ("成功啦,恭喜,恭喜");
}
catch(Exception e)
{
MessageBox.Show(e.Message);
throw (e);
}
}
}
}
------------------------------------------------------------
测试程序Form1.cs
------------------------------------------------------------
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace GenerateSQLScript
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(336, 128);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(568, 341);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.button1});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
SQLDMODemo demo = new SQLDMODemo();
demo.GenerateSqlScript("(local)","sa","www.topcoolsite.com","bbs","dbo","c:\\aa.sql");
}
}
}
------------------------------------------------------------
感谢BigEagle、怡红公子、开心就好、jh.mei在本人书写本文时的帮助。
……