2011-05-24 3 views
0

Microsoft SQL Server上のユーザー定義関数を、C++で記述されたコンソールアプリケーションから呼び出そうとしています。私はADOを全面的に使用しています。私のプログラムからADOを使用してC++からユーザー定義関数を呼び出す方法

My機能は、次のようになります(と私は管理スタジオ内からそれを使用する場合、それは動作します)

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で未処理の例外:メモリ場所0x0012c3f8のMicrosoft C++例外:_com_error私は、構文が正しいかどうかはわからない

は、私はそこに

すべてのヘルプ....サーバーは、私は結果を表示したいテーブルから知っていることになっているか疑問?ありがとう

ルンピ

+0

エラーが表示されますか?もしそうなら...ここに貼り付けてください。 – garnertb

+0

エラーは次のとおりです。35h.exeの0x7c812afbで未処理例外:Microsoft C++例外:メモリ位置0x0012c3f8の_com_error .. – Lumpi

答えて

0

この関数はストアドプロシージャとして書き直すことができます。 FLOATは、RETURN値またはOUTパラメーターのいずれかとして戻すことができます。

+0

ストアドプロシージャで試してみましたが、どちらも動作しませんでした。私は問題がどこか他の場所だと思う。たとえば、レコードセット - >オープンを使用するのは正しいですか?私はそれを試す前に何か(初期化)しなければならないのですか? – Lumpi

+0

私は、現在のユーザにprocの実行権限が与えられている場合、ストアドプロシージャで動作するはずです。 SPとして書き直すか、またはSPで関数をラップすることができます。ストアドプロシージャを呼び出そうとするコードを、エラーとともに投稿してください。 – Tim

+0

関数はレコードセットを返しません。スカラーを返します。 – Tim

関連する問題