2017-02-07 13 views
0

Я использую базу данных ODBC sql server 2014, и моя программа написана в visual studio C++. Я хочу интегрировать свою программу на C++ с базой данных sql server 2014, чтобы выполнить некоторые простые действия вставки и извлечения.SQL ODBC - ошибка SQL

Я написал простой тест, чтобы проверить соединение между сервером sql и моей программой. Однако выход моей программы показывает, что есть ошибка sql. Реткод возвращает -1.

пожалуйста совет.

выход моей программы показан ниже enter image description here

мой код выглядит следующим образом:

#include "stdafx.h" 

#include <string> 
#include <iostream> 
#include <sstream> 

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

RETCODE retrieveRc; 
HENV retrieveHenv; 
HDBC retrieveHdbc; 
HSTMT retrieveHstmt; 

using namespace std; 

void RetrieveConnectToDatabase(); 
void DisplayResults(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    RetrieveConnectToDatabase(); 
    cin.get(); 
    return 0; 
} 

void RetrieveConnectToDatabase() 
{ 

    cout << "Attempting Database Connection for Retrieving " << endl; 

    //Set Environment Handle 
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &retrieveHenv); 

    //Set ODBC Driver Version 
    SQLSetEnvAttr(retrieveHenv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 

    //Set Connection Handle 
    SQLAllocHandle(SQL_HANDLE_DBC, retrieveHenv, &retrieveHdbc); 

    //Connect to Database 
    retrieveRc = SQLConnect(retrieveHdbc, L"database", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS); 

    SQLAllocHandle(SQL_HANDLE_STMT, retrieveHdbc, &retrieveHstmt); 

    if ((retrieveRc != SQL_SUCCESS) && (retrieveRc != SQL_SUCCESS_WITH_INFO)) 
    { 
     cout << "Cannot open database -- make sure ODBC is confugured properly." << endl; 
     SQLFreeConnect(retrieveHdbc); 
     SQLFreeEnv(retrieveHenv); 
     cout << "Press ENTER to continue." << endl; 
    } 

    else 
    { 
     cout << "Connected -- ODBC is confugured properly." << endl; 
     string queryDatabase; 
     stringstream usernameQueryStr; 

     usernameQueryStr << "SELECT * FROM [trackmanagementdatabase].[dbo].[user];"; 
     queryDatabase = usernameQueryStr.str(); 
     wchar_t* p = new wchar_t[1000]; 

     for (string::size_type i = 0; i < usernameQueryStr.str().size(); i++) 
     { 
      p[i] = queryDatabase[i]; 
     } 

     if (sizeof(queryDatabase) != 0) 
     { 
      RETCODE retrieveRetCode; 
      SQLSMALLINT sNumResults; 

      // Execute the query 
      //wzsInput contains sql statement 

      retrieveRetCode = SQLExecDirect(retrieveHstmt, p, SQL_NTS); 
      cout << "retrieveRetCode: " << retrieveRetCode << endl; 

      switch (retrieveRetCode) 
      { 
      case SQL_SUCCESS_WITH_INFO: 
      { 
      } 
      case SQL_SUCCESS: 
      { 

       // If this is a row-returning query, display 
       // results 
       SQLNumResultCols(retrieveHstmt, &sNumResults); 

       //display result 
       DisplayResults(); 

       if (sNumResults > 0) 
       { 
        DisplayResults(); 
       } 
       else 
       { 
        cout << "SQL Success else" << endl; 
        SQLLEN cRowCount; 
        SQLRowCount(retrieveHstmt, &cRowCount); 
        cout << "cRowCount: " << cRowCount << endl; 

        if (cRowCount >= 0) 
        { 
         wprintf(L"%Id %s affected\n", 
          cRowCount, 
          cRowCount == 1 ? L"row" : L"rows"); 
        } 
       } 
       break; 
      } 

      case SQL_ERROR: 
      { 
       break; 
      } 

      default: 
       fwprintf(stderr, L"Unexpected return code %hd!\n", retrieveRetCode); 
       cout << "it came in here default" << endl; 
      } 
     } 
    } 
} 

void DisplayResults() 
{ 
} 

ответ

0

Вы должны получить государственную и описание ошибки SQLError. Скорее всего, вы можете решить эту проблему.