Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLExecDirect结果-1在C中表示24000_C++_Odbc - Fatal编程技术网

C++ SQLExecDirect结果-1在C中表示24000

C++ SQLExecDirect结果-1在C中表示24000,c++,odbc,C++,Odbc,你好,我正在学习C和ODBC 调用SQLExecDirect函数时出错。 请帮帮我 这是密码 #include <Windows.h> #include <sql.h> #include <sqlext.h> int main( void ) { //DB connect example SQLRETURN nResult = 0; SQLHANDLE handleEnv = 0; nResult = SQ

你好,我正在学习C和ODBC 调用SQLExecDirect函数时出错。 请帮帮我 这是密码

#include <Windows.h>
#include <sql.h>
#include <sqlext.h>

int main( void )
{
    //DB connect example
    SQLRETURN   nResult     = 0;
    SQLHANDLE   handleEnv   = 0;
    nResult = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, ( SQLHANDLE* )&handleEnv );
    //nResult = SQLSetEnvAttr( handleEnv, SQL_ATTR_ODBC_VERSION, ( SQLPOINTER )SQL_OV_ODBC2, SQL_IS_INTEGER );
    nResult = SQLSetEnvAttr( handleEnv, SQL_ATTR_ODBC_VERSION, ( SQLPOINTER )SQL_OV_ODBC3, SQL_IS_INTEGER );
    nResult = SQLSetEnvAttr( handleEnv, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER)SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER);

    SQLHANDLE   handleDBC   = 0;
    nResult = SQLAllocHandle( SQL_HANDLE_DBC, handleEnv, ( SQLHANDLE* )&handleDBC );

    SQLCHAR     strConnect[ 256 ]       = "DSN=MY TEST DB; UID=TESTsa; PWD=TESTpw";
    SQLCHAR     strConnectOut[ 1024 ]   = {0};
    SQLSMALLINT nNumOut                 = 0;
    nResult = SQLDriverConnect( handleDBC, NULL, ( SQLCHAR* )strConnect, SQL_NTS, ( SQLCHAR* )strConnectOut, sizeof(strConnectOut),
                                &nNumOut, SQL_DRIVER_NOPROMPT );

    SQLHSTMT    handleStatement = 0;
    //nResult = ::SQLAllocStmt( handleDBC, &handleStatement );
    nResult = SQLAllocHandle( SQL_HANDLE_STMT, handleDBC, ( SQLHANDLE* )&handleStatement );

    SQLHSTMT    hstmt       = handleStatement;
    int         sqlResultOutput = 0;

    SQLINTEGER  cbValue     = 0;
    nResult = SQLBindParameter( hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG,    SQL_INTEGER,    0, 0, &sqlResultOutput,  0, &cbValue );

    //here is the problem
    nResult = SQLExecDirect( hstmt, (SQLTCHAR*) "{CALL my_TEST_SP(?)}", SQL_NTS );
    //nResult Value is -1 and SQL State is 24000

    return 0;
}
每次通话结果都很好。返回SQL_SUCCESS,但只有一个 SQLExecDirect函数为return-1,SQLState为24000

存储过程是这样简单的

CREATE PROCEDURE my_TEST_SP
 @retValue int = 0 output
AS
BEGIN
   SET NOCOUNT ON

   SET @retValue = 0

   SELECT myTestCol
   FROM tTestTable

   IF @@ERROR <> 0
   BEGIN
     SET @retValue = -1
   END
END
我的操作系统是windows7。 使用visual studio 2010 sp1、sqlserver 2012


我想念什么?请告诉我,祝您愉快:

主要区别似乎在于odbc驱动程序版本。我的版本是2014.120.2000.08。我不认为这是由于不同的visual studio版本造成的——我认为它们都在后台使用相同的odbc32.lib

以下代码适用于我:我更改了存储过程以返回非0的内容,以验证我是否可以实际读取返回的数据:

 @retValue int = 0 output
AS
BEGIN
   SET NOCOUNT ON

   SET @retValue = 3499

   SELECT myTestCol
   FROM tTestTable

   IF @@ERROR <> 0
   BEGIN
     SET @retValue = -1
   END
END
如果我运行此示例应用程序,我将获得预期的输出:

Value of sqlResultOutput is: 3499

因此,我建议您尝试使用最新的SQL Server ODBC驱动程序。我想这是这里的下载:

可能是重复的对不起,我查过了,但我不明白。但感谢您的评论,我可以运行这个稍微修改的代码连接字符串,在Windows 7上使用“用于sql server的ODBC驱动程序11”和Visual Studio 2013对sql server 2014使用SQLWCHAR很好。我的操作系统是Windows 7 64位,syswow64中的ODBC驱动程序是sql server版本6.01.7601.1744,system32文件夹中的SQL Server本机客户端11.1版本2011.110.2100.60目录与这两个版本相同。无论如何,我将更改代码并重试,方法是使用SQLWCHARi将SQLCHAR更改为SQLWCHAR,将L添加到转发字符串,然后使用DriverConnectionW,ExecDirectW所以retryd buy仍然是SQLExecDirectW是return-1另一个函数return zeroSQL_SUCCESS我想可能是它的visial studio 2010问题,因为我只是通过创建新的解决方案和项目调试模式运行代码,但结果相同谢谢你的回答我只是下载msodbcsql.msi并通过链接安装它,但ODBC驱动程序版本是未更改奇怪它仍然开始于2011而不是2014即使我卸载了ODBC驱动程序并重新使用msodbcsql.msi文件我会继续尝试安装ODBC驱动程序版本2014i找不到2014版本的ODBC驱动程序。只有我能找到我不知道为什么。可能我需要VS2013或SQLserver2014,这让我很难过。但感谢您的回答。是的,您可以尝试使用Sql Server 2014。我一直在使用SQL Server 2014 Express Edition进行测试,可以从microsoft免费下载。希望这有帮助,祝你好运。今天我将SQL Server Management 2014 ExpressEdition设置为运行问题代码PC而不是数据库PC,并检查是否安装了SQL Server 2014.120.2000.08的ODBC驱动程序11。所以我再次尝试。但我还是得到了同样的结果。只有SQLExecDirect函数返回-1可能我需要DBMS pc的ODBC驱动程序更新,但它的共享pc,而不仅仅是我使用的。所以,我没试过,谢谢你,祝你今天愉快
Microsoft ODBC Driver for SQL Server Version 12.00.2000

Data Source Name: test
Data Source Description: 
Server: .\SQLSERVERINSTANCE
Use Integrated Security: Yes
Database: Test
Language: (Default)
Data Encryption: No
Trust Server Certificate: No
Multiple Active Result Sets(MARS): No
Mirror Server: 
Translate Character Data: Yes
Log Long Running Queries: No
Log Driver Statistics: No
Use Regional Settings: No
Use ANSI Quoted Identifiers: Yes
Use ANSI Null, Paddings and Warnings: Yes
Value of sqlResultOutput is: 3499