(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

  在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREATE语句,如下图所示:

  在实现此功能前摸索了很多方法,最后借助MSSQLSERVER自带的dll文件来完成。先截图展示下此功能生成后的效果,然后再分享代码与方法,欢迎大家讨论其他可行方式,谢谢。 

  通过上图可以看到,生成的表CREATE语句与SQLSERVER企业管理器生成的语句完全一样。现在我们来看一看如何实现。在上面我说过,我采用的是SQLSERVER自带的dll文件的方法来完成。因此,我们首先要引用MSSQLSERVER的相关dll文件,如我的SQLSERVER安装在“D:\Program Files\Microsoft SQL Server\”,打开目录“D:\Program Files\Microsoft SQL Server\100\SDK\Assemblies”,就可以看到SQLSERVER的全部dll文件了,其实通过这些dll文件,我们可以完成像SQLSERVER企业管理器一样的功能,非常强大,看你怎么使用了,在此仅抛砖引玉。我们需要在我们的项目中添加两个dll文件的引用,分别为:

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Management.Sdk.Sfc.dll

如下图所示:

  

引用了上面两个dll文件后,在我们的项目中添加命名空间:

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

现在,我们就可以使用MSSQLSERVER提供的类库来生成表的CREATE语句了。

下面给出创建的全部代码:

     private void ScriptOption()
{
scriptOption.ContinueScriptingOnError = true;
scriptOption.IncludeIfNotExists = true;
scriptOption.NoCollation = true;
scriptOption.ScriptDrops = false;
scriptOption.ContinueScriptingOnError = true;
//scriptOption.DriAllConstraints = true;
scriptOption.WithDependencies = false;
scriptOption.DriForeignKeys = true;
scriptOption.DriPrimaryKey = true;
scriptOption.DriDefaults = true;
scriptOption.DriChecks = true;
scriptOption.DriUniqueKeys = true;
scriptOption.Triggers = true;
scriptOption.ExtendedProperties = true;
scriptOption.NoIdentities = false;
} /// <summary>
/// 生成数据库类型为SqlServer指定表的DDL
/// </summary>
private void GenerateSqlServerDDL()
{
//对于已经生成过的就不用再次生成了,节约资源。
if (!string.IsNullOrEmpty(textEditorDDL.Text) && textEditorDDL.Text.Trim().Length > 10)
{
return;
} ScriptOption();
ServerConnection sqlConnection = null;
try
{
StringBuilder sbOutPut = new StringBuilder(); if (dbSet.ConnectStr.ToLower().Contains("integrated security")) //Windows身份验证
{
sqlConnection = new ServerConnection(dbSet.Server);
}
else //SqlServer身份验证
{
string[] linkDataArray = dbSet.ConnectStr.Split(';');
string userName = string.Empty;
string pwd = string.Empty;
foreach (string str in linkDataArray)
{
if(str.ToLower().Replace(" ","").Contains("userid="))
{
userName = str.Split('=')[1];
} if (str.ToLower().Replace(" ", "").Contains("password"))
{
pwd = str.Split('=')[1];
}
} sqlConnection = new ServerConnection(dbSet.Server,userName,pwd);
} Server sqlServer = new Server(sqlConnection);
Table table = sqlServer.Databases[dbSet.DbName].Tables[txtName.Text];
string ids;
//编写表的脚本
sbOutPut = new StringBuilder();
sbOutPut.AppendLine();
sCollection = table.Script(scriptOption); foreach (String str in sCollection)
{
//此处修正smo的bug
if (str.Contains("ADD DEFAULT") && str.Contains("') AND type = 'D'"))
{
ids = str.Substring(str.IndexOf("OBJECT_ID(N'") + "OBJECT_ID(N'".Length, str.IndexOf("') AND type = 'D'") - str.IndexOf("OBJECT_ID(N'") - "OBJECT_ID(N'".Length);
sbOutPut.AppendLine(str.Insert(str.IndexOf("ADD DEFAULT") + 4, "CONSTRAINT " + ids));
}
else
sbOutPut.AppendLine(str); sbOutPut.AppendLine("GO");
} //生成存储过程
this.textEditorDDL.SetCodeEditorContent("SQL", sbOutPut.ToString());
this.textEditorDDL.SaveFileName = this.TableName + ".sql";
sbOutPut = new StringBuilder();
}
catch (Exception ex)
{
LogHelper.WriteException(ex);
}
finally
{
sqlConnection.Disconnect();
}
}  

说明:textEditorDDL为显示生成表CREATE语句后的控件。

欢迎讨论其他方法,谢谢!

如果觉得对你有引导与帮助,可以点下推荐,谢谢!

(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句的更多相关文章

  1. 利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFram ...

  2. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  3. student表中创建触发器,实现student表和student _course表的级联删除

    create trigger Delete_sc on student for delete as delete student_course where student_course.s_no in ...

  4. 常用脚本--生成Agent Job的创建脚本

    USE [master] GO /****** Object: StoredProcedure [dbo].[DumpJobsql] Script Date: 02/07/2014 11:38:46 ...

  5. springJDBC01 利用springJDBC操作数据库

    1 什么是springJDBC spring通过抽象JDBC访问并一致的API来简化JDBC编程的工作量.我们只需要声明SQL.调用合适的SpringJDBC框架API.处理结果集即可.事务由Spri ...

  6. SQL Server2008生成数据库字典

    1.我们在开发过程中可能会遇到这样的一种情况"当我们进行维护其他人的项目时或者项目的二次开发时可能会对原始的数据表进行分析",这里为大家介绍一种方便快捷生成数据库字典的方式. 我们 ...

  7. Oracle工具类-生成数据库现有Job的创建脚本

    生成Oracle数据库现有Job的创建脚本 -- 生成现有Job的创建脚本 create or replace procedure proc_generate_job_create_sql is be ...

  8. SQL语句(一)SQL和数据库数据表的创建

    SQL的组成 (1) 数据定义语言DDL(Data Definition Language) 用于数据库和数据表的创建.修改和删除等操作 CREATE (create) 创建数据库.数据表 ALTER ...

  9. HAWQ取代传统数仓实践(十五)——事实表技术之无事实的事实表

    一.无事实事实表简介 在多维数据仓库建模中,有一种事实表叫做"无事实的事实表".普通事实表中,通常会保存若干维度外键和多个数字型度量,度量是事实表的关键所在.然而在无事实的事实表中 ...

随机推荐

  1. Sphinx 实时索引

    index rt { type = rt rt_mem_limit = 512M path = /usr/local/sphinx/data/rt rt_field = title rt_field ...

  2. 【CodeVS】P1041 car的旅行路线

    题目描述 Description 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I ...

  3. SDL实战,小游戏

    http://www.cppblog.com/sandy/archive/2005/12/28/2219.html sdl1教学 http://kelvmiao.info/sdl-tutorial-c ...

  4. Linux下多进程编程之exec函数语法及使用实例

    exec函数族 1)exec函数族说明 fork()函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?exec函数族就提供了一个在进程中启动另一个程序执行的 ...

  5. POJ3903:Stock Exchange(LIS)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E 题目: Description The world ...

  6. First day in 阿里

    周五上午10点半的飞机,为了便宜选了CA的空客320的飞机,结果体验很差.飞机涂了层风骚的粉紫色,机内较旧,也很小,经过所谓的头等舱简直惨不忍睹.对比起去年飞去北京乘的波音真是没法比,波音上每个人都有 ...

  7. Map 映射

    package lis0924; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import j ...

  8. 帝国备份王(Empirebak)万能cookie及拿shell

    1.伪造cookie登录系统(其实这一步多余的,大多用户连密码都没改,都是默认的123456) 登录成功设置4个cookie,看代码 function login($lusername,$lpassw ...

  9. C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...

  10. smarty 入门2(个人总结)

    1.下载安装: 2.拷贝libs文件夹到web文件夹: 3.引入smarty类文件   // include './libs/Smarty.class.php'; 4.配置smarty      // ...