2011-03-17 50 views
6

Tôi đang sử dụng máy W32 để kết nối với DB. Vì mục đích đó, tôi đã cố gắng bắt đầu thử nghiệm một chương trình ví dụ:Sử dụng ODBC để kết nối với 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); 

} 

Vấn đề là tôi nhận được vấn đề NHIỀU khi cố gắng để biên dịch, liên quan đến các loại không khai báo, ví dụ:

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

tôi đã liên kết với các thư viện libodbccpp32.alibodbc32.a. Tôi đang làm gì sai?

+0

Lỗi này dường như chỉ ra rằng bạn không bao gồm tiêu đề odbc mô tả sqlhandle/sqlhdesc. Tôi nghĩ rằng nó trong ntodbc.h. – Dan

+0

Bạn có bất kỳ ý tưởng nào về việc tôi có thể lấy tiêu đề đó không? – Filgera

+0

Có vẻ như cái đó dành riêng cho Sybase SDK tôi đang sử dụng. Dưới đây là danh sách các microsoft. http://msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx. Nó thực sự là sqltypes.h đó là một sdk microsoft. Đây là nơi tôi đã cài đặt nó C: \ Program Files \ Microsoft Visual Studio.NET 2003 \ Vc7 \ PlatformSDK \ Include. Có bất kỳ chi tiết nào khác trong các lỗi biên dịch của bạn vì bạn đã bao gồm lỗi đó không? Bạn bao gồm đường dẫn như thế nào? – Dan

Trả lời

1

Tôi đã tìm thấy với tiêu đề stdafx.h đó bao gồm trật tự nên thay vì:

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

chỉ cần thay đổi bao gồm tờ khai như thế này: tập tin tiêu đề

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

đặt hàng không quan trọng. Chỉ cần đảm bảo rằng dự án của bạn chứa trong thuộc tính của nó như sau bao gồm thư mục:

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

nơi được tìm thấy (tiên):

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

này cũng đủ trong việc đưa ra các lệnh của bạn được công nhận và biên dịch mà không cần bất kỳ vấn đề .

Các vấn đề liên quan