Delphi写Sql2000扩展存储过程的例子

library project1;

uses
 Windows,
 SysUtils,
 MSODSApi;
  
...{$R *.res}
Function GetParamStr(pSrvProc: SRV_PROC; Index : integer; Var Param : String ) : integer;
var
 PType : Byte;
 cbMaxLen , ParaLen : DWORD;
 IsNULL : BOOL;
begin
 Result := NO_ERROR;
 srv_paraminfo(pSrvProc, index, @PType, @cbMaxLen, @ParaLen, NIL, @IsNULL);
  
 if PType in [SRVTEXT,SRVVARCHAR,SRVCHAR,SRVNTEXT,
        SRVBIGVARCHAR,SRVBIGCHAR,SRVNVARCHAR,SRVNCHAR] then
  begin
   Param := '';
   if ParaLen>0 then begin
    SetLength(Param , ParaLen);
    srv_paraminfo(pSrvProc, index, @PType, @cbMaxLen, @ParaLen, @Param[1], @IsNULL);
   end;
  end
 else begin
  Result := -1;
 end;
end;
  
Function EpPackFile(pSrvProc: SRV_PROC) : integer;cdecl;
var
 ls1,ls2,ls3 : String;
 n   : integer;
begin
  
 Result := 1;
 n := srv_rpcparams(pSrvProc);
 if n <> 3 then begin
  //   不是3个参数
 end;
 if  (GetParamStr(pSrvProc,1,ls1)<>NO_ERROR) then begin
  //  不是字符串
 end;
 if  (GetParamStr(pSrvProc,2,ls2)<>NO_ERROR) then begin
  //  不是字符串
 end;
 if  (GetParamStr(pSrvProc,3,ls3)<>NO_ERROR) then begin
  //  不是字符串
 end;
 n := Length(ls1);
 srv_describe(pSrvProc, 1 , '参数', SRV_NULLTERM, SRVBIGVARCHAR,
        n, SRVBIGVARCHAR, n, NIL);
  srv_setcoldata(pSrvProc, 1 , @ls1[1]);
  srv_sendrow(pSrvProc);
  srv_setcoldata(pSrvProc, 1 , @ls2[1]);
  srv_sendrow(pSrvProc);
  srv_setcoldata(pSrvProc, 1 , @ls3[1]);
  srv_sendrow(pSrvProc);
 srv_senddone(pSrvProc, (SRV_DONE_COUNT or SRV_DONE_MORE), 0, 1);
end;
  
exports
 EpPackFile Name 'xp_EpPackFile';
begin
end.

编译后放入binn目录,在sql中添加并测试,代码如下:

Use Master;
IF object_id('xp_EpPackFile') IS NOT NULL EXEC sp_dropextendedproc 'xp_EpPackFile';
EXEC sp_addextendedproc 'xp_EpPackFile', 'project1.dll';
EXEC master..xp_EpPackFile 'aa','bb','cc';
EXEC sp_dropextendedproc 'xp_EpPackFile';
DBCC SPEncrypt(FREE);

时间: 2024-08-06 20:09:55

Delphi写Sql2000扩展存储过程的例子的相关文章

编写安全的SQL Server扩展存储过程

server|安全|存储过程     SQL Server 的扩展存储过程,其实就是一个普通的 Windows DLL,只不过按照某种规则实现了某些函数而已. 近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方.之所以会特别注意,是因为DLL运行于SQL Server的地址空间,而SQL Server到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制. 我们写动态库一般是自己用,即便给别人用,也很少像SQL Server这样,一个动态库很有可能加载多次,

编写安全的扩展存储过程

    近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方.之所以会特别注意,是因为DLL运行于SQL Server的地址空间,而SQL Server到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制. 我们写动态库一般是自己用,即便给别人用,也很少像SQL Server这样,一个动态库很有可能加载多次,并且都是加载到一个进程的地址空间中.我们知道,当一个动态库加载到进程的地址空间时,DLL所有全局与局部变量初始化且仅初始化一次,以后再次调用 LoadL

使用SQLSERVER的扩展存储过程实现远程备份与恢复

server|sqlserver|备份|存储过程|恢复  最近我在为公司的框架程序(以数据应用为导向的应用体系)做数据管理模块,这个模块的需求比较简单:备份.恢复和清理日志.我公司的软件基本上以C/S为基本架构,所以数据管理模块中两个主要的功能'备份与恢复'都可能会在Client端操作,备份与恢复'的文件也都有可能存储在client端,因而这个数据管理模块就必须能够实现在远程备份与恢复数据库.  文章的前提阐述完了,就该说说如何具体实现吧.其实都很简单,我想写个远程备份的测试实例给大家看,就能够

sql server 常用的扩展存储过程详解

sql server 里面提供了丰富的系统存储过程来辅助我们管理数据库以及开发.今天分享介绍一些常用的数据库扩展存储过程  xp_cmdshell 这个大家都比较熟悉了,使用xp_cmdshell 可以在连接sql server 的时候可以执行doc 命令 最简单一个例子EXEC master.sys.xp_cmdshell 'dir D:\' 获取D 盘下面的目录.当然这个D:\ 是服务器上面的,不是本地电脑的. 所以有时候可以使用 xp_cmdshell 配合作业都角度使用执行bcp等命令来

Oralce 调用Delphi写DLL去访问C# WebService的问题

web|访问|问题 我想从Oracle的存储过程通过一个外部dll(Delphi编写)去访问C#写的WebService时,出现了"尚未调用 CoInitialize"不知道是怎么回事,望各位指点一二.1.我在Oracle里写了一个函数AddNumber如下:CREATE OR REPLACE FUNCTION "MY"."ADD" (a in BINARY_INTEGER,b in BINARY_INTEGER) RETURN BINARY_I

用Delphi写的一个完整OpenGL框架

用Delphi写的一个完整OpenGL框架 program OpenGLFramework; {     OpenGL DelphiXE     出处:根据NeHe代码翻译而来(http://nehe.gamedev.net/)     作者:帅宏军 shuaihj@163.com} uses   Windows,   Messages,   // 引用OpenGL单元   OpenGL; // 全局变量 var   h_Rc: HGLRC;                    // 窗口着色

几个扩展存储过程使用方法_MsSql

SQL Server中包含了几个可以访问系统注册表的扩展存储过程.但实际上这几个扩展存储过程是未公开的,从sql server 7.0就有了, 在SQL server 2000中仍然保留,他们以后可能会删除.但是这几个存储过程却提供了在当前的SQL Server版本中访问系统注册表的能力, 而且很多人利用SQL Server来进行攻击系统时,往往都会用到这几个扩展存储过程.所以最好在SQL Server中禁用他们. xp_regenumvalues 以多个记录集方式返回所有键值 使用方法: xp

CLR 扩展存储过程 如何返回值

问题描述 网上关于CLR扩展存储过程的源码都是C#的,C#可以用refstringxxxx来返回一个值,如果用VC++,不知道如何设置返回参数C#:......staticvoidstorepe(sqlstringa,sqlstingb,refsqlstringc)...sql新建查询...execsp'aaa','bbb',@outstringOUTPUTselectoutstringasOUTPUT_PARAM...这样可以再SQL中看到返回的C的值C++:但是如果用C++来写的话,这个返回

几个扩展存储过程使用方法

SQL Server中包含了几个可以访问系统注册表的扩展存储过程.但实际上这几个扩展存储过程是未公开的,从sql server 7.0就有了, 在SQL server 2000中仍然保留,他们以后可能会删除.但是这几个存储过程却提供了在当前的SQL Server版本中访问系统注册表的能力, 而且很多人利用SQL Server来进行攻击系统时,往往都会用到这几个扩展存储过程.所以最好在SQL Server中禁用他们. xp_regenumvalues 以多个记录集方式返回所有键值 使用方法: xp