Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server)
一开始,判断表存在并删除表的代码是我自己写的,基本做法如下:
private void tt()
{
try
{
SqlConnection conn=new SqlConnection(txtConn.Text.Trim());
string sql="select name from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 and name not in ('dtproperties')";
SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);
SqlCommandBuilder sb=new SqlCommandBuilder(adapter);
DataTable dt=new DataTable();
adapter.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
CreateDropTableScript(dt.Rows[i][0].ToString());
}
txtResult.Text=sBuilder.ToString();
dt.Dispose();
conn.Close();
}
catch (Exception ex)
{
}
}
private void CreateDropTableScript(string tblName)
{
Output("if exists (select * from dbo.sysobjects where id = object_id(N'["+tblName+"]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)");
Output("drop table ["+tblName+"]");
Output("GO");
}
private void Output(string s)
{
sBuilder.Append(s);
sBuilder.Append(Environment.NewLine);
}
创建表和生成insert语句的部分是使用了Mygeneration的模板CreateTable.zenus和SQL_DataInserts.zenus.
后来为了省事,就改了CreateTable.zenus模板,在Create Table之前加入如下代码:
if exists (select * from dbo.sysobjects where id = object_id(N'[<%=table.Name%>]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [<%=table.Name%>]
GO
修改后完整的Template Code代码如下:
Public Class GeneratedTemplateClass GeneratedTemplate
Inherits DotNetScriptTemplate
Public Sub New()Sub New(context As ZeusContext)
MyBase.New(context)
End Sub
'---------------------------------------------------
' Render() is where you want to write your logic
'---------------------------------------------------
Public Overrides Sub Render()Sub Render
Dim db as IDatabase
Dim table As ITable
Dim col as IColumn
Dim IsFirst As Boolean
Dim FK As IForeignKey
Dim fkeys As New HashTable
Dim PKIndex As IIndex
db = MyMeta.Databases(input.Item("cmbDatabase"))
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Creating basic table structur.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
For Each table in db.Tables
%>
if exists (select * from dbo.sysobjects where id = object_id(N'[<%=table.Name%>]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [<%=table.Name%>]
GO
CREATE TABLE [<%=table.Name%>] (
<%
IsFirst = True
output.incTab()
For Each Col in table.Columns
If IsFirst = False Then
output.write( "," )
output.writeln("")
End If
output.autotab( CreateColumnScript( col ) )
IsFirst = False
Next
output.decTab()
%>
)
GO
<%
PKIndex = Nothing
For Each FK In table.ForeignKeys
If Not fKeys.ContainsKey( FK.Name ) Then
fKeys.Add( FK.Name, FK )
End If
If PKIndex Is Nothing AndAlso FK.PrimaryTable.Name = table.Name Then
PKIndex = table.Indexes( FK.PrimaryKeyName )
End If
Next
If Not PKIndex Is Nothing Then
%>
ALTER TABLE [<%=table.Name%>] WITH NOCHECK ADD
CONSTRAINT [<%=PKIndex.Name%>] PRIMARY KEY <%If PKIndex.Clustered Then output.write("CLUSTERED") %>
(
<%
IsFirst = True
For Each col In PKIndex.Columns
If IsFirst = False Then
output.write(",")
output.writeln("")
End If
output.autotab("[" + col.Name + "]")
IsFirst = False
Next
%>
) ON [PRIMARY]
GO
<%
End If
Next
For Each FK In fKeys.Values
%>
ALTER TABLE [<%=FK.ForeignTable.Name%>] ADD
CONSTRAINT [<%=FK.Name%>] FOREIGN KEY
(
<%
IsFirst = True
For Each col In FK.ForeignColumns
If IsFirst = False Then
output.write(",")
output.writeln("")
End If
output.autotab("[" + col.Name + "]")
IsFirst = False
Next
%>
) REFERENCES [<%=FK.PrimaryTable.Name%>] (
<%
IsFirst = True
For Each col In FK.PrimaryColumns
If IsFirst = False Then
output.write(",")
output.writeln("")
End If
output.autotab("[" + col.Name + "]")
IsFirst = False
Next
%>
) <%
If FK.DeleteRule <> "NO ACTION" Then
output.write( " ON DELETE " + FK.DeleteRule)
End If
If FK.UpdateRule <> "NO ACTION" Then
output.write( " ON UPDATE " + FK.UpdateRule)
End If
%>
GO
<%
Next
End Sub
Private Function CreateColumnScript()Function CreateColumnScript( ByVal col As IColumn ) As String
Dim retStr As String
retStr = "[" + col.Name + "] " + col.DataTypeNameComplete
If col.IsAutoKey Then
retStr += " IDENTITY ( " + col.AutoKeySeed.ToString() + "," + col.AutoKeyIncrement.ToString() + " )"
End If
If col.HasDefault Then
retStr += " DEFAULT (" + col.Default + ")"
End If
If col.IsNullable Then
retStr += " NULL"
Else
retStr += " NOT NULL"
End If
Return retStr
End Function
End Class
%>
当然生成insert语句的时候对Image字段无法处理。
既然Mygeneration可以很好地完成我要的工作(项目中需要做数据库自动安装部分,就是开头提到的那个demo,当然还需要做很多完善的工作),我暂时也就懒得写自己的代码了,等有时间的时候也许我会重新写下的。
注:安装Mygeneration后,默认没有上面所提到的两个模板,你需要到mygeneration在线模板库下载,你可以通过浏览网页找到所需的模板,然后保存到指定目录,当然下面的方法也许更让你觉得方便很多:
download Templates from Mygeneration Online Template library
也许有朋友有更好的实现方法,希望能拿出来大家分享,谢谢!
Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server)相关推荐
- 【翻译】基于 Create React App路由4.0的异步组件加载(Code Splitting)
基于 Create React App路由4.0的异步组件加载 本文章是一个额外的篇章,它可以在你的React app中,帮助加快初始的加载组件时间.当然这个操作不是完全必要的,但如果你好奇的话,请随 ...
- SQL JOIN TABLES:在SQL Server中使用查询
In this article, you will see how to use different types of SQL JOIN tables queries to select data f ...
- CREATE VIEW SQL:在SQL Server中使用索引视图
This is the fourth article in a series of learning the CREATE VIEW SQL statement. So far, we have do ...
- CREATE VIEW SQL:通过SQL Server中的视图插入数据
This is the third article in a series of learning the CREATE VIEW SQL statement. So far, I'd say tha ...
- sql 高级 (五)(create index(创建索引) drop)
2019独角兽企业重金招聘Python工程师标准>>> SQL create index 语句 create index语句用于在表中创建索引. 在不读取整个表的情况下,索引使数据 ...
- 【opencv4】opencv教程 C++ 4、Mat对象(深拷贝:clone()、copyTo(),create()创建图片,zeros()、eye()初始化空白图像,Scalar()创建向量)
上一讲:[opencv4]opencv视频教程 C++(opencv教程)3.矩阵的掩膜操作(filter2D) 下一讲:[opencv4]opencv视频教程 C++ 5.读写图像imread.im ...
- 用NFS挂载root出现:NFS: failed to create MNT RPC client, status=-101(-110)
2014-02-18 08:06:17 By Ly #Linux 阅读(78) 评论(0) 错误信息如下: Root-NFS: nfsroot=/home/zenki/nfs/rootfs NFS: ...
- 项目开发日志:Build AssetBundle——SpriteAtlas(已解惑)
项目信息: 平台-Android Unity编辑器版本-2018.2.5f1 状况1:真机状况下引用到图集下的sprite的UI显示出错.(图集被打成AB包且勾选了Include in Build). ...
- Jenkins Build Radiators(构建发射源)
为什么80%的码农都做不了架构师?>>> information radiators(信息发射源)的概念通常被用在敏捷的圈子里. 据敏捷专家Alistair Cockburn所 ...
最新文章
- iphone开发UITable内嵌不同风格Table
- 如何优化myeclipse.
- 铁路从未授权任何第三方平台售票服务,各大旅游网站哪来的接口?
- sed的选项与命令简要
- Dubbo 的设计思想,真优秀!
- C++ memset()函数和bzero()函数
- python 趋势线表达式_python添加趋势线
- 电脑桌面天气计算机备忘录,有什么桌面软件可以显示:时间,天气,还有备忘录的?...
- CSAPP Lab5--Writing a Dynamic Storage Allocator
- 学习pyton的第三天
- CAD软件中如何统一文字字高?
- 团队管理那点事,OKR绩效、核心人才、面试、技术分享、研发流程
- c# char unsigned_关于C ++:将unsigned char *复制到unsigned char *
- Web设计中的中国传统色彩速查表
- ELK搭建毫秒级响应社工裤
- html5外链式引入不了字体,css中导入外部字体不生效的原因是什么?
- 聚划算的下沉市场生意
- 二元一次方程组、三元一次方程组、四元一次方程组解析解(代码)
- 兄弟Brother MFC-8520DN 驱动
- Bugzilla 中文镜像网站