C언어 예제 #10 (데이터베이스)
C 언어는 데이터베이스에 직접 접근하여 데이터를 조작할 수 없습니다. 따라서 C 언어에서 데이터베이스를 다루기 위해서는 데이터베이스와 연동하여 데이터를 주고 받아야 합니다.
API(Application Programming Interface)
일반적으로 데이터베이스와 연동하기 위해서는 데이터베이스 API(Application Programming Interface)를 사용합니다. 데이터베이스 API는 데이터베이스에서 데이터를 읽고 쓰는 등의 작업을 수행할 수 있도록 C 언어에서 제공하는 라이브러리입니다.
- ODBC(Open Database Connectivity)
가장 많이 사용되는 데이터베이스 API 중 하나는 ODBC(Open Database Connectivity)입니다. ODBC는 데이터베이스에 독립적인 인터페이스를 제공하여 여러 가지 데이터베이스 시스템을 동일하게 다룰 수 있도록 합니다.
ODBC를 사용하기 위해서는 먼저 ODBC 드라이버를 설치해야 합니다. ODBC 드라이버는 데이터베이스 시스템별로 제공됩니다. 예를 들어, MySQL 데이터베이스를 사용하기 위해서는 MySQL ODBC 드라이버를 설치해야 합니다.
ODBC를 사용하여 데이터베이스와 연동하기 위해서는 다음과 같은 과정이 필요합니다.
- ODBC 드라이버 로드: ODBC 드라이버를 로드하여 데이터베이스와 연결합니다.
- DSN 설정: DSN(Data Source Name)을 설정하여 데이터베이스에 대한 정보를 제공합니다.
- SQL 문 실행: SQL(Structured Query Language) 문을 사용하여 데이터베이스에서 데이터를 읽거나 쓸 수 있습니다.
- ODBC 드라이버 언로드: 작업이 완료되면 ODBC 드라이버를 언로드하여 연결을 종료합니다.
다음은 ODBC를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 예제 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLCHAR *dsn = "mydsn";
SQLCHAR *user = "root";
SQLCHAR *password = "mypassword";
SQLCHAR *query = "SELECT * FROM mytable";
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLConnect(dbc, dsn, SQL_NTS, user, SQL_NTS, password, SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
SQLExecDirect(stmt, query, SQL_NTS);
int id;
char name[50];
int age;
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_SLONG, &id, 0, NULL);
- MySQL API
- MySQL은 가장 인기 있는 관계형 데이터베이스 중 하나이며, C/C++ 개발자를 위한 MySQL API가 있습니다. MySQL API는 MySQL 서버와의 상호작용을 위한 라이브러리로, MySQL 서버와 클라이언트 간의 통신을 담당합니다. MySQL API를 사용하면 C/C++ 프로그램에서 MySQL 서버에 연결하고 데이터베이스 쿼리를 실행할 수 있습니다.
아래는 MySQL API를 사용하여 데이터베이스 연결을 수행하는 간단한 예제 코드입니다.
#include <mysql/mysql.h>
int main() {
MYSQL *conn;
// MySQL 서버에 연결
conn = mysql_init(NULL);
if (conn == NULL) {
printf("MySQL 연결 오류: %s\n", mysql_error(conn));
exit(1);
}
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {
printf("MySQL 연결 오류: %s\n", mysql_error(conn));
exit(1);
}
// MySQL 서버와의 연결 종료
mysql_close(conn);
return 0;
}
- PostgreSQL API
- ostgreSQL은 다른 인기 있는 오픈 소스 데이터베이스로, C/C++ 개발자를 위한 libpq API가 있습니다. libpq는 PostgreSQL 데이터베이스 서버와 상호작용하기 위한 라이브러리로, PostgreSQL 서버와 클라이언트 간의 통신을 담당합니다. libpq를 사용하면 C/C++ 프로그램에서 PostgreSQL 서버에 연결하고 데이터베이스 쿼리를 실행할 수 있습니다.
아래는 libpq를 사용하여 데이터베이스 연결을 수행하는 간단한 예제 코드입니다.
#include <libpq-fe.h>
int main() {
PGconn *conn;
// PostgreSQL 서버에 연결
conn = PQconnectdb("host=localhost port=5432 dbname=database user=user password=password");
if (PQstatus(conn) != CONNECTION_OK) {
printf("PostgreSQL 연결 오류: %s\n", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
// PostgreSQL 서버와의 연결 종료
PQfinish(conn);
return 0;
}
- SQLite API
SQLite은 경량화된 관계형 데이터베이스로, C/C++ 개발자를 위한 SQLite API가 있습니다. SQLite API는 SQLite 데이터베이스 파일과 상호작용하기 위한 라이브러리로, SQLite 데이터베이스 파일에서 데이터를 읽거나 쓸 수 있습니다.
아래는 SQLite API를 사용하여 데이터베이스 연결을 수행하는 간단한 예제 코드입니다
#include <stdio.h>
#include <sqlite3.h> // SQLite3 라이브러리를 사용하기 위한 헤더 파일
int main(int argc, char* argv[])
{
sqlite3 *db; // SQLite3 데이터베이스를 다루기 위한 객체
char *err_msg = 0; // SQLite3 라이브러리에서 반환되는 오류 메시지를 저장하기 위한 변수
int rc = sqlite3_open("test.db", &db); // "test.db" 파일을 연결하고 데이터베이스 객체에 대한 포인터를 반환
if (rc != SQLITE_OK) { // 연결 실패시 오류 메시지 출력
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db); // 데이터베이스 연결 닫기
return 1;
}
printf("Database connected successfully!\n");
sqlite3_close(db); // 데이터베이스 연결 닫기
return 0;
}
위 코드에서 sqlite3_open 함수를 사용하여 "test.db" 파일을 연결하고 데이터베이스 객체에 대한 포인터를 반환합니다. 연결에 실패한 경우에는 sqlite3_errmsg 함수를 사용하여 오류 메시지를 출력합니다. 마지막으로 sqlite3_close 함수를 사용하여 데이터베이스 연결을 닫습니다.
위와 같이 SQLite API를 사용하여 C 언어에서 데이터베이스와 상호작용할 수 있습니다. 그 외에도 다양한 데이터베이스 API가 존재하며, 이들은 각각 특징과 장단점이 있습니다. 개발자는 프로젝트의 요구사항과 상황에 맞게 적절한 API를 선택하여 사용해야 합니다.