使用T4範本產生器讀取資料庫時指定所要使用的SMO版本

在使用T4範本產生器讀取資料庫的資訊時,一般可能都會用如下的引用方式:


<#@ template language="C#" debug="True" hostspecific="True" encoding="0"#>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Common" #>

其中在引用有關Microsoft® SQL Server® 2008 R2 共用管理物件時,大部份都直接寫Assembly的名稱。但是如果您的開發環境中安裝了兩種以上的SQL Server版本時,這時會取用註冊在GAC中的哪一種版本,可能就會取決於您目前所使用的Visual Studio版本了。目前我測試的結果是:

VS2005使用SQL 2005
VS2010使用SQL 2010

大致上取用哪種版本的SQL管理工具(SMO)是沒有太大的差別。但是如果您有使用到一些新的SQL Server中才支援的資料型別(如Date、DateTime2)時,使用不同的版本就會有差囉。

如果在VS2005中寫的T4範本檔中使用到了新的SQL Server資料型別的話,可能會出現如下的錯誤訊息:


這時如果用GACUtil去看一下在GAC中有註冊的項目的話,會看到有兩個同樣名稱的SMO組件。


所以如果要在VS2005中能使用新的SQL Server資料型別的話,應該就要能自行指定所要引用的組件了

作法就是在<#@ assembly #>中直接指定絕對路徑來引用您想要使用的SMO組件。


<#@ assembly name="C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll" #>
<#@ assembly name="C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll" #>
<#@ assembly name="C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll" #>

一般SQL Server安裝後,在<版本號>\SDK\Assemblies\下會有所有的組件。可以將路徑指到這裏來直接引用。

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)