如何使用ADO从c ++调用用户定义的函数

时间:2011-05-24 18:22:18

标签: c++ sql-server-2008 ado

我正在尝试从用c ++编写的控制台应用程序调用我的Microsoft SQL服务器上的用户定义函数。我使用ADO来完成整个事情。

我的功能看起来像这样(当我在管理工作室使用它时它可以工作)

CREATE FUNCTION [dbo].[funcHowOftenDidHeWin] 
(
    @playername as varchar(15)
    @percentWon float OUTPUT
)
RETURNS float
AS
BEGIN
    DECLARE @wintimes float
    DECLARE @participated float
    DECLARE @percentWon float

    SELECT @wintimes = COUNT(DidWin)
    FROM PPLP0p02
    WHERE DidWin = 1 AND Playername=@playername

    SELECT @participated = COUNT(DidWin)
    FROM PPLP0p02
    WHERE Playername = @playername

    IF @wintimes >0
        SET @percentWon = @wintimes  / @participated  *100
    IF @wintimes = 0
        SET @percentWon = 0

    RETURN @percentWon
END
GO

从我的程序中,我尝试按如下方式调用它:

USEADO::_ConnectionPtr connection;                              
USEADO::_RecordsetPtr recordset;                                //create a "

    if(FAILED(hr = CoInitialize(NULL)))                         //
    {   return hr;} 

   if(FAILED(hr = connection.CreateInstance(__uuidof(USEADO::Connection))))
    {  return hr;}

   if(FAILED(hr = recordset.CreateInstance(__uuidof(USEADO::Recordset))))
    {   return hr;}

connection->CursorLocation = USEADO::adUseServer; 


    try
   { 
    connection->Open(L"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=Test;Initial  Catalog=Haufen;Data Source=Wolle\\SQLEXPRESS", L"Test", L"Test", USEADO::adConnectUnspecified);    
   }
    catch(...)  {std::cout << "!!! connection->Open(ConnectionString   FAILED !!!" << std::endl;        }



//This works
recordset->Open("SELECT playername FROM Summary WHERE playersatbegin=5",connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);


//This not
recordset->Open("SELECT dbo.funcHowOftenDidHeWin('Lumpi') ",connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

嗯,它不起作用。调试器在第1580行的masado15.tli中结束,VS显示一个错误的窗口:35h.exe中0x7c812afb处的未处理异常:Microsoft C ++异常:内存位置为0x0012c3f8的_com_error。

我不确定语法是否正确,我想知道服务器应该知道哪个表我想要结果....

那里有任何帮助吗?感谢

Lumpi

1 个答案:

答案 0 :(得分:0)

您可以将该函数重写为存储过程。 FLOAT可以作为RETURN值或OUT参数返回。