在存储过程中调用外部的动态连接库
发布时间:2020-12-12 15:09:06 所属栏目:MsSql教程 来源:网络整理
导读:问题的提出: 一般我们要根据数据库的纪录变化时,进行某种操作。我们习惯的操作方式是在程序中不停的查询表,判断是否有新纪录。这样耗费的资源就很高,如何提高这种效率,我想在表中创建触发器,在触发器中调用外部动态连接库通过消息或事件通知应用程序就
问题的提出:
一般我们要根据数据库的纪录变化时,进行某种操作。我们习惯的操作方式是在程序中不停的查询表,判断是否有新纪录。这样耗费的资源就很高,如何提高这种效率,我想在表中创建触发器,在触发器中调用外部动态连接库通过消息或事件通知应用程序就可实现。而master的存储过程中最好能调用外部的动态连接库,我们在触发器中调用master的存储过程即可。 下载源代码?http://www.vckbase.com/document/journal/vckbase12/src/StoreProc.zip 说明:VC6需要安装较新的Platform?SDK才能顺利编译本代码,VC.Net可以直接编译本代码。另外还需要连接Opends60.lib 为了使没有较新Platform?SDK的朋友也能编译本例子,已经将VC.Net中的Srv.h和Opends60.lib放到压缩包中 程序实现: 我们来实现一个存储过程中调用外部的dll(storeproc.dll)的函数SetFileName和addLine。 存储过程如下(需放到master库中): CREATE?PROCEDURE?sp_testdll?AS exec?sp_addextendedproc?'SetFileName',?'storeproc.dll' exec?sp_addextendedproc?'addLine',?'storeproc.dll' declare?@szFileName?varchar(200) declare?@szText?varchar(200) declare?@rt?int Select?@szFileName?=?'c:/welcome.txt' EXEC?@rt?=?SetFileName?@szFileName if?@rt?=?0 begin select?@szText?=?'welcome?01' Exec?@rt?=?addLine?@szText select?@szText?=?'welcome?02' Exec?@rt?=?addLine?@szText end exec?sp_dropextendedproc?'SetFileName' exec?sp_dropextendedproc?'addLine' dbcc?SetFileName(free) dbcc?addLine(free) 动态连接库的实现:这种动态连接库和普通的有所不同。该动态连接库要放入SQL的执行目录下,或直接放到Window的System32目录下,并重起SQL-Server #include?<windows.h> #include?<srv.h> #define?XP_NOERROR??????0 #define?XP_ERROR????????1 #ifndef?_DEBUG #define?_DEBUG #endif char?szFileName[MAX_PATH+1]; void?WriteInfo(const?char?*?str); extern?"C"?SRVRETCODE?WINAPI?SetFileName(SRV_PROC*?pSrvProc) { } extern?"C"?SRVRETCODE?WINAPI?addLine(SRV_PROC*?pSrvProc) { } inline?void?WriteInfo(const?char?*?str){ ????#ifdef?_DEBUG (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |