如何在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 <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

时间: 2024-10-31 12:53:26

如何在Store Procedure中调用VB COM的相关文章

如何在C/C++中调用Java

java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少.怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder.Eclipse都是使用纯Java开发的集成环境.这些集成环境启动的时候并不会打开一个命令窗口,因为它使用了JNI(Java Native Interface)的技术.通过这种技术,开发人员不

函数调用-JavaScript中,如何在setTimeout函数中调用一个class中的函数

问题描述 JavaScript中,如何在setTimeout函数中调用一个class中的函数 function create_plant(name,position_first,position_second) { this.name=name; this.position_first=position_first; this.position_second=position_second; this.plant=function(a){ if((test==0)&&(this.name)

驱动开发-虚拟摄像头开发——如何在C#编程中调用虚拟摄像头驱动

问题描述 虚拟摄像头开发--如何在C#编程中调用虚拟摄像头驱动 我现在在做一个C#的桌面软件,需要使用虚拟摄像头,查了些关于虚拟摄像头开发的资料,稍微了解了一点,但是还是不是很清楚具体该怎么着手做. 请问下如何对虚拟摄像头采用什么编程语言,什么开发工具比较合适,谢谢~

代码-如何在Matlab7.0中调用*.cpp

问题描述 如何在Matlab7.0中调用*.cpp 现在做一个蚁群系统算法的研究,用C++写好了代码,想用matlab模拟一下,但不知到matlab里怎么调用*.cpp 解决方案 http://wenku.baidu.com/link?url=W2RsVl0Q2HB96cbNoHK05FN9kQzcaVVDxZ9FdOurnUnkHHg1tPRbPsW7_ResjZGBYvQ3Tmt_EAcLcb1hYvBRMtEOaPz-dk8mztVxQVb0upu 解决方案二: Matlab调用cpp+第

c# 如何在button事件中调用

问题描述 如何在button事件中调用下面的代码?publicvoidnotifySelection(refIvcSelectionSelection,intSelectionTypeChange){if(Selection.ItemCount==0){return;}if(Selection.ItemCount>=1){for(inti=0;i<Selection.ItemCount;i++){comp=(IvcComponent)Selection.getItem(i);for(inta=

设置-如何在.Cpp程序中调用.c程序中的函数?

问题描述 如何在.Cpp程序中调用.c程序中的函数? 我在软件中需要把mp3文件转换成wav文件.为此从网上下载了一个转换程序.但把这些转换程序的文件加入到我的用VC6.0编写的MFC工程中后却发现编译通不过.为此,我把Project Settings中这些文件对应的Precompiled Headers都设置成Not using precompiled headers.这样,编译能通过了.但连接却通不过.我的具体程序和现象如下: 我在我的一个.cpp文件中需要调用如下函数: BOOL mp3T

i utomator-如何在UiAutomator测试中调用Android服务?

问题描述 如何在UiAutomator测试中调用Android服务? TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyManager.getDeviceId(); 上面代码是安卓工程中 的代码,可以获取手机的IMEI号码,但是怎么在我的UIAutomator测试工程中调用,来获取手机IMEI

如何在Oracle存储过程中调用Java方法

存储过程中调用Java程序段 软件环境: 1.操作系统:Windows 2000 Server 2.数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版 3.安装路径:C:\ORACLE 实现方法: 1.创建一个文件为Test.java public class Test { public static void main(String args[]) { System.out.println("HELLO THIS iS A Java PROCEDURE"):

C#中调用VB中Inputbox类的实现方法_C#教程

C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用 一:间接调用vb中的Inputbox功能       1.在项目中添加对Microsoft.VisualBasic引用       2.在项目中添加命名空间Using Microsoft.VisualBasic;       3.以后就可以直接使用VB中的好多类库(爽啊--)        例如:textBox1.Text=Microsoft.VisualBasic.Interaction.InputBo