📄 在存储过程中调用外部的动态连接库.htm
字号:
lang=EN-US>SQL-Server #include <br>
<br>
<br>
#include</span><span class=GramE> </span><span lang=EN-US>//</span>要加入这个<span
lang=EN-US>.h</span>文件<span lang=EN-US> <br>
<br>
#define XP_NOERROR</span> <span class=GramE> </span><span lang=EN-US>0 <br>
#define XP_ERROR</span><span class=GramE> </span><span lang=EN-US>1 <br>
<br>
#<span class=SpellE>ifndef</span> _DEBUG <br>
#define _DEBUG <br>
#<span class=SpellE>endif</span> <br>
<br>
char <span class=SpellE>szFileName</span>[MAX_PATH 1]; <br>
<br>
void <span class=SpellE>WriteInfo</span></span>(<span lang=EN-US>const char *
<span class=SpellE>str</span></span>)<span lang=EN-US>; <br>
<br>
extern "C" SRVRETCODE WINAPI <span class=SpellE>SetFileName</span></span>(<span
lang=EN-US>SRV_PROC* <span class=SpellE>pSrvProc</span></span>)<span
lang=EN-US> <br>
{ <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>SetFileName</span> start"</span>)<span
lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>int</span></span><span
lang=EN-US> <span class=SpellE>paramCount</span> = <span class=SpellE>srv_rpcparams</span></span>(<span
class=SpellE><span lang=EN-US>pSrvProc</span></span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span lang=EN-US>paramCount</span></span><span
lang=EN-US> != 1</span>)<span lang=EN-US>{ <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>Param</span> Err start"</span>)<span
lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>return XP_ERROR; <br>
</span> <span class=GramE> </span><span lang=EN-US>} <br>
<br>
</span><span class=GramE> </span><span lang=EN-US>BYTE</span><span
class=GramE> </span><span class=SpellE><span lang=EN-US>bType</span></span><span
lang=EN-US>; <br>
</span> <span lang=EN-US>unsigned long</span> <span lang=EN-US> <span
class=SpellE>cbMaxLen</span>; <br>
</span> <span lang=EN-US>unsigned long</span> <span lang=EN-US> <span
class=SpellE>cbActualLen</span>; <br>
</span> <span lang=EN-US>BOOL</span><span class=GramE> </span><span
class=SpellE><span lang=EN-US>fNull</span></span><span lang=EN-US>; <br>
<br>
</span> <span class=SpellE><span lang=EN-US>int</span></span><span
lang=EN-US> ret = <span class=SpellE>srv_paraminfo</span></span>(<span
class=SpellE><span lang=EN-US>pSrvProc</span></span><span lang=EN-US>, 1,
&<span class=SpellE>bType</span>, &<span class=SpellE>cbMaxLen</span>,
&<span class=SpellE>cbActualLen</span>, <br>
</span><span class=GramE> </span><span lang=EN-US>NULL, &<span
class=SpellE>fNull</span></span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span lang=EN-US>cbActualLen</span></span>)<span
lang=EN-US>{ <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>ZeroMemory</span></span>(<span
class=SpellE><span lang=EN-US>szFileName</span></span><span lang=EN-US>,
MAX_PATH 1</span>)<span lang=EN-US>; <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>memcpy</span></span>(<span
class=SpellE><span lang=EN-US>szFileName</span></span><span lang=EN-US>, <span
class=SpellE>srv_paramdata</span></span>(<span class=SpellE><span lang=EN-US>pSrvProc</span></span><span
lang=EN-US>, 1</span>)<span lang=EN-US>, <span class=SpellE>cbActualLen</span></span>)<span
lang=EN-US>; <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"Set filename ok"</span>)<span lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>return </span>(<span
lang=EN-US>XP_NOERROR</span>)<span lang=EN-US>; <br>
</span> <span class=GramE> </span><span lang=EN-US>} <br>
</span><span class=GramE> </span><span lang=EN-US>else { <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"Set filename <span class=SpellE>param</span> failed"</span>)<span
lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>return XP_ERROR; <br>
</span> <span class=GramE> </span><span lang=EN-US>} <br>
} <br>
<br>
extern "C" SRVRETCODE WINAPI <span class=SpellE>addLine</span></span>(<span
lang=EN-US>SRV_PROC* <span class=SpellE>pSrvProc</span></span>)<span
lang=EN-US> <br>
{ <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>addline</span> start"</span>)<span
lang=EN-US>; <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>int</span></span><span
lang=EN-US> <span class=SpellE>paramCount</span> = <span class=SpellE>srv_rpcparams</span></span>(<span
class=SpellE><span lang=EN-US>pSrvProc</span></span>)<span lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>if </span>(<span
class=SpellE><span lang=EN-US>paramCount</span></span><span lang=EN-US> != 1</span>)<span
lang=EN-US>{ <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>addline</span> <span class=SpellE>param</span>
err"</span>)<span lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>return XP_ERROR; <br>
</span> <span class=GramE> </span><span lang=EN-US>} <br>
<br>
</span><span class=GramE> </span><span lang=EN-US>BYTE</span><span
class=GramE> </span><span class=SpellE><span lang=EN-US>bType</span></span><span
lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>unsigned long</span> <span
class=SpellE><span lang=EN-US>cbMaxLen</span></span><span lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>unsigned long</span> <span
class=SpellE><span lang=EN-US>cbActualLen</span></span><span lang=EN-US>; <br>
</span><span class=GramE> </span><span lang=EN-US>BOOL</span><span
class=GramE> </span><span class=SpellE><span lang=EN-US>fNull</span></span><span
lang=EN-US>; <br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>bool</span></span><span
class=GramE> </span><span class=SpellE><span lang=EN-US>rt</span></span><span
lang=EN-US> = false; <br>
<br>
</span><span class=GramE> </span><span class=SpellE><span lang=EN-US>int</span></span><span
lang=EN-US> ret = <span class=SpellE>srv_paraminfo</span></span>(<span
class=SpellE><span lang=EN-US>pSrvProc</span></span><span lang=EN-US>, 1,
&<span class=SpellE>bType</span>, &<span class=SpellE>cbMaxLen</span>,
&<span class=SpellE>cbActualLen</span>, <br>
</span> <span lang=EN-US>NULL, &<span class=SpellE>fNull</span></span>)<span
lang=EN-US>; <br>
<br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span lang=EN-US>cbActualLen</span></span>)<span
lang=EN-US>{ <br>
</span> <span class=SpellE><span lang=EN-US>int</span></span><span
lang=EN-US> n; <br>
</span> <span lang=EN-US>char <span class=SpellE>srt</span>[3] =
{0x0d, 0x<st1:chmetcnv UnitName="a" SourceValue="0" HasSpace="False"
Negative="False" NumberType="1" TCSC="0" w:st="on">0a</st1:chmetcnv>, 0}; <br>
<br>
</span> <span lang=EN-US>char * c = new char[<span class=SpellE>cbActualLen</span>
3]; <br>
</span> <span lang=EN-US>if </span>(<span lang=EN-US>!c</span>)<span
lang=EN-US>return XP_ERROR; <br>
<br>
</span> <span class=SpellE><span lang=EN-US>ZeroMemory</span></span>(<span
lang=EN-US>c, <span class=SpellE>cbActualLen</span> 3</span>)<span
lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>memcpy</span></span>(<span
lang=EN-US>c, <span class=SpellE>srv_paramdata</span></span>(<span
class=SpellE><span lang=EN-US>pSrvProc</span></span><span lang=EN-US>, 1</span>)<span
lang=EN-US>, <span class=SpellE>cbActualLen</span></span>)<span lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>memcpy</span></span>(<span
lang=EN-US>c <span class=SpellE>cbActualLen</span>, <span class=SpellE>srt</span>,
3</span>)<span lang=EN-US>; <br>
<br>
</span> <span lang=EN-US>HANDLE <span class=SpellE>hf</span> = <span
class=SpellE>CreateFile</span></span>(<span class=SpellE><span lang=EN-US>szFileName</span></span><span
lang=EN-US>, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, <br>
</span> <span lang=EN-US>OPEN_ALWAYS, 0, NULL</span>)<span
lang=EN-US>; <br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span
lang=EN-US>hf</span></span><span lang=EN-US> == INVALID_HANDLE_VALUE</span>)<span
lang=EN-US>{ <br>
</span> <span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>addline</span> create file err "</span>)<span
lang=EN-US>; <br>
</span> <span lang=EN-US>delete []c; <br>
</span> <span lang=EN-US>return XP_ERROR; <br>
</span> <span lang=EN-US>} <br>
<br>
</span> <span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>addline</span> create file ok "</span>)<span
lang=EN-US>; <br>
</span> <span lang=EN-US>DWORD <span class=SpellE>dwWt</span>; <br>
</span> <span lang=EN-US>n = <span class=SpellE>strlen</span></span>(<span
lang=EN-US>c</span>)<span lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>SetFilePointer</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span><span lang=EN-US>, 0, NULL,
FILE_END</span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span
lang=EN-US>WriteFile</span></span>(<span class=SpellE><span lang=EN-US>hf</span></span><span
lang=EN-US>, c, n, &<span class=SpellE>dwWt</span>, NULL</span>)<span
lang=EN-US> && <span class=SpellE>dwWt</span> == n</span>)<span
lang=EN-US> <br>
</span> <span lang=EN-US>{ <br>
</span> <span class=SpellE><span lang=EN-US>WriteInfo</span></span>(<span
lang=EN-US>"<span class=SpellE>addline</span> write file ok "</span>)<span
lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>rt</span></span><span
lang=EN-US> = true; <br>
</span> <span lang=EN-US>} <br>
</span> <span lang=EN-US>delete []c; <br>
</span> <span class=SpellE><span lang=EN-US>CloseHandle</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>} <br>
</span> <span lang=EN-US>return <span class=SpellE>rt</span> ?
XP_NOERROR:XP_ERROR; <br>
} <br>
<br>
inline void <span class=SpellE>WriteInfo</span></span>(<span lang=EN-US>const
char * <span class=SpellE>str</span></span>)<span lang=EN-US>{ <br>
#<span class=SpellE>ifdef</span> _DEBUG <br>
</span> <span lang=EN-US>char <span class=SpellE>srt</span>[3] = {0x0d, 0x<st1:chmetcnv
UnitName="a" SourceValue="0" HasSpace="False" Negative="False" NumberType="1"
TCSC="0" w:st="on">0a</st1:chmetcnv>, 0}; <br>
</span> <span lang=EN-US>HANDLE <span class=SpellE>hf</span> = <span
class=SpellE>CreateFile</span></span>(<span lang=EN-US>"c:\\storeproc.log",
GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, <br>
</span> <span lang=EN-US>OPEN_ALWAYS, 0, NULL</span>)<span
lang=EN-US>; <br>
</span> <span lang=EN-US>if </span>(<span class=SpellE><span lang=EN-US>hf</span></span><span
lang=EN-US> != INVALID_HANDLE_VALUE</span>)<span lang=EN-US>{ <br>
</span> <span class=SpellE><span lang=EN-US>SetFilePointer</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span><span lang=EN-US>, 0, NULL,
FILE_END</span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>DWORD <span class=SpellE>dwWt</span>; <br>
</span> <span class=SpellE><span lang=EN-US>WriteFile</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span><span lang=EN-US>, <span
class=SpellE>str</span>, <span class=SpellE>strlen</span></span>(<span
class=SpellE><span lang=EN-US>str</span></span>)<span lang=EN-US>, &<span
class=SpellE>dwWt</span>, NULL</span>)<span lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>WriteFile</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span><span lang=EN-US>, <span
class=SpellE>srt</span>, <span class=SpellE>strlen</span></span>(<span
class=SpellE><span lang=EN-US>srt</span></span>)<span lang=EN-US>, &<span
class=SpellE>dwWt</span>, NULL</span>)<span lang=EN-US>; <br>
</span> <span class=SpellE><span lang=EN-US>CloseHandle</span></span>(<span
class=SpellE><span lang=EN-US>hf</span></span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>} <br>
</span> <span lang=EN-US>else { <br>
</span> <span class=SpellE><span lang=EN-US>MessageBox</span></span>(<span
lang=EN-US>NULL, "Write info err", "Message",
MB_OK|MB_ICONINFORMATION</span>)<span lang=EN-US>; <br>
</span> <span lang=EN-US>} <br>
</span> <span lang=EN-US>#<span class=SpellE>endif</span> <br>
} <br>
<br>
BOOL WINAPI <span class=SpellE>DllMain</span></span>(<span lang=EN-US>HINSTANCE
<span class=SpellE>hinstDLL,DWORD</span> <span class=SpellE>fdwReason,LPVOID</span>
<span class=SpellE>lpReserved</span></span>)<span lang=EN-US> <br>
{ <br>
</span> <span lang=EN-US>return TRUE; <br>
} <br>
<br>
<br>
</span> 编译完成后,把动态链接库放到<span lang=EN-US>WINNT/System32</span>目录下<span
lang=EN-US>,</span>启动<span lang=EN-US>SQL Server</span>。我们可以打开<span
lang=EN-US>SQL Server Query Analyzer</span>调用存储过程<span class=SpellE><span
lang=EN-US>sp_testdll</span></span>以测试其运行是否正确。<span lang=EN-US> <br>
<br>
</span> 具体可参考<span lang=EN-US>SQL-Server</span>的在线帮助。<span lang=EN-US> <br>
</span> 笔者环境:<span lang=EN-US>win2000 professional SQL-Server7.0</span>(<span
lang=EN-US>2000</span>也可)<span lang=EN-US> <br>
</span> <span lang=EN-US>VC6.0 SP5 Platform SDK 20001.8 <br>
<br>
</span> <span lang=EN-US>VC</span>知识库测试环境:<span lang=EN-US>win2000
professional SQL-Server 7.0 VC.Net<o:p></o:p></span></span></p>
</td>
<td style='padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal align=left style='text-align:left;mso-pagination:widow-orphan'><span
lang=EN-US style='font-size:10.0pt;mso-font-kerning:0pt'><o:p> </o:p></span></p>
</td>
<td style='padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal align=left style='text-align:left;mso-pagination:widow-orphan'><span
lang=EN-US style='font-size:10.0pt;mso-font-kerning:0pt'><o:p> </o:p></span></p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -