MSSQL服务器存储过程在从c++调用时不返回输出参数
MSSQL server Stored procedure not returning output parameters when called from c++
我有一个存储过程,当我从MSSQL Server GUI调用时,它会正确返回结果。但是,当我从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 DirID=@temp1 and FileName=@flName 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;
转到
//编辑这是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;
}
请帮忙,因为我没有任何想法。感谢
您的结果中是否返回了其他结果计数?我不确定您使用的是哪种API,但根据我的经验,从SP调用中获取输出参数通常意味着遍历返回的结果,跳过最终RPC结果的结果计数。(您也可以尝试将set nocount on
放入SP中)。
相关文章:
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- C++输出参数与返回值
- cpp 返回具有相同输入的不同输出
- 显示C++输出而不返回值
- 简单函数并不总是返回预期的输出
- 输出返回编号。等于输入字符串的单词的字符串数
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 为什么 boost::locale::to_title 不返回预期的输出?
- 在函数中连接两个字符,并在 C++ 中返回输出
- 为什么我的数独程序不返回输出?
- 如何将变量传递给父,但也返回输出值?(C )
- C++字符返回输出符号
- MSSQL服务器存储过程在从c++调用时不返回输出参数
- c++中的字符串返回类型不返回输出
- 从文本文件返回输出的函数
- 在vc++中使用CreateProcess和CreatePipe来执行进程并以字符串形式返回输出
- 从bash脚本返回输出到调用c++函数
- 如何更改用户输入字符,例如。"abcDEF"并返回输出"222333"