2017-03-06 189 views
0

我正在嘗試使用數據庫編寫C++程序 - IBM DB2 Express-C。另外,我使用Visual Studio 2015.通過IBM OLE DB Provider for DB2,我的Visual Studio成功連接到DB2。我可以看到表和一切OK:Visual Studio C++連接到DB2

enter image description here

然後創建新的C++程序中,我成功地連接幾個頭文件,一些從他們身上我在DB2目錄中,例如sqlcli1.h

#pragma once 

#include "targetver.h" 

#include <stdio.h> 
#include <tchar.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sqlcli1.h> 
#include <windows.h> 

以下是主程序的代碼。其中我正嘗試連接到成功連接到Visual Studio的數據庫。

#include "stdafx.h" 


int main() 
{ 
    SQLHENV henv; 
    SQLHDBC hdbc; 
    SQLHSTMT hstmt; 
    SQLRETURN retcode; 

    SQLCHAR * OutConnStr = (SQLCHAR *)malloc(255); 
    SQLSMALLINT * OutConnStrLen = (SQLSMALLINT *)malloc(255); 

    // Allocate environment handle 
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 

    // Set the ODBC version environment attribute 
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 


     // Allocate connection handle 
     if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 
      retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 




       // Connect to data source 
      retcode = SQLConnect(hdbc, (SQLWCHAR*) "DATABASE=SAMPLE;HOSTNAME=localhost", SQL_NTS, (SQLWCHAR*) "db2admin", SQL_NTS, (SQLWCHAR*) "password", SQL_NTS); 
       if (retcode != SQL_SUCCESS) { 
        printf(">--- Error while connecting to database:"); 
        printf("SQLConnect: %d\n", retcode); 
       } 
       // Allocate statement handle 
       if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
        printf("\nAllocate Connection handle successfully."); 
        // Process data 
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 
         SQLFreeHandle(SQL_HANDLE_STMT, hstmt); 
        } 

        SQLDisconnect(hdbc); 
       } 

       SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 

     } 
     SQLFreeHandle(SQL_HANDLE_ENV, henv); 
    } 
    system("pause"); 
    return 0; 
} 

在編譯時沒有錯誤,但無法連接到數據庫。當程序執行到達塊時。

// Connect to data source 
      retcode = SQLConnect(hdbc, (SQLWCHAR*) "DATABASE=SAMPLE;HOSTNAME=localhost", SQL_NTS, (SQLWCHAR*) "db2admin", SQL_NTS, (SQLWCHAR*) "password", SQL_NTS); 
       if (retcode != SQL_SUCCESS) { 
        printf(">--- Error while connecting to database:"); 
        printf("SQLConnect: %d\n", retcode); 
       } 

我看到> ---錯誤,同時連接到數據庫:的SQLConnect:-2 這是什麼意思?我在做什麼是錯誤的?我也試過了:

retcode = SQLConnect(hdbc, (SQLWCHAR*) "SAMPLE", SQL_NTS, (SQLWCHAR*) "db2admin", SQL_NTS, (SQLWCHAR*) "password", SQL_NTS); 

但它也行不通。可能是第二個參數應該看起來像其他方式?

改變 我想利用這個功能SQLGetDiagRec的我創建了一些變量

SQLWCHAR  SqlState[6], SQLStmt[100], Msg[SQL_MAX_MESSAGE_LENGTH]; 
    SQLINTEGER NativeError; 
    SQLSMALLINT i, MsgLen; 
    SQLRETURN  rc1, rc2; 

我也改變我的連接塊

// Connect to data source 
      retcode = SQLConnect(hdbc, (SQLWCHAR*) "SAMPLE", SQL_NTS, (SQLWCHAR*) "db2admin", SQL_NTS, (SQLWCHAR*) "password", SQL_NTS); 
       if (retcode != SQL_SUCCESS) { 
        printf(">--- Error while connecting to database:"); 
        printf("SQLConnect: %d\n", retcode); 

        if ((retcode == SQL_SUCCESS_WITH_INFO) || (retcode == SQL_ERROR)) { 
         // Get the status records. 
         i = 1; 
         while ((rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, hdbc, i, SqlState, &NativeError, 
          Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) { 
          cout << SqlState; 
          cout << i; 
          cout << NativeError; 
          cout << Msg; 

          i++; 
         } 
        } 
       } 

但一切都沒有改變。有人有什麼主意嗎?

回答

0

如果對任何CLI功能的調用不返回SQL_SUCCESS,則錯誤處理應使用SQLGetDiagRec()來獲取警告或錯誤的詳細信息。

文檔:SQLGetDiagRec

+0

我試了一下**改變的問題**,但功能'SQLGetDiagRec的()'不打印任何東西。 – Vladimir