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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

(喷血分享)利用.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,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
3月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
104 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
2月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
226 3
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
128 68
|
21天前
|
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'.
34 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
17天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
20天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
|
26天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
29天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
15天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)