转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
如何在Store Procedure中调用VB COM         ★★★★

如何在Store Procedure中调用VB COM

作者:闵涛 文章来源:闵涛的学习笔记 点击数:775 更新时间:2009/4/23 15:04:10

接着前面提到过的如何写Event Log到NT Server一文,此处将实现Store procedure中写Event Log到NT Server的功能。

其实,写Event Log到NT Server还是采用VB COM实现,而在此处所做的是在Store procedure中调用该VB COM。

首先介绍几个SQL Server自带的Store Procedure。

1:sp_OACreate    建立自动操作对象的一个实例
        这里自动操作对象可以是  ActiveX EXE、COM、Shell等。其中还可以利用wscript.Shell进行入侵攻击(扯远了)。
        可以采用如下方式创建COM:
      EXEC @hr = sp_OACreate ''''EventRecord.EventRecorder'''',@EventRecorder OUTPUT
     
这里EventRecord.EventRecorder即为VB编写的COM类,@EventRecorder为返回值,返回值为 int 型。之后的操作都将围绕该@EventRecorder进行,可以看作为Store Procedure中的一个对象。@hr为sp_OACreate调用返回值,若@hr=0则表示创建成功,否则失败。常用作出错处理。

2:sp_OADestroy    释放一个对象的实例
       在对创建的对象操作完成之后需要释放资源,可以采用如下方式:
       EXEC  sp_OADestroy @EventRecorder

3:sp_OAGetErrorInfo    从其他过程返回的HResult中获得错误信息
      主要用作错误处理。

4:sp_OAGetProperty    把对象的属性存储在结果集或局部变量中
      实现与对象的通信。如:
      EXEC sp_OAGetProperty @EventRecorder,''''Source'''',@EventSource OUTPUT
     
实现获取EventRecorder对象中的Source属性的值并放入到@EventSource变量中

5:sp_OASetProperty    对对象的属性进行赋值处理,将会改变对象的该属性值
      实现与对象的通信。如:
      EXEC sp_OASetProperty @EventRecorder,''''Source'''',@EventSource
     
实现设置@EventRecorder对象的Source属性,将Source属性设定为@EventSource变量的值。

6:sp_OAMethod     实现对象的方法的调用
      向对象的方法传递参数,并得到返回值。
      有参数有返回值:如
      EXEC  sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT,
                                             @EventMessage=@EventMessage,@EventType=@EventType,
                                             @EventID=@EventID,@EventCategory=@EventCategory
      无参数有返回值:如
      EXEC  sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT
      无参数无返回值:如
      EXEC  sp_OAMethod @EventRecorder,''''WriteEventLog'''',NULL

7:sp_OAStop    关闭SQL Server的自动存储过程
      关闭SQL Server对COM的自动操作环境,无须任何参数。不是必须的,因为第一次调用sp_OACreate时会自动开启自动操作环境,SQL Server关闭时,该自动环境也会自动关闭。另外,如果一个存储过程正在对一个COM对象进行操作,而另一个存储过程关闭了该自动环境,则会出现错误,所以不建议采用这种方式。

OK,至此,对于操作COM所必须的知识已经足够了。
下面是本次实现的例子:

/*
** Write Event Log To NT Event Viewer
*/
CREATE   PROCEDURE dbo.sp_EventRecorder
(
 @EventSource nvarchar(100),  ----Event Source
 @EventID int,   ----Event ID , please refer the <Application ID document>
 @EventType int,   ----Event Type , 0--Information;1--Error;2--Warning
 @EventMessage nvarchar(2000),  ----Event Message,the Error Content
 @EventCategory int = 0,  ----Event Category ,default 0
 @ReturnValue int OUTPUT  ----Return Value 0--Success;1--Fail
)
AS
DECLARE
 @EventMachineName nvarchar(100),
 @EventRecorder  int,
 @hr   int,
 @ResultValue  nvarchar(10)

 BEGIN
  ----Set Event Log Server Name,'''' '''' Means Local Machine,Need To Config
  SET @EventMachineName = '''' ''''
 END

 ----Create EventRecorder Object
 EXEC @hr = sp_OACreate ''''EventRecord.EventRecorder'''',@EventRecorder OUTPUT
 IF @hr = 0
 BEGIN
  ----Set Method 0--Write To Event Viewer;1--Write To DataBase.Default 0
  EXEC @hr = sp_OASetProperty @EventRecorder,''''Method'''',0
  IF @hr <> 0 GOTO ErrorHandle

  ----Set Machine Name of Event Log Server,Default Local Server
  EXEC @hr = sp_OASetProperty @EventRecorder,''''MachineName'''',@EventMachineName
  IF @hr <> 0 GOTO ErrorHandle

  ----Set Event Source,Must to do it!
  EXEC @hr = sp_OASetProperty @EventRecorder,''''Source'''',@EventSource
  IF @hr <> 0 GOTO ErrorHandle

  ----Write Event Log
  EXEC  @hr = sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT,
        @EventMessage=@EventMessage,@EventType=@EventType,
        @EventID=@EventID,@EventCategory=@EventCategory
  IF @hr <> 0 GOTO ErrorHandle
  
  ----Check if write successfully!
  IF @ResultValue = ''''True''''
  BEGIN
   SET @ReturnValue = 0
   EXEC  sp_OADestroy @EventRecorder
   RETURN
  END
  ELSE
  BEGIN
   SET @ReturnValue = 1
   EXEC  sp_OADestroy @EventRecorder
   RETURN
  END
 END
 ELSE
 BEGIN
  SET @ReturnValue = 1
  RETURN
 END

ErrorHandle:

 SET @ReturnValue = 1
 EXEC  sp_OADestroy @EventRecorder
 RETURN


[SyBase]使用dbcc memusage确定procedure cache size大小  [SyBase]dbcc memusage确定Procedure Cache Size
[MySql]MySQL5.0 Alpha & Create Procedure  [Sql Server]My First PL/SQL Procedure
[Sql Server]pager procedure for sql server  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台