2016-03-06 144 views
1

我刚刚设法建立了从Visual Studio C++应用程序到我的SQL Server的连接,但是不能为我的生活做我的声明,因为他们应该。在Visual Studio C++中执行简单的SQL查询时出错

我有一些在SQL Server中创建大中型脚本的经验,但由于某些原因,下面的代码只是给我错误,而不是让我获取数据并通过它工作。

正如我所提到的,我对连接没有任何问题,因为我在检查连接状态时没有发现任何错误。

这里是我的代码:

#include "stdafx.h" 
#include <iostream> 
#include <windows.h> 
#include <sqltypes.h> 
#include <sql.h> 
#include <sqlext.h> 
using namespace std; 

void show_error(unsigned int handletype, const SQLHANDLE& handle) 
{ 
    SQLWCHAR sqlstate[1024]; 
    SQLWCHAR message[1024]; 
    if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL)) 
     cout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl; 
} 

int main() { 

    SQLHENV env; 
    SQLHDBC dbc; 
    SQLHSTMT stmt; 
    SQLRETURN ret; 
    SQLSMALLINT columns; 
    int row = 0; 

    /* Allocate an environment handle */ 
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); 
    /* We want ODBC 3 support */ 
    SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); 
    /* Allocate a connection handle */ 
    SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); 

    /* Connect to the DSN */ 
    SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};SERVER=DESKTOP-L5OT4OH\\SQLEXPRESS;DATABASE=Easier;UID=geo;PWD=password123;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); 

    /* Check for success */ 
    if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt)) 
    { 
     std::cout << "Failed to connect"; 
    } 
    if (SQL_SUCCESS != SQLExecDirect(stmt, (SQLWCHAR*)" USE Easier select personid from dbo.TPERSON", SQL_NTS)) { 
     show_error(SQL_HANDLE_STMT, stmt); 
    } 
    else { 
     int id; 
     while (SQLFetch(stmt) == SQL_SUCCESS) { 
      SQLGetData(stmt, 1, SQL_C_ULONG, &id, 0, NULL); 
      cout << id << endl; 
     } 
    } 

    return 0; 
} 

据我了解我的代码

  • 设置通过ODBC到我的本地SQL Server数据库的连接
  • 检查所述连接
  • (?)
  • 尝试创建并执行非常基本的SQL查询(在我的SQL管理器中工作,在任何人询问之前)。
  • 遍历获取的数据以解析数据并将其发送到cout。

请问你们看看我可能犯了什么样的错误?

我不会问这样一个简单的问题,如果有任何关于如何使用C++应用程序设置SQL服务器的可理解指南,但我已经完全无法找到它。

编辑:

show_error提供了以下错误信息:

消息:0018ED9C

SQLSTATE:0018F5A4

+0

你会得到什么错误? –

+0

在编辑中添加了错误消息 – geostocker

+0

在'show_error'中使用'wcout'来代替'cout'。这样您可以打印实际的消息文本,而不是存储它的地址(这根本没有帮助)。 –

回答

0

这似乎是SQLExecDirect的不喜欢事实上,我明确表示它使用“USE Easier”,因为它已经在本周宣布e连接字符串。