2011-05-24 1 views
0

Я пытаюсь вызвать определенную пользователем функцию на моем сервере Microsoft Microsoft SQL из консольного приложения, написанного на C++. Я использую ADO для всего этого.Как вызвать определенную пользователем функцию из C++ с использованием 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 [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); 

Ну, это не работает. Отладчик заканчивается на masado15.tli в строке 1580, а VS показывает окно с ошибкой: Необработанное исключение в 0x7c812afb в 35h.exe: исключение Microsoft C++: _com_error в ячейке памяти 0x0012c3f8.

Я не уверен, если синтаксис является правильным, я удивляюсь, как сервер должен знать, из какой таблицы я хочу результаты ....

Любая помощь там? Благодаря

Lumpi

+0

У вас есть ошибка? Если так ... вставьте его сюда. – garnertb

+0

Ошибка: Необработанное исключение в 0x7c812afb в 35h.exe: исключение Microsoft C++: _com_error в ячейке памяти 0x0012c3f8 .. – Lumpi

ответ

0

Вы можете переписать эту функцию в качестве хранимой процедуры. FLOAT может быть возвращен либо как значение RETURN, либо как параметр OUT.

+0

Я пробовал его с помощью хранимой процедуры, также не работает. Я думаю, что проблема в другом месте. Например, правильно ли использовать recordet-> open? Должен ли я сделать (инициализировать) что-нибудь, прежде чем попробовать? – Lumpi

+0

Я знаю, что он должен работать с хранимой процедурой, если текущему пользователю было предоставлено разрешение на выполнение proc. Вы можете переписать как SP или обернуть функцию в SP. Отправьте свой код, где вы пытаетесь вызвать сохраненный процесс, а также любые ошибки. – Tim

+0

Ваша функция не возвращает набор записей. Он возвращает скаляр. – Tim

 Смежные вопросы

  • Нет связанных вопросов^_^