为什么我的C ++扩展存储过程没有写入控制台?

时间:2013-05-03 15:19:15

标签: c++ sql-server tsql

我正在尝试使用C ++ dll编写简单的扩展存储过程来将一些文本写入控制台。我已经用下一个方式做到了:

  1. 使用c ++创建一个dll(查看下面的.cpp和.h文件)
  2. 从win32控制台应用程序测试了这个dll(全部用作tic tak脚趾)
  3. 将dll文件移入sql server bin目录
  4. 从管理工作室
  5. 执行sp_addextendedproc 'xp_test','xp_test.dll'
  6. 执行扩展过程(exec xp_test
  7. 当我执行了最后一步时,会出现一个提示,通知我查询是执行的,但是没有任何控制台窗口有预期的hello world提示符。我的错在哪里?

    //test.h file
    #ifdef MYLIBAPI
    #else
    #define MYLIBAPI extern "C" __declspec(dllimport)
    #endif
    #include <srv.h>
    MYLIBAPI SRVRETCODE xp_test(SRV_PROC *srvproc);
    
    // xp_test.cpp : Defines the exported functions for the DLL application.
    #include "stdafx.h"
    #define MYLIBAPI extern "C" __declspec(dllexport)
    #include "test.h"
    #include <iostream>
    using namespace std;
    
    SRVRETCODE xp_test(SRV_PROC *srvproc){
        cout << "Hello world" << endl;
        cin.get();
        return 0;
    }
    

    我也尝试使用Console API,但这也不允许写入控制台

    SRVRETCODE xp_test(SRV_PROC *srvproc){
        AllocConsole();
        HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
        DWORD writtenCount;
        LPCTSTR msg = L"Hello world\n";
        WriteConsole(out, msg, lstrlen(msg), &writtenCount, NULL);
        Sleep(5000);
        return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

虽然我对C ++一无所知,但没有控制台,因为SQL Server通常作为没有交互式会话或桌面的服务运行,因此不清楚您希望输出的位置。

作为文档explains,扩展存储过程使用Extended Stored Procedure API将结果集返回给服务器,但您的代码似乎没有这样做。

幸运的是,微软实际上提供了自己的Hello World example;你有没有看过它?

最后,请注意MSDN中的warnings扩展存储过程现已弃用,将从SQL Server中删除,不应用于新开发。