#include
#include
#include
#include
void initialize_environment(SQLHENV *env, SQLHDBC *dbc);
void connect_to_database(SQLHDBC dbc, const char *connection_string);
void execute_query(SQLHDBC dbc, const char *query);
void process_results(SQLHSTMT stmt);
void close_connection(SQLHENV env, SQLHDBC dbc);
int main() {
SQLHENV env;
SQLHDBC dbc;
const char *connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_name;DATABASE=db_name;UID=user;PWD=password;";
const char *query = "SELECT * FROM your_table";
initialize_environment(&env, &dbc);
connect_to_database(dbc, connection_string);
execute_query(dbc, query);
close_connection(env, dbc);
return 0;
}
void initialize_environment(SQLHENV *env, SQLHDBC *dbc) {
SQLRETURN ret;
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, env);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error allocating environment handlen");
exit(EXIT_FAILURE);
}
ret = SQLSetEnvAttr(*env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error setting ODBC versionn");
SQLFreeHandle(SQL_HANDLE_ENV, *env);
exit(EXIT_FAILURE);
}
ret = SQLAllocHandle(SQL_HANDLE_DBC, *env, dbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error allocating connection handlen");
SQLFreeHandle(SQL_HANDLE_ENV, *env);
exit(EXIT_FAILURE);
}
}
void connect_to_database(SQLHDBC dbc, const char *connection_string) {
SQLRETURN ret;
ret = SQLDriverConnect(dbc, NULL, (SQLCHAR *)connection_string, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error connecting to the databasen");
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
exit(EXIT_FAILURE);
}
}
void execute_query(SQLHDBC dbc, const char *query) {
SQLHSTMT stmt;
SQLRETURN ret;
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error allocating statement handlen");
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
exit(EXIT_FAILURE);
}
ret = SQLExecDirect(stmt, (SQLCHAR *)query, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error executing queryn");
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
exit(EXIT_FAILURE);
}
process_results(stmt);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
void process_results(SQLHSTMT stmt) {
SQLRETURN ret;
SQLCHAR column_data[256];
SQLLEN indicator;
ret = SQLBindCol(stmt, 1, SQL_C_CHAR, column_data, sizeof(column_data), &indicator);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
fprintf(stderr, "Error binding columnn");
return;
}
while ((ret = SQLFetch(stmt)) != SQL_NO_DATA) {
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
printf("Column data: %sn", column_data);
} else {
fprintf(stderr, "Error fetching datan");
break;
}
}
}
void close_connection(SQLHENV env, SQLHDBC dbc) {
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
}