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对象的更多相关文章

  1. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  2. SQL Server 调用 C# 方法实现正则表达式验证

    Ø  前言 1.   在 SQL Server 中默认是不支持正则表达式验证的,如果需要某个字符串匹配一个正则表达式的验证规则,就需要额外的编写 C# 方法,并发布到 SQL Server 数据库中. ...

  3. 在SQL Server中查看对象依赖关系

    原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server   Deleting or changing objects may ...

  4. sql server 调用webservice

    sql server版本2008以上,应该都可以 更改服务器配置 sp_configure ; GO RECONFIGURE; GO sp_configure ; GO RECONFIGURE; GO ...

  5. SQL Server修改数据库对象所有者(Owner)浅析

    在SQL Server数据库中如何修改数据库对象(表.视图.存储过程..)的所有者(Owner)呢?一般我们可以使用系统提供的系统存储过程sp_changeobjectowner来修改. 我们先看看s ...

  6. Sql Server 调用DLL

    背景 在处理数据或者分析数据时,我们常常需要加入一定的逻辑,该些处理逻辑有些sql是可以支持,有些逻辑SQL则无能为力,在这种情况下,大多数人都会编写相关的程序来处理成自己想要的数据,但每次处理相同逻 ...

  7. SQL Server 判断各种对象是否存在和sysobjects的关系

    一.判断表是否存在 object_id():获取表的ID,其中N表示Unicode类型.可以支持不同语种的对象名 ) drop table [dbo].[表名] 二.判断要创建的存储过程名是否存在 ) ...

  8. SQL SERVER 2012 第五章 创建和修改数据表 の SQL SERVER中的对象名

    [ServerName.[DataBaseName.[SchemeName.]]]ObjectName 服务器名,数据库名,模式名,对象名 其中模式是一个新出的坑爹的东西.

  9. SQL SERVER调用textcopy写文件

    SET @PATH = 'textcopy /S ' + @LServer + ' /U '+ @LUser + ' /P '+ @LPass + ' /D '+ @LDB + ' /T '+@tab ...

  10. PowerDesigner16建表在SQL SERVER 2008报 对象名 'sysproperties' 无效。

    http://blog.itpub.net/30150152/viewspace-1454979/

随机推荐

  1. HTML——结构和标签格式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Xcode Debugger Extremely Slow , Xcode Swift调试器调试时极其慢(😡)

    一.Xcode 调试器 我的项目是国内某办公软件的iOS客户端, 代码量极其庞大, 编译一次至少30min以上. 关键是,如果你遇到问题的时候,调试下断点,需要至少5min才能断下来,走下一步,又重复 ...

  3. Java中对的创建与引用

    对象与引用 Java语言中除了基本数据类型以外都属于引用类型 Java中的对象是通过引用对其操作的 class Car{ String name; String color; int price; } ...

  4. react类组件 组件传值

    class Cmp1 extends React.Component{ render(){ return ( <div>{ this.props.name } -- 我是一个类</d ...

  5. 设计模式:命令模式(Command Pattern)及实例

     好家伙,   0.什么是命令模式 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合". 但在某些场合,比如要对行为进行&q ...

  6. Java类加载和对象创建

    引言 Java代码需要被使用,必须要经过类加载器加载到内存中,然后对应的类才能够被创建使用,这文对类加载和对象创建和过程进行分析. 类加载 Java类通过懒加载的方式,经过了Loading.Linki ...

  7. WebUI自动化测试中关于图片验证码的解决方法

    关于怎么识别图片中的文字,传送门:https://www.cnblogs.com/teangtang/p/16157880.html 实现代码如下: #! /usr/bin/env python # ...

  8. [iOS]Size Class不同尺寸适配的是什么样的机型(实验向)

    Size Class的定义可以翻阅网友的博客,本文不再赘述http://blog.csdn.net/yongyinmg/article/details/39315829 http://blog.csd ...

  9. ansible(1)---师傅领进门

    背景 在企业里,运维需要配合开发进行产品上架,说白了就是把写好的代码上服务器.那么,就会出现这样的问题:需要运维人员配置好系统,配置好环境,配置好网络,配置好程序,配置好所有所有的依赖环境.     ...

  10. USB OTG有关协议

    想了解USB OTG的工作原理,需要知道三个协议: ADP:Attach Detection Protocol HNP:Host Negotiation Protocol SRP:Session Re ...