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.a
và libodbc32.a
. Tôi đang làm gì sai?
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
Bạn có bất kỳ ý tưởng nào về việc tôi có thể lấy tiêu đề đó không? – Filgera
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