用扩展存储过程增强你的SQL Server(四)
程序员之家 作者:不详 日期:2002-4-14 2:04:00
--------------------------------------------------------------------------------
让XPRunComp运作起来
要使用任一新的扩展存储过程,首先得用SQL Server的内置存储过程sp_addextendedproc或通过SQL Server管理器注册它。sp_addextendedproc有两个参数:函数句和DLL句。使用图形界面的SQL Server管理器,首先在SQL Server管理树上打开databases-master-objects目录,双击Extended stored procedures目录,在弹出式菜单上选择New。在接着出现的对话框中,指定扩展存储过程句和DLL句。DLL必须放在系统路径下的某个地方(我喜欢放在winnt\system32目录下)。任何一个Windows C++程序员都能猜出SQL Server内部是怎样处理扩展存储过程的。当解析器在SQL语句中遇到扩展存储过程名时,它就查找这个输出函数是在那个DLL中实现的。解析器能够这样做是因为你在注册存储过程sp_addextendedproc时在第二个参数中提供了DLL名。然后SQL Server用Windows API函数LoadLibrary()装入DLL,调用GetProcAddress()取得指定函数的地址。
当你注册了XPRunComp,可用ISQL或用企业管理器中的SQL Query测试它。记住如果在master数据库外的数据库调用它时你必须将"master"数据库名指定为扩展存储过程名的一部分。我是这样调用的:exec master..XPRunComp。这里并没指定存储过程的拥有者;因此多了一个点。
当用XPRunComp运行你的组件时要清楚与Windows NT相关的安全问题。特别是由于SQL Server是以默认的系统帐号安全属性运行的,它不能访问你的网络驱动器。因此,所有对ActiveX自动化服务器调用必须本地存储,除非你改变SQL Server服务的默认登录帐号。
当在触发器中使用XPRunComp时,可能会碰到一个有趣的关于SQL Server锁定的问题。在SQL事务期间要读或修改的资源上保持锁定以防止多个事务并发使用的问题。 微软的SQL Server能够页面锁定及行级锁定。最常见的锁定类型是2K数据及索引页锁定。
我们来看看触发器的情况,你用XPRunComp调用OLE自动化对象中的方法,此对象创建与SQL Server的连接并试图在触发触发器的同一表中更新或插入一条记录。而且,假定记录与引起触发器的记录在同一页面上。如果锁定是页面级的,这种情况将导致SQL Server无法解决的锁定。一句话,这儿有两个在同一时间访问同一页面的进程。第一个进程(触发器)等待直到第二个进程(由OLE自动化对象中的SQL语句创建)退出。第二个进程等待第一个进程释放锁定。SQL Server在这种情况下甚至不返回错误信息-它只是永远等待。可通过在触发器中调用XPRunComp前加上提交(commit)语句来解决此问题。此举释放了页面上的锁定,使得第二个进程能够执行其所要求的数据库操作。
如果在ISQL应用程序中用XPRunComp调用对象方法,可在对象方法代码中显示一个用于测试的消息框。例如,假定你的OLE对象Mycomp.Class1有一个方法ShowMe,此方法显示传递给它的文本串。完整的调用" exec XPRunComp 'MyComp.Class1','Showme','This is a test'使ISQL显示含有给定文本的消息框。要注意如果在SQL Server中未设置Allow Service to Interact with Desktop选项,在触发器中包含这样的代码将使它挂起。显示,应避免在触发器调用需要用户输入的方法。这不是触发器设计的初衷。
总结
怎样改进XPRunComp 呢? 你可能注意到我只实现了对最常用的SQL Server类型的支持。如果传进一个不受支持的类型,扩展存储过程返回一错误信息。要增运支持未受支持的类型,需要修改ParseParameters()和AssignOutputParams()函数。
或许你还创建几个分立的扩展存储过程来创建一个COM对象,执行它的方法并释放它。这种情况下,你可调用一个存储过程(XPCreateComp)来创建它,多次调用另一个过程(XPRunComp)执行对象方法。最后释放对象(XPReleaseComp)。这种设计更为有效,因为你不必在每次执行其方法时都创建一个COM对象。你可以在同一个DLL中实现所有这三个过程。
通过创建用户定义的扩展存储过程来扩展SQL Server功能的能力使得你做为一个SQL程序员能够访问系统服务,内存,硬件。如果你觉得SQL Server少了一些重要特性,不必等待下一个版本,可以自已来实现。
分享到:
相关推荐
在SQL Server中,扩展存储过程(Extended Stored Procedures)是一种增强数据库功能的方法,它允许开发者创建自己的函数、存储过程和数据类型,这些功能是通过Windows动态链接库(DLL)实现的。编写安全的SQL Server...
2. **编写扩展存储过程**:接下来,使用 C# 或其他编程语言编写一个扩展存储过程,该过程负责调用 Web Service 并返回结果。 3. **注册扩展存储过程**:最后,将编写的扩展存储过程注册到 SQL Server 中,使其可以被...
SQL Server的扩展存储过程是数据库管理系统提供的一种机制,允许开发者编写使用C或C++语言的动态链接库(DLL),并将这些函数集成到SQL Server中,从而实现更复杂的功能,这在标准的SQL语法中可能无法直接完成。...
Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计信息来优化执行计划,但这种优化方式有时可能会导致执行计划的不正确,从而影响存储过程的执行速度。 在了解这个问题之前,我们通常认为存储...
SQL Server扩展存储过程是SQL Server数据库引擎的一种功能,允许开发者使用C或C++编写外部代码,然后在SQL Server环境中调用这些代码,以执行数据库系统原本不支持的特定任务。在本例中,我们关注的是如何通过扩展...
在VB6.0中调用SQL Server的存储过程是VB开发者经常遇到的问题,本文将详细介绍如何在VB6.0中调用SQL Server的存储过程,并对存储过程的优点和使用方法进行了详细的解释。 首先,存储过程是一种封装方法,用于重复...
### 执行SQL Server 存储过程并返回DataSet 在软件开发过程中,经常需要与数据库进行交互,其中一种常见的场景就是通过调用存储过程来获取数据并处理这些数据。本篇文章将详细探讨如何在C#中执行SQL Server的存储...
在SQL Server 2008中,存储过程分为系统存储过程、扩展存储过程和用户自定义存储过程。它们的优点包括提高性能(因为SQL语句预先编译)、提高安全性(通过权限控制访问)和简化复杂操作(将多条语句封装在一起)。...
SQL Server 的扩展存储过程,其实就是一个普通的 Windows DLL,只不过按照某种规则实现了某些函数而已。本文介绍一下作者的扩展存储过程,该动态库导出了三个函数: Init,work,Final,Init读文件,存储信息于内存,work...
4. **文件存在性检查**:使用`master..xp_fileexist`扩展存储过程检查指定路径下是否存在指定名称的Excel文件,如果不存在则进行后续操作。 5. **连接字符串构造**:根据文件是否存在以及文件路径构造连接字符串,...
### PHP安装连接SQLSERVER扩展方法 #### 背景与目的 在开发基于Web的应用程序时,PHP(Hypertext Preprocessor)作为一种广泛使用的开源服务器端脚本语言,经常需要与各种数据库进行交互来实现数据存储和检索等...
SQL Server 扩展存储过程和一般存储过程相比,执行过程、使用方法都相同,不同点在于一般存储过程由 SQL 语句组成,是一组用存储过程名标识的 SQL 语句集,其功能受到 SQL 语言的限制;而扩展存储过程则使用 Windows...
扩展存储过程允许用户使用其他高级编程语言创建外部例程,从而扩展了SQL Server的功能。这种扩展是通过Microsoft开放式数据服务(ODS)提供的编程接口实现的。通过这种方式,开发者能够利用如C或C++等语言来编写扩展...
本知识点主要围绕标题"php5.6+pdo+sqlserver 扩展dll"展开,讲解如何在PHP 5.6环境下通过PDO(PHP Data Objects)扩展来实现与SQL Server的连接,并使用相关的DLL扩展文件。 PDO是一种PHP的数据库抽象层,它提供了...
当扩展存储过程加载到 SQL Server 中,它的使用方法与系统存储过程一样。扩展存储过程只能添加到 master 数据库中,其前缀是 xp_。 存储过程的功能特点 存储过程可以实现以下功能: * 接收输入参数并以输出参数的...
### SqlServer存储过程详解 #### 一、存储过程概述 **存储过程**是数据库中一种重要的数据对象,它实质上是一组预编写的T-SQL命令集,通过定义特定的功能来实现复杂的数据处理任务。存储过程可以被视为数据库的...
可以让delphi写SQL server扩展存储过程的API单元,引用该单元就可以写出能让SQL调用的DLL
SQL Server 2005是微软推出的一款关系型数据库管理系统,它在企业级数据管理和处理中扮演着重要的角色。存储过程是SQL Server ...同时,不要忘记结合其他相关资料,不断扩展和深化你的SQL Server 2005存储过程知识。