在存储过程中调用外部的动态连接库

一般我们要根据数据库的纪录变化时,进行某种操作。我们习惯的操作方式是在程序中不停的查询表,判断是否有新纪录。这样耗费的资源就很高,如何提高这种效率,我想在表中创建触发器,在触发器中调用外部动态连接库通过消息或事件通知应用程序就可实现。而master的存储过程中最好能调用外部的动态连接库,我们在触发器中调用master的存储过程即可。   说明: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 --调用SetFileName函数,参数为--szFileName; if @rt = 0 begin select @szText = ''welcome 01'' Exec @rt = addLine @szText --调用addLine 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 #include            //要加入这个.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) {     WriteInfo("SetFileName start");     int paramCount = srv_rpcparams(pSrvProc);     if (paramCount != 1){         WriteInfo("Param Err start");         return XP_ERROR;     }     BYTE      bType;     unsigned long  cbMaxLen;     unsigned long  cbActualLen;     BOOL      fNull;     int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,             NULL, &fNull);     if (cbActualLen){         ZeroMemory(szFileName, MAX_PATH 1);         memcpy(szFileName, srv_paramdata(pSrvProc, 1), cbActualLen);         WriteInfo("Set filename ok");         return (XP_NOERROR);     }     else {         WriteInfo("Set filename param failed");         return XP_ERROR;     } } extern "C" SRVRETCODE WINAPI addLine(SRV_PROC* pSrvProc) {     WriteInfo("addline start");     int paramCount = srv_rpcparams(pSrvProc);     if (paramCount != 1){         WriteInfo("addline param err");         return XP_ERROR;     }     BYTE      bType;     unsigned long  cbMaxLen;     unsigned long  cbActualLen;     BOOL      fNull;     bool      rt = false;     int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,             NULL, &fNull);     if (cbActualLen){         int n;         char srt[3] = {0x0d, 0x0a, 0};         char * c = new char[cbActualLen 3];         if (!c)return XP_ERROR;         ZeroMemory(c, cbActualLen 3);         memcpy(c, srv_paramdata(pSrvProc, 1), cbActualLen);         memcpy(c cbActualLen, srt, 3);         HANDLE hf = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,                  OPEN_ALWAYS, 0, NULL);         if (hf == INVALID_HANDLE_VALUE){             WriteInfo("addline create file err ");             delete []c;             return XP_ERROR;         }         WriteInfo("addline create file ok ");         DWORD dwWt;         n = strlen(c);         SetFilePointer(hf, 0, NULL, FILE_END);         if (WriteFile(hf, c, n, &dwWt, NULL) && dwWt == n)         {             WriteInfo("addline write file ok ");             rt = true;         }         delete []c;         CloseHandle(hf);     }     return rt ? XP_NOERROR:XP_ERROR; } inline void WriteInfo(const char * str){ #ifdef _DEBUG     char srt[3] = {0x0d, 0x0a, 0};     HANDLE hf = CreateFile("c://storeproc.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,                  OPEN_ALWAYS, 0, NULL);     if (hf != INVALID_HANDLE_VALUE){         SetFilePointer(hf, 0, NULL, FILE_END);         DWORD dwWt;         WriteFile(hf, str, strlen(str), &dwWt, NULL);         WriteFile(hf, srt, strlen(srt), &dwWt, NULL);         CloseHandle(hf);     }     else {         MessageBox(NULL, "Write info err", "Message", MB_OK|MB_ICONINFORMATION);     }     #endif } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {     return TRUE; }   编译完成后,把动态链接库放到WINNT/System32目录下,启动SQL Server。我们可以打开SQL Server Query Analyzer调用存储过程sp_testdll以测试其运行是否正确。   具体可参考SQL-Server的在线帮助。   笔者环境:win2000 professional SQL-Server7.0(2000也可)   VC6.0 SP5 Platform SDK 20001.8   VC知识库测试环境:win2000 professional SQL-Server 7.0 VC.Net

vc++数据开发资源包 都是过时的技术。 我自己学习用的。 ------------------------- ADO270.CHI ADO270.CHM ADOSQL.CHI ADOSQL.CHM COM.CHM DBLIBC.CHI DBLIBC.CHM DBLIBC.chw ODBCSQL.CHM ODECORE.CHI OLEDB.CHI OLEDB.CHM OLEDBSQL.CHI OLEDBSQL.CHM ─INCLUDE DB2CONST.H DBMCONST.H DTMCONST.H DTSCONST.H DTSFFILE.H DTSPKG.H DTSPUMP.H EQMCONST.H GENCONST.H IFXCONST.H MDSCONST.H MSDADC.H MSDAGUID.H MSDASC.H MSDASQL.H OCLCONST.H ODBCINST.H ODBCOR_G.BAS ODBCSS.H ODBEXT_G.BAS OLEDB.H OLEDBERR.H OLPCONST.H REPAPI.H REPAUTO.H REPENG.BAS REPERR.H REPLDIST.H REPLDSTX.C REPLERRI.C REPLERRX.H REPLINIX.C REPLMRGX.C REPTIM.H REPTIM2.H REPTIM3.H SIMCONST.H SQL.H SQLCA.H SQLCONST.H SQLDA.H SQLDB.H SQLDISTX.H SQLDMO.H SQLDMOID.H SQLEXT.H SQLFRONT.H SQLINITX.H SQLMERGX.H SQLNSDEF.H SQLNSX.H SQLOLEDB.H SQLRES.H SQLRES.IDL SQLRESID.H SQLTYPES.H SQLUCODE.H SRV.H SRVAPI.H SRVCONST.H SRVDBTYP.H SRVMISC.H SRVSTRUC.H SRVTOK.H SRVTYPES.H TFMCONST.H TRANSACT.H TXCOORD.H TXDTC.H UMLCONST.H UMXCONST.H VDI.H VDIERROR.H VDIGUID.H WN95SCM.H XACTOMSG.H XOLEHLP.H ─SAMPLES ├─ADO │ UNZIP_AD │ ├─BACKUP │ UNZIP_BA │ ├─DBLIB │ UNZIP_DB │ ├─DESKTOP │ SAMPLE.M │ SAMPLEUP │ UNZIP_DE │ ├─DTS │ UNZIP_DT │ ├─ESQLC │ UNZIP_ES │ ├─MISC │ UNZIP_MI │ ├─MSDTC │ UNZIP_MS │ ├─ODBC │ UNZIP_OD │ ├─ODS │ UNZIP_OD │ ├─OLEAUTO │ UNZIP_OL │ ├─SQLDMO │ UNZIP_SQ │ ├─SQLNS │ UNZIP_SQ │ ├─SQLREPL │ UNZIP_SQ │ ├─UTILS │ UNZIP_UT │ └─XML UNZIP_XM ─SDK MDACSDKLITE. XMLSDK.MSI ─X86LIB ADME.LIB CAW32.LIB DACDLL.LIB DTCCFG.LIB DTCCM.LIB DTCHELP.LIB DTCTRACE.LIB DTCUIC.LIB DTCUIS.LIB DTCUTIL.LIB LOGMGR.LIB MSDASC.LIB MSDTC.LIB MSDTCPRX.LIB MSDTCTM.LIB NTWDBLIB.LIB ODBC32.LIB ODBCBCP.LIB ODBCCP32.LIB OLEDB.LIB OLEDBD.LIB OPENDS60.LIB SAMPDTCR.LIB SQLAKW32.LIB SVCSRVL.LIB UTIL.LIB W95SCM.LIB XOLEHLP.LIB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值