2011-03-17 23 views
6

DBとの接続を試みているW32マシンです。そのために、私は例のプログラムをテスト開始しようとした:ODBCを使用してSQL Server 2008に接続する

#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){ 
    SQLCHAR sqlstate[1024]; 
    SQLCHAR message[1024]; 
    if(SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL)) 
     cout<<"Message: "<<message<<"\nSQLSTATE: "<<sqlstate<<endl; 
} 

int main(){ 

    SQLHANDLE sqlenvhandle; 
    SQLHANDLE sqlconnectionhandle; 
    SQLHANDLE sqlstatementhandle; 
    SQLRETURN retcode; 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLSetEnvAttr(sqlenvhandle,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle)) 
     goto FINISHED; 

    SQLCHAR retconstring[1024]; 
    switch(SQLDriverConnect (sqlconnectionhandle, 
       NULL, 
       (SQLCHAR*)"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=MyDatabase;UID=sa;PWD=Admin-123;", 
       SQL_NTS, 
       retconstring, 
       1024, 
       NULL, 
       SQL_DRIVER_NOPROMPT)){ 
     case SQL_SUCCESS_WITH_INFO: 
      show_error(SQL_HANDLE_DBC, sqlconnectionhandle); 
      break; 
     case SQL_INVALID_HANDLE: 
     case SQL_ERROR: 
      show_error(SQL_HANDLE_DBC, sqlconnectionhandle); 
      goto FINISHED; 
     default: 
      break; 
    } 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle, (SQLCHAR*)"select * from testtable", SQL_NTS)){ 
     show_error(SQL_HANDLE_STMT, sqlstatementhandle); 
     goto FINISHED; 
    } 
    else{ 
     char name[64]; 
     char address[64]; 
     int id; 
     while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){ 
      SQLGetData(sqlstatementhandle, 1, SQL_C_ULONG, &id, 0, NULL); 
      SQLGetData(sqlstatementhandle, 2, SQL_C_CHAR, name, 64, NULL); 
      SQLGetData(sqlstatementhandle, 3, SQL_C_CHAR, address, 64, NULL); 
      cout<<id<<" "<<name<<" "<<address<<endl; 
     } 
    } 

FINISHED: 
    SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle); 
    SQLDisconnect(sqlconnectionhandle); 
    SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle); 
    SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle); 

} 

問題は、例えば、未申告の種類については、コンパイルしようとしたとき、私は多くの問題を得ることです:

'SQLHANDLE' has not been declared 
'SQLHDESC' was not declared in this scope 

私がリンクされましたライブラリlibodbccpp32.alibodbc32.aに既にあります。私は間違っているのですか?私には、順序が代わりにする必要がありますstdafx.hをヘッダーで発見した

+0

このエラーは、sqlhandle/sqlhdescを記述するodbcヘッダーが含まれていないことを示しているようです。私はそれがntodbc.hにあると思う。 – Dan

+0

私はそのヘッダをどこで入手できるか分かりますか? – Filgera

+0

私が使用していたSybase SDK固有のもののようです。ここには、マイクロソフトのリストがあります。 http://msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx。それは実際にはsqltypes.hです。これはMicrosoft sdkのものです。 Visual Studio .NET 2003 \ Vc7 \ PlatformSDK \ IncludeにC:\ Program Files \ Microsoftをインストールした場所です。コンパイルエラーが含まれているので、コンパイルエラーの詳細はありますか?パスはどのように見えますか? – Dan

答えて

1

#include <iostream> 
#include <windows.h> 
#include <sqlext.h> 
#include <sqltypes.h> 
#include <sql.h> 
-1

だけの変更は、次のように宣言を含める:

#include <iostream> 
#include <windows.h> 
#include <sql.h> 
#include <sqltypes.h> 
#include <sqlext.h> 
1

注文ヘッダファイルは問題ではありません。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include 

発見された(先験的):

windows.h 
sqlext.h 
sqltypes.h 
sql.h 

これはあなたのコマンドが認識され、問題なくコンパイルすることで足りるちょうどあなたのプロジェクトは、その性質に含める次のディレクトリが含まれていることを確認。

関連する問題