首页 > 开发 > 综合 > 正文

如何在Store Procedure中调用VB COM

2024-07-21 02:20:32
字体:
来源:转载
供稿:网友
 

接着前面提到过的如何写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,
                                             @[email protected],@[email protected],
                                             @[email protected],@[email protected]
      无参数有返回值:如
      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,
        @[email protected],@[email protected],
        @[email protected],@[email protected]
  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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表