如何在Store Procedure中调用VB COM

接着前面提到过的如何写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

 1<application document="" id="">   
 2@EventType int, ----Event Type , 0--Information;1--Error;2--Warning   
 3@EventMessage nvarchar(2000), ----Event Message,the Error Content   
 4@EventCategory int = 0, ----Event Category ,default 0   
 5@ReturnValue int OUTPUT ----Return Value 0--Success;1--Fail   
 6)   
 7AS   
 8DECLARE   
 9@EventMachineName nvarchar(100),   
10@EventRecorder int,   
11@hr int,   
12@ResultValue nvarchar(10) 
13
14BEGIN   
15\----Set Event Log Server Name,' ' Means Local Machine,Need To Config   
16SET @EventMachineName = ' '   
17END 
18
19\----Create EventRecorder Object   
20EXEC @hr = sp_OACreate 'EventRecord.EventRecorder',@EventRecorder OUTPUT   
21IF @hr = 0   
22BEGIN   
23\----Set Method 0--Write To Event Viewer;1--Write To DataBase.Default 0   
24EXEC @hr = sp_OASetProperty @EventRecorder,'Method',0   
25IF @hr &lt;&gt; 0 GOTO ErrorHandle 
26
27\----Set Machine Name of Event Log Server,Default Local Server   
28EXEC @hr = sp_OASetProperty @EventRecorder,'MachineName',@EventMachineName   
29IF @hr &lt;&gt; 0 GOTO ErrorHandle 
30
31\----Set Event Source,Must to do it!   
32EXEC @hr = sp_OASetProperty @EventRecorder,'Source',@EventSource   
33IF @hr &lt;&gt; 0 GOTO ErrorHandle 
34
35\----Write Event Log   
36EXEC @hr = sp_OAMethod @EventRecorder,'WriteEventLog',@ResultValue OUTPUT,   
37@EventMessage=@EventMessage,@EventType=@EventType,   
38@EventID=@EventID,@EventCategory=@EventCategory   
39IF @hr &lt;&gt; 0 GOTO ErrorHandle   
40  
41\----Check if write successfully!   
42IF @ResultValue = 'True'   
43BEGIN   
44SET @ReturnValue = 0   
45EXEC sp_OADestroy @EventRecorder   
46RETURN   
47END   
48ELSE   
49BEGIN   
50SET @ReturnValue = 1   
51EXEC sp_OADestroy @EventRecorder   
52RETURN   
53END   
54END   
55ELSE   
56BEGIN   
57SET @ReturnValue = 1   
58RETURN   
59END 
60
61ErrorHandle: 
62
63SET @ReturnValue = 1   
64EXEC sp_OADestroy @EventRecorder   
65RETURN</application>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus