由触发器调用的 MS SQL XP 更改 C++ 文件日期戳,以允许刷新表单应用程序 vb.net

c++ file datestamp change by ms sql xp called by trigger to allow refresh vb.net forms application

本文关键字:许刷新 刷新 net vb 应用程序 表单 MS 调用 触发器 SQL XP      更新时间:2023-10-16

我正在使用SQL2012和VS2012。

我想实现这个解决方案来观察文件的日期和时间戳,当触发 SQL 表上的触发器时,该时间戳由 dll 更新。

这就是我要做的。

引用了 MSDN 文章

我已经按照说明进行操作,但得到了这个:

Msg 17750, Level 16, State 0, Procedure xsp_UpdateSignalFile, Line 1
Could not load the DLL XSP.dll, or one of the DLLs it references. Reason: 193(%1 is not a valid Win32 application.).

我假设是因为我使用的是 64 位SQL2012。

我下载了 XSP.DLL 源代码并在 VS2012 中查看,但无法编译它,即使找到自己一份 opends60.lib 的副本

Error 4    error LNK2019: unresolved external symbol _srv_rpcparams referenced in function _xsp_UpdateSignalFile     C:UsersAdministratorDocumentsxsp.dllWickedCode0304XSPXSP.obj  XSP

C++向导可以帮助我将其编译为 64 位还是我早点出错?

它说它无法解决一些收到的参数?

.cpp文件如下所示:

#include <windows.h>
#include <srv.h>
///////////////////////////////////////////////////////////////////////
// Entry point
extern "C" BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD dwReason,
    LPVOID lpReserved)
{
    return TRUE;
}
///////////////////////////////////////////////////////////////////////
// Exported functions
extern "C" __declspec (dllexport)
ULONG __GetXpVersion ()
{
   return ODS_VERSION;
}
extern "C" __declspec (dllexport)
SRVRETCODE xsp_UpdateSignalFile (SRV_PROC *srvproc)
{
    //
    // Make sure an input parameter is present.
    //
    if (srv_rpcparams (srvproc) == 0)
        return -1;
    //
    // Extract the file name from the input parameter.
    //
    BYTE bType;
    char file[256];
    ULONG ulMaxLen = sizeof (file);
    ULONG ulActualLen;
    BOOL fNull;
    if (srv_paraminfo (srvproc, 1, &bType, &ulMaxLen, &ulActualLen,
        (BYTE*) file, &fNull) == FAIL)
        return -1;
    if (bType != SRVBIGCHAR && bType != SRVBIGVARCHAR)
        return -1;
    file[ulActualLen] = 0;
    //
    // Update the file's time stamp.
    //
    char path[288] = "C:\AspNetSql\";
    lstrcat (path, file);
    HANDLE hFile = CreateFile (path, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
        CloseHandle (hFile);
    return 0;
}

我使用SQL Server 2008 SP3 Dev 64位和VS 2012 Ultimate在Win 7 Pro 64位上运行。这是我所做的:

  1. 从 VS 中的VC++模板创建了一个新Empty Project,并添加了一个空的C++文件。
  2. 将平台更改为x64 Configuration manager
  3. Configuration Properties/General 下将Configuration Type更改为Dynamic library (.dll)
  4. 安装了SQL x64本机客户端,包括获取opends60.lib SQL Server Native Client SDK。我不确定是否真的需要 SDK 组件。
  5. 在链接器选项中添加了C:Program FilesMicrosoft SQL Server90SDKLibx64 Additional library directories。这是安装本机客户端的。
  6. 在链接器选项中添加了opends60.lib Additional dependencies
  7. 编译时没有错误。
  8. 创建了XSP.dll使用的输出目录:C:AspNetSql
  9. 已将XSP.dll复制到步骤 8 中创建的目录。
  10. 使用以下方法安装了扩展存储过程:


    USE master
    EXEC sp_addextendedproc 'xsp_UpdateSignalFile', 'C:AspNetSqlXSP.dll' GRANT EXECUTE ON xsp_UpdateSignalFile TO PUBLIC

  11. 使用master..xsp_UpdateSignalFile 'Quotes.Quotations'执行它,并通过确认文件Quotes.Quotations是在输出目录中创建的来验证它是否正常工作。

如果您有任何问题或想澄清任何步骤,我可以添加屏幕截图或提供更多信息。