SQL Server调用OLE对象
T-SQL 中是可以调用 OLE 的,将这一功能应用到触发器、存储过程等对象中,SQL Server 运用变得更贴近我们的功能,更加满足我们的需要。
T-SQL 中有七个存储过程是围绕本节内容进行的,我们只介绍其中最常用的四个存储过程,其余内容您可以参见 SQL Server 联机丛书。
sp_OACreate创建 OLE 对象实例。sp_OAMethod调用 OLE 对象的方法。sp_OAGetErrorInfo获取 OLE 自动化错误信息。sp_OADestroy释放已创建的 OLE 对象。
1、示例
我们以ASP中常见的Scripting.FileSystemObject介绍如何利用T-SQL调用DLL。
首先看一个示例,为了便于您在SQL查询分析器中测试,本示例中添加了两句输出代码(已经在示例中注明),您在应用到触发器或存储过程时,应该去掉这两句,另外在关键语句的后面添加了等效的ASP语句,便于您理解。
DECLARE @errCode int
DECLARE @fso int
EXEC @errCode = sp_OACreate 'Scripting.FileSystemObject', @fso OUT /*等效于:set fso = Server.CreateObject("Scripting.FileSystemObject")*/
if @errCode <> 0
BEGIN
DECLARE @description varchar(256)
EXEC sp_OAGetErrorInfo @fso, NULL, @description OUT
PRINT @description /*SQL 查询分析器中有效*/
END
DECLARE @exists bit
EXEC sp_OAMethod @fso, 'FileExists', @exists OUT, 'C:\foo.txt' /*等效于:exists = fso.FileExists("C:\foo.txt")*/
PRINT @exists /*SQL 查询分析器中有效*/
DECLARE @f int
EXEC sp_OAMethod @fso, 'CreateTextFile', @f OUT, 'C:\foo.txt', 1 /*等效于:set f = fso.CreateTextFile("C:\foo.txt", true)*/
EXEC sp_OAMethod @f, 'Write', NULL, '写一行内容' /*等效于:f.Write("写入内容")*/
EXEC sp_OAMethod @f, 'Close' /*等效于:f.Close*/
EXEC sp_OADestroy @f /*等效于:set f = nothing*/
EXEC sp_OADestroy @fso /*等效于:set fso = nothing*/
上述中 bit 类型的值 1 表示 true,bit 类型的值 0 表示 false。
示例将判断 C 盘下是否存在 foo.txt,并且创建一个 foo.txt,并向其中写入一行文字。
代码似乎有些多,不过您有兴趣一定要仔细看完,因为并不复杂,而且它涵盖了最常用的代码。
2、讲解
sp_OACreate创建 OLE 对象实例。- 第一个参数为 OLE 对象的程序标识符(ProgID)或类标识符(CLSID)。
- 第二个参数为返回的对象令牌,必须是数据类型为 int 的局部变量,在后面的方法中都要用到对象令牌。输出参数,必须加 OUT 或 OUTPUT。
sp_OAMethod调用 OLE 对象的方法。- 第一个参数为对象令牌。
- 第二个参数为方法名称。
- 第三个参数为方法的返回值,如果方法返回的是对象,则该参数类型为 int。输出参数,必须加 OUT 或 OUTPUT。
- 第四个及以后的参数为方法的参数值,如果方法的参数是输出参数,则要加上 OUT 或 OUTPUT。
- sp_OAMethod也可用来获取属性值。
sp_OAGetErrorInfo获取 OLE 自动化错误信息。- 第一个参数为对象令牌。
- 第二个参数为错误信息的来源。输出参数,必须加 OUT 或 OUTPUT。
- 第三个参数为错误的描述。输出参数,必须加 OUT 或 OUTPUT。
sp_OADestroy释放已创建的 OLE 对象。- 第一个参数为对象令牌。
sp_OAGetProperty获取 OLE 对象的属性值sp_OASetProperty将 OLE 对象的属性设置为新值sp_OAStop停止服务器范围内的 OLE 自动化存储过程执行环境。
这七个存储过程都有返回值,如果返回值是 0 表示成功,其它值表示失败,示例中只对 sp_OACreate 的返回值作了判断。
3、扩展
T-SQL 中还可以利用 sp_addextendedproc 向 SQL Server 注册新扩展存储过程的名称,但是 SQL Server 2005 联机丛书中已经说明将在后续版本中删除该功能,不建议我们继续使用该存储过程,所以这里不介绍 sp_addextendedproc。
SQL Server调用OLE对象的更多相关文章
- ADO.NET访问SQL Server调用存储过程带回参
1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...
- SQL Server 调用 C# 方法实现正则表达式验证
Ø 前言 1. 在 SQL Server 中默认是不支持正则表达式验证的,如果需要某个字符串匹配一个正则表达式的验证规则,就需要额外的编写 C# 方法,并发布到 SQL Server 数据库中. ...
- 在SQL Server中查看对象依赖关系
原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server Deleting or changing objects may ...
- sql server 调用webservice
sql server版本2008以上,应该都可以 更改服务器配置 sp_configure ; GO RECONFIGURE; GO sp_configure ; GO RECONFIGURE; GO ...
- SQL Server修改数据库对象所有者(Owner)浅析
在SQL Server数据库中如何修改数据库对象(表.视图.存储过程..)的所有者(Owner)呢?一般我们可以使用系统提供的系统存储过程sp_changeobjectowner来修改. 我们先看看s ...
- Sql Server 调用DLL
背景 在处理数据或者分析数据时,我们常常需要加入一定的逻辑,该些处理逻辑有些sql是可以支持,有些逻辑SQL则无能为力,在这种情况下,大多数人都会编写相关的程序来处理成自己想要的数据,但每次处理相同逻 ...
- SQL Server 判断各种对象是否存在和sysobjects的关系
一.判断表是否存在 object_id():获取表的ID,其中N表示Unicode类型.可以支持不同语种的对象名 ) drop table [dbo].[表名] 二.判断要创建的存储过程名是否存在 ) ...
- SQL SERVER 2012 第五章 创建和修改数据表 の SQL SERVER中的对象名
[ServerName.[DataBaseName.[SchemeName.]]]ObjectName 服务器名,数据库名,模式名,对象名 其中模式是一个新出的坑爹的东西.
- SQL SERVER调用textcopy写文件
SET @PATH = 'textcopy /S ' + @LServer + ' /U '+ @LUser + ' /P '+ @LPass + ' /D '+ @LDB + ' /T '+@tab ...
- PowerDesigner16建表在SQL SERVER 2008报 对象名 'sysproperties' 无效。
http://blog.itpub.net/30150152/viewspace-1454979/
随机推荐
- 开源项目分享:ChatGPT 控制台聊天应用
开源项目分享:ChatGPT 控制台聊天应用 分享一个我最近完成的一个小应用,一个ChatGPT 的控制台聊天应用,大家都在搞AI,我也来玩一玩,顺便分享到社区,有兴趣的小伙伴可以去我的github主 ...
- diffusion model(一):DDPM技术小结 (denoising diffusion probabilistic)
发布日期:2023/05/18 主页地址:http://myhz0606.com/article/ddpm 1 从直觉上理解DDPM 在详细推到公式之前,我们先从直觉上理解一下什么是扩散 对于常规的生 ...
- Python RabbitMQ Demo
fanout消息订阅模式 生产者 # 生产者代码 import pika credentials = pika.PlainCredentials('guest', 'guest') # mq用户名和密 ...
- FFmpeg中的常见结构体
代码基于FFmpeg5.0.1 目录 FFFormatContext AVFormatContext AVIOContext FFIOContext URLContext URLProtocol AV ...
- ReplayKit2 有线投屏项目-反向Socket实现
一.需求 我们在使用RTMP协议进行推流的时候,底层仍然采用的是TCP协议或者QUICK协议,有客户端主动发起请求.但是在有线投屏中,需要PC端向手机发起请求建立连接 二.实现 在客户端主动发起请求之 ...
- uniapp 富文本图片100%显示
下面的这个方法是在百度上找的,但是老是报错,一直没找到原因,索性自己就挨个检查了下,发现在过滤之前需要对传过来的值进行检测,是字符串才能让这个方法执行 filters: { formatRichTex ...
- git创建分支 解决git网速太慢
所谓的分支,就是每个人负责的不同的模块 整个项目有一个主干 master 所有的分支都是 从主干 maser 上 分支而来的 ...
- 2024-06-08:用go语言,给定三个正整数 n、x和y, 表示城市中的房屋数量以及编号为x和y的两个特殊房屋。 在这座城市中,房屋通过街道相连。对于每个编号i(1 <= i < n), 存在一条
2024-06-08:用go语言,给定三个正整数 n.x和y, 表示城市中的房屋数量以及编号为x和y的两个特殊房屋. 在这座城市中,房屋通过街道相连.对于每个编号i(1 <= i < n) ...
- GlaDS应用
题目:Antarctic basal environment shaped by high-pressure flow through a subglacial river system 文章使用数值 ...
- netcore 打包dll发布到nuget服务器
可参考微软官网:NuGet.org 概述 | Microsoft Docs 一.创建类库 首先创建一个类库,就是你想要发布到nuget的类库,生成项目 二.下载并注册nuget nuget地址:htt ...