2011-05-24 137 views
0

我試圖從用C++編寫的控制檯應用程序調用我的Microsoft SQL Server上的用戶定義函數。整個事情我都用ADO。如何使用ADO從C++調用用戶定義的函數

我的功能看起來像這樣(和它的作品時,我用它從Management Studio中)

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 [email protected] 

    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

+0

你有錯誤嗎?如果是這樣......將其粘貼在這裏。 – garnertb 2011-05-24 22:17:00

+0

錯誤是:35h.exe中0x7c812afb未處理的異常:Microsoft C++異常:_com_error在內存位置0x0012c3f8 .. – Lumpi 2011-05-25 18:30:25

回答

0

您可以將函數重寫爲存儲過程。 FLOAT可以作爲RETURN值或OUT參數返回。

+0

我試過它與存儲過程,也不起作用。我認爲問題在別的地方。例如使用recordset-> open是否正確?在嘗試之前,我必須做些什麼(初始化)? – Lumpi 2011-05-25 18:33:14

+0

我知道它應該與存儲過程一起工作,如果當前用戶已被授予對proc的執行權限。您可以重寫爲SP或將函數包裝在SP中。將您的代碼發佈到您嘗試調用存儲過程的位置以及任何錯誤。 – Tim 2011-05-25 21:26:15

+0

您的功能不會返回記錄集。它返回一個標量。 – Tim 2011-05-25 21:27:20

相關問題