2012-02-09 7 views
0

私はMSSQL Server GUIから呼び出したストアドプロシージャを持っています。結果は正しく返します。しかし、私のC++コードから同じプロシージャを呼び出すと、出力パラメータの結果は得られません。 私はストアドプロシージャを試してみましたが、何もせずに出力を返しましたが、以下のストアドプロシージャは失敗します。ストアドプロシージャの実行中に何か問題が起こっていると思います。 相続人は私のストアドプロシージャ:ここ の編集MSSQLサーバストアドプロシージャは、C++から呼び出されたときに出力パラメータを返さない

IF EXISTS (SELECT name FROM sysobjects 
    WHERE name = 'putFileinFTandJT' AND type = 'P') 
DROP PROCEDURE putFileinFTandJT 
GO 
CREATE PROCEDURE putFileinFTandJT 
/* Put incoming file in File Table & Job Table */ 

/* IN */ @input varchar(max), 
/* IN */ @flName varchar(max), 
/* IN */ @uid INT, 
/* IN */ @jbid INT, 
/* OUT */@t INT OUTPUT, 
/* OUT */@t1 INT OUTPUT 

AS 
DECLARE @orgFileID INT = -1; 
DECLARE @temp1 INT; 
DECLARE @newFileID INT; 
DECLARE @versionCnt INT = 0; 

/* SET autocommit = 0; */ 
EXEC getDirId @input,@temp1 OUTPUT ; 
if @temp1 = -1 
    EXEC putDir @uid,@input,@temp1 OUTPUT; 

select @orgFileID = FileID from FileTable where [email protected] and [email protected] and VersionNumber = 0; 
IF @orgFileID = -1 
BEGIN 
    set @orgFileID = 0; 
    insert into FileTable(FileName,DirID,IsDirectory,UserID,VersionNumber,isduplicate) values(@flName,@temp1,0,@uid,0,0); 
END 
ELSE 
BEGIN 
    select @versionCnt = count(*) from VersionTable where FileID = @orgFileID; 
    insert into FileTable(FileName,DirID,IsDirectory,UserID,VersionNumber,isduplicate) values(@flName,@temp1,0,@uid,@versionCnt + 1,0); 
    SET @versionCnt = @versionCnt + 1; 
END 
select @newFileID = FileID from FileTable where FileName = @flName and DirID = @temp1 and VersionNumber = @versionCnt; 
insert into JobTable values(@jbid,@newFileID); 
commit; 
set @t = @newFileID; 
set @t1 = @orgFileID; 

GO

//は私が任意のアイデアを取得していない午前よう助けてくださいCPPコード

HWND desktopHandle = GetDesktopWindow(); 
SQLCHAR buff[255]={0}; 
int intval1=0,intval2=0,intval3 = 0,intval4,intval5; 
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,      (SQLPOINTER*)SQL_OV_ODBC3, 0); 

    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
     retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); 

    retcode = SQLDriverConnect(hdbc, desktopHandle, (SQLWCHAR*) L"Driver={SQL Server};Server=WIN-E9EO4VT0V8I;Database=connector;UID=sa;PWD=spsoft_123;Trusted_Connection=False;", SQL_NTS, NULL, 0, NULL, 0); 
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 



    retcode = SQLPrepare(hstmt, (SQLWCHAR*)L"{call putFileinFTandJT(?,?,?,?,?,?,?)}" , SQL_NTS); 


    retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 100, 0, szQuote, 0, &cbValue2); 
    retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 50, 0, szQuote2, 0, &cbValue2); 
retcode = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &iuser , 0, &cbValue5); 
retcode = SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_SLONG , SQL_INTEGER, 0, 0, &ibackup , 0, &cbValue5); 

retcode = SQLBindParameter(hstmt, 5, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &intval1, 0, &cbValue6); 
retcode = SQLBindParameter(hstmt, 6, SQL_PARAM_OUTPUT, SQL_C_SLONG , SQL_INTEGER, 0, 0, &intval2, 0, &cbValue7); 
retcode = SQLBindParameter(hstmt, 7, SQL_PARAM_OUTPUT, SQL_C_SLONG , SQL_INTEGER, 0, 0, &intval3, 0, &cbValue8); 
retcode = SQLExecute(hstmt); 
if(retcode==SQL_ERROR) 
{ 
    SQLWCHAR sqlstate[1024]; 
SQLWCHAR message[1024]; 
if(SQL_SUCCESS == SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlstate, NULL, message, 1024, NULL)) 
    std::cout<<"Message: "<<(wchar_t*)message<<"\nSQLSTATE: "<<sqlstate<<std::endl; 
} 

です。 ありがとう

答えて

1

あなたの結果に追加の結果が返されますか?私はどのAPIを使用しているのかはっきりしていませんが、私の経験ではSPコールからの出力パラメータを得るために、最終的なRPC結果の結果カウントをスキップして返された結果を歩くことを意味しました。 (また、set nocount onをSPに入れてみてください)。

+0

私はSQLPrepare、SQLBindParameterおよびSQLExecute APIを使用して、C++でストアドプロシージャを実行しています。 – kunal

+0

プロシージャ内の宣言部分の後にSET NOCOUNT ONを追加しました。それは機能しました。 – kunal

関連する問題