#include #include #include #include void initialize_environment(SQLHENV *env, SQLHDBC *dbc); void connect_to_database(SQLHDBC dbc, const char *connection_string); void execute_query(SQLH

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

}