(喷血分享)利用.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. iebugs产生的原因,zoom:1的作用

    zoom:1是针对ie的属性,可以激活hasLayout属性,关于hasLayout haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在Intern ...

  2. BZOJ4530: [Bjoi2014]大融合

    Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...

  3. js正则表达式校验非负整数:^\d+$ 或 ^[1-9]\d*|0$ 【转载】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. LaTex Font Size 字体大小命令

    LaTex中字体大小有很多中等级,分别由下列命令控制: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE ...

  5. [LintCode] Paint House II 粉刷房子之二

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  6. zk编程语言: 如何改变datebox框值的大小及高度

    <?page title="" contentType="text/html;charset=UTF-8"?> <zk > <st ...

  7. 手机横屏竖屏css

    @media是css3中新定义的,功能非常强大,顾名思义PC是无法匹配横竖屏的,所以orientation只对移动设备起效. 1.头部声明 复制代码 代码如下: <meta name=" ...

  8. Jquery各个版本的区别

    一: 一般原则是越新越好,jQuery版本是在不断进步和发展的,最新版是当时最高技术水平,也是最先进的技术理念. 但个人的角度来看.是最新版本x.x.0的上一版本最好.比如说1.10.0版,上一版本是 ...

  9. c# select标签绑定枚举,并以Description做Text显示

    今天在做项目时遇到一个问题: 开发中有些字段是枚举类型如 Dept 企业表中可能有个字段 Property 性质 0:事业单位,1:私企,2:外企,但有时我们不会单独为性质这个字段定义一张表, 而是在 ...

  10. javascript模拟jQuery封装委托事件,兼容IE

    var $ = function(id){ var dom = document.getElementById(id); return { on:function(eventType,element, ...