2017-03-06 6 views
0

データベースを使用してC++プログラムを作成しようとしています - IBM DB2 Express-C。また、Visual Studio 2015を使用しています.IBM OLE DB Provider for DB2を使用すると、Visual StudioがDB2に正常に接続されました。私は私のDB2ディレクトリにあり、そこからいくつかの、例えばsqlcli1.hVisual Studio C++がDB2に接続

、私は成功し、いくつかのヘッダファイルを接続し、

enter image description here

その後、私は新しいC++プログラムを作成しました:私はテーブルと、すべてOKが見ることができます

#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); 

しかし、それも動作しません。 2番目の議論は他の何かのように見えますか? を変更

私はまた

// 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++; 
         } 
        } 
       } 

私の接続ブロックを変更しかし、何も変わっていないいくつかの変数に

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

を作成してSQLGetDiagRecこの機能使用を試してみました。誰にも分かりますか?

答えて

0

CLI関数の呼び出しでSQL_SUCCESSが返されない場合は、エラー処理にはSQLGetDiagRec()を使用して、警告またはエラーの詳細を取得する必要があります。

ドキュメント:SQLGetDiagRec

+0

私は**それは**質問を変更しようとしたが、関数 'SQLGetDiagRecの()'は何も印刷されません。 – Vladimir

関連する問題