(噴血分享)利用.NET生成數據庫表的建立腳本,相似SqlServer編寫表的CREATE語句sql
在咱們RDIFramework.NET代碼生成器中,有這樣一個應用,就是經過數據庫表自動生成表的CREATE語句,以下圖所示:數據庫
在實現此功能前摸索了不少方法,最後藉助MSSQLSERVER自帶的dll文件來完成。先截圖展現下此功能生成後的效果,而後再分享代碼與方法,歡迎你們討論其餘可行方式,謝謝。 ui
經過上圖能夠看到,生成的表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文件的引用,分別爲:this
Microsoft.SqlServer.ConnectionInfo.dll spa
Microsoft.SqlServer.Management.Sdk.Sfc.dll3d
以下圖所示:blog
引用了上面兩個dll文件後,在咱們的項目中添加命名空間: ip
using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo;
如今,咱們就可使用MSSQLSERVER提供的類庫來生成表的CREATE語句了。ci
下面給出建立的所有代碼: 資源
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語句後的控件。
歡迎討論其餘方法,謝謝!
若是以爲對你有引導與幫助,能夠點下推薦,謝謝!