什麼是擴充?
擴充預存程序使您得以使用象C這樣的建立自己的外部常式。對使用者來說,擴充預存程序與普通預存程序一樣,執行方法也相同。可將參數傳遞給擴充預存程序,擴充預存程序可返回結果,也可返回狀態。擴充預存程序可用於擴充Microsoft SQL Server2000的功能。
擴充預存程序是SQL Server可以動態裝載並執行的動態連結程式庫(DLL)。擴充預存程序直接在SQL Server的地址空間運行,並使用SQL Server開放式資料服務(ODS)API編程。
編寫好擴充預存程序後,固定伺服器角色sysadmin的成員即可在SQL Server中註冊該擴充預存程序,然後授予其他使用者執行該過程的許可權。擴充預存程序只能添加到master資料庫中。
使用C#編寫擴充預存程序
下面就以一個簡單的例子來示範如何用C#編寫擴充預存程序。
首先,我們建立一個簡單的C#類庫檔案:
//C# file: Csserver.cs
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;
[assembly:AssemblyTitle("CSServer")]
[assembly:AssemblyDescription("Test SQL .NET interop")]
[assembly:AssemblyVersion("1.0.0.1")]
[assembly:AssemblyDelaySign(false)]
[assembly:AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop { public interface ITest { string SayHello(); }
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CsharpHelper : ITest { public string SayHello() { return "Hello from CSharp"; }
}
}
然後建立用 sn-k 為該類庫建立一個強名密鑰檔案,並編譯之。
sn-k MyKey.snk
csc /t:library Csserver.cs
註冊該類庫:
regasm /tlb:Csserver.tlb csserver.dll /codebase
這樣一個擴充預存程序就編寫註冊完了,下面我們在sqlserver中測試一下效果。
T-SQLstoredproc.
DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255),@desc varchar(255)
--建立對象執行個體。
EXEC @hr = sp_OACreate‘SQLInterop.CsharpHelper‘,@object OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
--調用對象方法。
EXEC@hr=sp_OAMethod @object,‘SayHello‘,@return OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
PRINT@return
--銷毀對象執行個體。
EXEC @hr=sp_OADestroy @object
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END