社区
新技术前沿
帖子详情
*高手请进*如何用sqlserver存储过程调用Dll动态链接库文件
gongj
2007-05-09 09:42:03
1、用于sqlserver存储过程调用的dll在编写时要尊守那些标准吗?
2、在SQL server里用 sp_addextendproc 和用 sp_OAcreate 调用DLL有那些区别,分别在什么时候用到
3、能否用个VC代码的小例子写个DLL,代码请贴出来,还有sqlserver调用的例子
不胜感激!
...全文
1502
9
打赏
收藏
*高手请进*如何用sqlserver存储过程调用Dll动态链接库文件
1、用于sqlserver存储过程调用的dll在编写时要尊守那些标准吗? 2、在SQL server里用 sp_addextendproc 和用 sp_OAcreate 调用DLL有那些区别,分别在什么时候用到 3、能否用个VC代码的小例子写个DLL,代码请贴出来,还有sqlserver调用的例子 不胜感激!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
杨根祥
2010-08-24
打赏
举报
回复
namespace HelloDLL
{
public class Hello
{
public string SayHello()
{
return "Hello";
}
}
}
SQL脚本:
Declare @hr Int,@Object Int
EXEC @hr = sp_OACreate HelloDLL.Hello,@object OUT
if @hr = 0
BEGIN
Print('调用成功。')
exec sp_OADestroy @object
END
Else
Begin
Print ('调用失败,请查明原因')
DECLARE @src varchar(255), @desc varchar(255)
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
End
为什么返回0x80131700 ODSOLE Extended Procedure NULL
gongj
2007-06-25
打赏
举报
回复
呵呵,感谢
purplesunshine
2007-06-08
打赏
举报
回复
C#写的动态链接库应该也可以调用吧??
guojh021
2007-05-18
打赏
举报
回复
学习
playwarcraft
2007-05-16
打赏
举报
回复
--例子:
******************************************************
作者: 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 = srv_rpcparams(srvproc);
if (nArgs>0)
{
//初始化SOCKET
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2,1), &wsaData);
if ( iRet != 0 )
exit( 0 );
int paramCount=srv_rpcparams(srvproc);//检测参数个数
if(paramCount!=1)
{
return XP_ERROR;
}
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
int ret=srv_paraminfo(srvproc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (cbActualLen){
ZeroMemory(szFileName, MAX_PATH+1);
memcpy(szFileName, srv_paramdata(srvproc, 1), cbActualLen);
}
else{
return XP_ERROR;
}
int nRemoteAddr=inet_addr((const char*)szFileName);
_snprintf(spText, MAXTEXT, "%s 示例扩展存储过程", szFileName);
srv_sendmsg(
srvproc,
SRV_MSG_INFO,
0,
(DBTINYINT)0,
(DBTINYINT)0,
NULL,
0,
0,
spText,
SRV_NULLTERM);
remoteHostent= (struct hostent*)malloc( sizeof(struct hostent ));
struct in_addr sa;
for ( int i = 0; i < numberOfHost; i ++ )
{
//获取远程机器名
sa.s_addr = nRemoteAddr;
_snprintf( spIP,MAXTEXT,"%s\0",inet_ntoa( sa ) );//输出IP地址
remoteHostent = gethostbyaddr( (char*)&nRemoteAddr,4, AF_INET );
if ( remoteHostent )
_snprintf(spHostName,MAXTEXT,"%s\0",remoteHostent->h_name);
else
_snprintf(spHostName,5,"null");
//发送ARP查询包获得远程MAC地址
unsigned char macAddress[6];
ULONG macAddLen = 6;
iRet=SendARP(nRemoteAddr, (unsigned long)NULL,(PULONG)&macAddress, &macAddLen);
if ( iRet == NO_ERROR )
{
sprintf(spMac,"%02X-%02X-%02X-%02X-%02X-%02X",macAddress[0],macAddress[1],macAddress[2],macAddress[3],macAddress[4],macAddress[5]);
}
else
sprintf(spMac,"null");
nRemoteAddr = htonl( ntohl( nRemoteAddr ) + 1 );
}
}
//设置列名称
_snprintf(colname, MAXCOLNAME, "IP");
srv_describe(srvproc, 1, colname, SRV_NULLTERM, SRVCHAR, MAXTEXT, SRVCHAR, 0, NULL);
_snprintf(colname, MAXCOLNAME, "HOSTNAME");
srv_describe(srvproc, 2, colname, SRV_NULLTERM, SRVCHAR, MAXNAME, SRVCHAR, 0, NULL);
_snprintf(colname, MAXTEXT, "MAC");
srv_describe(srvproc, 3, colname, SRV_NULLTERM, SRVCHAR, MAXTEXT, SRVCHAR, 0, NULL);
//读进数据
srv_setcoldata(srvproc, 1, spIP);
srv_setcollen(srvproc, 1, static_cast<int>(strlen(spIP)));
srv_setcoldata(srvproc, 2, spHostName);
srv_setcollen(srvproc, 2, static_cast<int>(strlen(spHostName)));
srv_setcoldata(srvproc, 3, spMac);
srv_setcollen(srvproc, 3, static_cast<int>(strlen(spMac)));
// 发送整行
srv_sendrow(srvproc);
// 现在返回已处理的行数
srv_senddone(srvproc, SRV_DONE_MORE | SRV_DONE_COUNT, (DBUSMALLINT)0, (DBINT)i);
return XP_NOERROR ;
}
******************************************
编译好后,添加到mssql中
sp_addextendedproc 'xp_proc5','dllpath'
调用方法:
xp_proc5 '10.50.0.1' --指定IP地址即可
返回效果:
IP HOSTNAME MAC
--------------------------------------------------------
10.50.80.22 sunshine 00-80-C8-EE-11-03
卸载的方法:
sp_dropextendedproc 'xp_proc5'
playwarcraft
2007-05-16
打赏
举报
回复
--參考:
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 错误描述
gongj
2007-05-15
打赏
举报
回复
高手请帮忙
lwl0606
2007-05-09
打赏
举报
回复
up , 学习
gongj
2007-05-09
打赏
举报
回复
我想是不是大家都不会用到这种方法啊
SQL Server性能优化利器:SQL优化器for SQL Server 1001实战指南
SQL优化器 for SQL Server 1001 是面向企业级数据库环境的专业性能调优工具,致力于解决复杂查询响应慢、资源消耗高、索引设计不合理等典型问题。其核心集成了智能解析引擎、统计信息分析模块与机器学习驱动的建议模型,能够自动识别低效SQL语句并生成可落地的优化方案。企业往往有特定的编码规范(如禁止SELECT *、必须使用NOLOCK hint等)。用户手册详细介绍了如何通过编辑Rules.xml
文件
来自定义规则集。
SQL Server 2005安装全流程图解指南
SQL Server 2005安装过程生成的日志
文件
是诊断安装成败的核心依据。所有日志默认存储在路径下,其中最重要的两个
文件
为和Detail.log。提供高层次的安装概览,适合快速判断整体状态:而Detail.log则记录了每一步操作的详细执行流程,包含时间戳、组件
调用
、注册表修改及错误堆栈。以下是一个典型的服务注册失败片段示例:通过正则表达式可批量提取关键事件:常用日志关键字及其含义如下表所示:关键词含义常见原因安装失败通用码权限不足或依赖缺失。
PHP连接SQL Server数据库完整配置指南
在现代Web开发中,PHP作为广泛应用的服务器端脚本语言,常需与各类数据库系统进行交互。而在企业级应用中,Microsoft SQL Server因其稳定性、安全性及与Windows生态的高度集成,成为许多项目的首选数据库平台。实现PHP对SQL Server的高效连接,核心依赖于SQLSRV扩展与PDO_SQLSRV驱动两大技术方案。前者由微软官方维护,专为SQL Server优化,支持丰富的连接选项和查询特性;后者则基于PDO抽象层,提供统一的数据库访问接口,便于项目迁移与扩展。
SQL Server 数据库高级编程(T-SQL)笔记
SQL Server 数据库高级编程笔记 SQL基础知识总结 代表本机:( . , 计算机名 , Localhost , (Local) , 127.0.0.1) SQL Server
运用SQL SERVER 2005 CLR解决XML Showplan实例教程
大家都知道SQL SERVER 2005 CLR(公共语言运行库),而在编程中SQL Server 开发人员和数据库管理员 (DBA) 有时会遇到这种情况,即用户在工作高峰期向服务器提交长时间运行的查询,因而降低了服务器的响应速度。在这里给大家将介绍两种方法可以防止这一情况的发生:
1.DBA 可使用 sp_configure 将 query governor cost limit 选项设置为特定阈值。(这是一个高级选项。)该阈值在整个服务器内是有效的。
2.要影响连接的
新技术前沿
6,128
社区成员
4,451
社区内容
发帖
与我相关
我的任务
新技术前沿
MS-SQL Server 新技术前沿
复制链接
扫一扫
分享
社区描述
MS-SQL Server 新技术前沿
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章