C++ SQLExecDirect结果-1在C中表示24000
你好,我正在学习C和ODBC 调用SQLExecDirect函数时出错。 请帮帮我 这是密码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
#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