明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用C#編寫擴(kuò)展存儲(chǔ)過程

[摘要]什么是擴(kuò)展存儲(chǔ)過程?擴(kuò)展存儲(chǔ)過程使您得以使用象 C 這樣的編程語言創(chuàng)建自己的外部例程。對用戶來說,擴(kuò)展存儲(chǔ)過程與普通存儲(chǔ)過程一樣,執(zhí)行方法也相同?蓪(shù)傳遞給擴(kuò)展存儲(chǔ)過程,擴(kuò)展存儲(chǔ)過程可返回結(jié)果,...
什么是擴(kuò)展存儲(chǔ)過程?


擴(kuò)展存儲(chǔ)過程使您得以使用象 C 這樣的編程語言創(chuàng)建自己的外部例程。對用戶來說,擴(kuò)展存儲(chǔ)過程與普通存儲(chǔ)過程一樣,執(zhí)行方法也相同?蓪(shù)傳遞給擴(kuò)展存儲(chǔ)過程,擴(kuò)展存儲(chǔ)過程可返回結(jié)果,也可返回狀態(tài)。擴(kuò)展存儲(chǔ)過程可用于擴(kuò)展 Microsoft® SQL Server™ 2000 的功能。

擴(kuò)展存儲(chǔ)過程是 SQL Server 可以動(dòng)態(tài)裝載并執(zhí)行的動(dòng)態(tài)鏈接庫 (DLL)。擴(kuò)展存儲(chǔ)過程直接在 SQL Server 的地址空間運(yùn)行,并使用 SQL Server 開放式數(shù)據(jù)服務(wù) (ODS) API 編程。

編寫好擴(kuò)展存儲(chǔ)過程后,固定服務(wù)器角色 sysadmin 的成員即可在 SQL Server 中注冊該擴(kuò)展存儲(chǔ)過程,然后授予其他用戶執(zhí)行該過程的權(quán)限。擴(kuò)展存儲(chǔ)過程只能添加到 master 數(shù)據(jù)庫中。

使用 C# 編寫擴(kuò)展存儲(chǔ)過程

下面就以一個(gè)簡單的例子來演示如何用 C#  編寫擴(kuò)展存儲(chǔ)過程。
首先,我們創(chuàng)建一個(gè)簡單的C#類庫文件:

//C# file: Csserver.cs

using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.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";
}
}
}


然后創(chuàng)建用 sn -k 為該類庫創(chuàng)建一個(gè)強(qiáng)名密鑰文件,并編譯之。
sn -k MyKey.snk
csc /t:library Csserver.cs

注冊該類庫:
regasm /tlb:Csserver.tlb csserver.dll /codebase


這樣一個(gè)擴(kuò)展存儲(chǔ)過程就編寫注冊完了,下面我們在sql  server中測試一下效果。

T-SQL stored proc.

DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255), @desc varchar(255)

-- 創(chuàng)建對象實(shí)例。
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

-- 調(diào)用對象方法。
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

-- 銷毀對象實(shí)例。
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