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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

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


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

25152013-d3f04858b6c24af1be4b1ddb4436b19

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

  通过上图可以看到,生成的表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

如下图所示:

25152143-408eaa1099d5442db076692420a2f24

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

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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语句后的控件。


本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321309,如需转载请自行联系原作者

相关文章
|
8月前
|
前端开发 数据库
会议室管理系统源码(含数据库脚本)
会议室管理系统源码(含数据库脚本)
135 0
|
7月前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
337 20
|
8月前
|
Java 数据库
jsp CRM客户管理系统(含数据库脚本以及文档)
jsp CRM客户管理系统(含数据库脚本以及文档)
165 10
|
8月前
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
175 4
|
9月前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
273 68
|
9月前
|
SQL 关系型数据库 数据库连接
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1242 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
SQL 关系型数据库 MySQL

热门文章

最新文章