mssql 存储过程调用C#编写的DLL文件_实用技巧

网上很有多类似的文章,但描述不完整,在某些关键的地方,少了相应的补充,以至于那些例子都无法测试通过。
我把其中的一种思路整理出来:

1. 准备DLL文件
首先,你需要新建一个类库工程,工程名没有要求,随意取为Test。新建一个类文件,例如:

复制代码 代码如下:

using System;

namespace Test
{
public class SayHello
{
public SayHello()
{
}

public string Hi()
{
return "Hello!";
}

public string Hey(string name)
{
return "Hey!" + name;
}
}
}

编译类库工程得到DLL文件。

2. 注册DLL
将DLL文件拷贝到数据库服务器,例如:将Test.dll拷贝到D盘,命令提示窗口中,进入到.net framework 1.1的目录下,c:\windows\Microsoft.NET\Framework\v1.1.4322>,使用命令:
regasm d:\Test.dll /codebase
窗口提示: 成功注册了类型(或Types registered successfully)
则说明注册成功。
3. 测试脚本

复制代码 代码如下:

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

-- 创建对象实例, sp_OACreate 后引号内为'命名空间.类名'
EXEC @hr = sp_OACreate 'Test.SayHello', @object OUT
IF @hr <> 0
BEGIN
goto info
END

-- 调用对象方法, sp_OAMetohd 参数为方法名,要求该方法属于公共类型(public),且不能是静态方法(即被static修饰)
EXEC @hr = sp_OAMethod @object, 'Hi', @return OUT

-- EXEC @hr = sp_OAMethod @object, 'Hey', @return OUT, 'Baby' -- 带参数的方法的调用,多个参数,依次累加在后

IF @hr <> 0
BEGIN
goto info
END

-- 查看结果
print @return

EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
goto info
END

--info:
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc

4. 补充说明
以上步骤,在sql server 2000下测试通过,不支持其他关系数据库。

sql server 2005中可以使用“CLR函数”来达到上述效果,图形化操作,非常简便,不得不说微软的产品容易让人产生依赖感。

时间: 2024-10-21 13:18:33

mssql 存储过程调用C#编写的DLL文件_实用技巧的相关文章

oracle 存储过程 调用 自己编写的DLL文件

问题描述 我现在有个需求,需要用oracle的存储过程调用 自己编写好的DLL文件,请问各位大神有什么好的方法吗?DLL文件编写语言有要求吗(本人目前想用C#)?ORACLE方面要如何定义和执行编译好的DLL文件中的方法呢?请帮忙详细述说下! 解决方案 建议你不要这么去调用,方在存储过程可扩展性,可移植性都较差,你可以将你存储过程封装成服务再去做逻辑编排

让你的.NET程序兼容不同版本的Dll文件_实用技巧

前段时间写的一个WinForm的.NET程序.因为引用了不少的库文件,但是最近这些库文件因为修正了一些Bug和算法.但是主的程序文件没有怎么改动.所以就不像把这个主程序重新编译了.于是就把所有的新版DLL文件拷贝到运行目录下,希望主程序能够直接调用新版的库文件.结果发现原来这些库文件都用Strong Name签了名的.主程序一调用就出错,说找不到该版本的文件. 后来查了一下MSDN,发现只要在config里面加入runtime节点就可以了.  <runtime>      <assemb

c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存

问题描述 c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存 delphi函数原型 Procedure invoke(params :PChar; result : PChar) ; 解决方案 把这个delphi的原型改一下,改为 Function Pchar invoke(params :PChar) ; 再试试 解决方案二: Function invoke(params: PAnsiChar): PAnsiChar ;

使用VB将ASP代码封装到DLL文件_应用技巧

很久以前的文档,整理出来,回味一下 使用VB封装ASP,建立SayHello测试程序 1.打开VB6,新建ActiveX DLL 2.在工程引用中加入Microsoft Active Server Pages Object Library选择 3.填加代码如下: 'Code Start '声明部分 Private MyScriptingContext As ScriptingContext Private MyApplication As Application Private MyReques

asp.net网页里面为什么找不到CS文件_实用技巧

复制代码 代码如下: <%@ Page language="c#" Codebehind="Main.aspx.cs" AutoEventWireup="false" Inherits="Hr.WebForm1" %> 上边的这行不要用CodeBehind,这是生成CS文件生成DLL文件后,把Dll放到Bin目录中使用的. 如果没有编译cs文件,则改为 复制代码 代码如下: <%@ Page language

C# 调用matlab编写的.dll文件 换了一台电脑还能用么

问题描述 请教各位大神,最近在做C#的东西,由于matlab进行图像运算十分方便,图像处理的算法就用matlab写的,C#调用matlab编译生成的动态链接库成功,换台电脑(没有matlab环境),程序还能正常运行么? 解决方案 解决方案二:那要看你自己的DLL用到了哪些Matlab的DLL.一般将用到的dll拷贝到目标电脑相应位置,就能用了.或者将你的程序打包部署,就不用操心这事了.

.Net 调用存储过程取到return的返回值_实用技巧

1. 存储过程 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ======================================

VB.NET调用MySQL存储过程并获得返回值的方法_实用技巧

本文实例讲述了VB.NET调用MySQL存储过程并获得返回值的方法.分享给大家供大家参考.具体实现方法如下: Dim myConnectionString As String = "Database=" & myDatabase & _ " ;Data Source=" & myHost & _ ";User Id=" & myUserId & ";Password=" &

asp.net实现调用存储过程并带返回值的方法_实用技巧

本文实例讲述了asp.net实现调用存储过程并带返回值的方法.分享给大家供大家参考,具体如下: /// <summary> /// DataBase 的摘要说明 /// </summary> public class DataBase { /// <summary> ///DataBase 的摘要说明 /// </summary> protected static SqlConnection BaseSqlConnection = new SqlConnec