日期:2014-05-18  浏览次数:20519 次

*高手请进*如何用sqlserver存储过程调用Dll动态链接库文件
1、用于sqlserver存储过程调用的dll在编写时要尊守那些标准吗?
2、在SQL   server里用   sp_addextendproc   和用   sp_OAcreate   调用DLL有那些区别,分别在什么时候用到
3、能否用个VC代码的小例子写个DLL,代码请贴出来,还有sqlserver调用的例子

不胜感激!


------解决方案--------------------
--參考:

SQL Server对于调用dll要求比较严格,基本的思路是编写dll,创建调用该dll的扩展存储过程,调用扩展存储过程。以下是转贴大斑竹zjcxc的一个帖子,希望能对你有所帮助:

**********************************************************************************************************************

扩展DLL好像是要用VC编写,而且有一定要求,具体地参考SQL联机帮助

另一种是编写ole,参考下面的VB代码及调用示例

--SQL Server的存储过程调用Com组件


/*--下面的部分在VB中完成

首先我们先用VB 作一个最简单的组件

工程名称: testSQLCOM
类名: TestMath

'函数,计算两个整数相加的结果
Public Function AddMe(a As Long, b As Long) As Long
AddMe = a + b
End Function

编译生成后,我们就可以在 Sql Server 中对这个 Com 组件进行调用了
--*/

/*--下面是SQL中对上面DLL的调用--*/

--定义用到的变量
declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int,@re int

--创建调用实例
exec @err=sp_OACreate 'testSQLCOM.TestMath ', @obj out
if @err <> 0 goto lberr --如果创建失败,则进行错误处理

--调用DLL中的函数
exec @err=sp_OAMethod @obj, 'AddMe ',@re out,100,200
if @err <> 0 goto lberr --如果调用错误,则进行错误处理

print '返回的结果是: ' + str(@re)

--完成后释放
exec sp_OADestroy @obj

return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述

------解决方案--------------------
--例子:
******************************************************
作者: suntt(两条腿的狗)
******************************************************

用vc写dll,然后使用sp_addextendedproc 添加扩展的存储。
给一个过去曾经写的一个扩展存储:

/*根据指定的IP地址返回网卡的Mac地址*/

#include <stdafx.h>
#include "stdio.h "
#include "stdlib.h "
#include "Winsock2.h "
#include "iphlpapi.h "

#pragma comment ( lib, "ws2_32.lib " )
#pragma comment ( lib, "Iphlpapi.lib " )

#define XP_NOERROR 0
#define XP_ERROR 1
#define MAXCOLNAME 25
#define MAXNAME 255
#define MAXTEXT 255

#ifdef __cplusplus
extern "C " {
#endif

RETCODE __declspec(dllexport) xp_proc5(SRV_PROC *srvproc);

#ifdef __cplusplus
}
#endif

RETCODE __declspec(dllexport) xp_proc5(SRV_PROC *srvproc)
{

DBSMALLINT i = 0;
DBCHAR colname[MAXCOLNAME];
DBCHAR spText[MAXTEXT];
DBCHAR spIP[MAXTEXT];
DBCHAR spHostName[MAXTEXT];
DBCHAR spMac[18];
DBCHAR szFileName[MAX_PATH+1];

struct hostent *remoteHostent;
int numberOfHost = 1;
int nArgs =