使用C#编写扩展存储过程
2010-08-05 18:26
465 查看
什么是扩展?
扩展存储过程使您得以使用象C这样的创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展Microsoft SQL Server™2000的功能。
扩展存储过程是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
扩展存储过程使您得以使用象C这样的创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展Microsoft SQL Server™2000的功能。
扩展存储过程是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
相关文章推荐
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- 使用C#编写扩展存储过程
- 技巧:使用 C# 编写扩展存储过程
- 编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法
- 使用C#编写SQL Server的扩展存储过程
- 技巧:使用 C# 编写扩展存储过程
- 编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- c#扩展方法的使用
- 编写高质量代码改善C#程序的157个建议——建议37:使用Lambda表达式代替方法和匿名方法
- C# 扩展方法使用
- 在C#中使用装饰器模式和扩展方法实现Fluent Interface
- C#.NET中使用存储过程的方法及其优点
- C#二十六 使用Ado.Net调用存储过程
- Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序
- c#使用类库编写word插件注意事项
- 使用CLRMD编写一个自己的C#调试器
- 如何在IronPython中使用C#扩展方法
- 使用织梦开源的分词算法库编写的YII获取分词扩展
- 使用C语言编写Python扩展——创建自定义类型(1)