📜  使用C C++的数据库连接(1)

📅  最后修改于: 2023-12-03 14:49:47.987000             🧑  作者: Mango

使用C/C++的数据库连接

简介

在C/C++语言中,有很多库可以用来连接数据库,如ODBC、MySQL Connector/C++、PostgreSQL、SQLite等。这些库提供了API,允许程序员使用C/C++语言操作数据库,进行数据的读取、写入、修改等操作。

ODBC

ODBC(Open Database Connectivity)是由微软开发的一种数据库接口标准,提供了一种通用的关系型数据库的访问方法。几乎所有的关系型数据库都可以通过ODBC进行访问。

可以通过ODBC的API实现数据库连接和操作,以下是ODBC连接数据库的基本步骤:

  1. 加载ODBC驱动程序
  2. 打开数据库连接
  3. 执行SQL语句
  4. 关闭数据库连接
  5. 释放ODBC驱动程序

下面是C/C++使用ODBC连接MySQL数据库的范例代码:

#include <sql.h>
#include <sqlext.h>
//连接数据库
SQLCHAR* conn_str =
    (SQLCHAR*)"DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=localhost;DATABASE=testdb;UID=root;PWD=123456;OPTION=3";
SQLHENV hEnv = NULL;
SQLHDBC hDbc = NULL;
SQLHSTMT hStmt = NULL;
SQLRETURN ret;
SQLCHAR Buf[1024];

//加载ODBC驱动程序
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);

//打开数据库连接
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
ret = SQLDriverConnect(hDbc, NULL, conn_str, SQL_NTS,
    Buf, 1024, NULL, SQL_DRIVER_COMPLETE);

//执行SQL语句
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect(hStmt, (SQLCHAR*)"select * from test", SQL_NTS);
while (SQLFetch(hStmt) == SQL_SUCCESS) {
    SQLGetData(hStmt, 1, SQL_C_ULONG, &num, 0, NULL);
    SQLGetData(hStmt, 2, SQL_C_CHAR, str, 1024, NULL);
    printf("%lu\t%s\n", num, str);
}

//关闭数据库连接
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
MySQL Connector/C++

MySQL Connector/C++是一个面向对象的C++驱动程序库,用于连接MySQL数据库。使用MySQL Connector/C++连接MySQL数据库可以采用MySQL C API或者JDBC API方式,支持Windows、Linux、Mac OS X等操作系统。

以下是C/C++使用MySQL Connector/C++连接MySQL数据库的范例代码:

#include <iostream>
#include <string>

// 引入MySQL Connector/C++库
#include "mysqlx/xdevapi.h"

using namespace std;
using namespace mysqlx;

int main()
{
    // 连接MySQL数据库
    Session sess("localhost", 33060, "root", "123456");

    // 执行SQL语句
    string sql = "SELECT * FROM testdb.test";
    RowResult res = sess.sql(sql).execute();

    // 输出结果
    cout << "Record count: " << res.count() << endl;
    for (auto r : res)
    {
        cout << r[0] << "\t" << r[1] << endl;
    }

    return 0;
}
PostgreSQL

PostgreSQL是一个强大的开源对象-关系型数据库,支持大部分的SQL标准,其数据库适用于高并发、大数据存储等需求。在C/C++语言中,可以使用libpq库来连接PostgreSQL数据库。

以下是C/C++使用libpq连接PostgreSQL数据库的范例代码:

#include <iostream>
#include <string>

// 引入libpq库
#include <libpq-fe.h>

using namespace std;

int main()
{
    // 连接PostgreSQL数据库
    PGconn* conn = PQconnectdb("user=postgres dbname=testdb password=123456 hostaddr=127.0.0.1 port=5432");

    // 执行SQL语句
    string sql = "SELECT * FROM test";
    PGresult* res = PQexec(conn, sql.c_str());

    // 输出结果
    int rows = PQntuples(res);
    int cols = PQnfields(res);
    cout << "Record count: " << rows << endl;

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            cout << PQgetvalue(res, i, j) << "\t";
        }
        cout << endl;
    }

    // 释放资源
    PQclear(res);
    PQfinish(conn);

    return 0;
}
SQLite

SQLite是一个轻量级的数据库管理系统,支持大部分的SQL标准,适用于嵌入式设备和移动设备等场景。在C/C++语言中,可以使用SQLite的C API来连接数据库。

以下是C/C++使用SQLite连接数据库的范例代码:

#include <iostream>
#include <string>

// 引入SQLite的C API库
#include <sqlite3.h>

using namespace std;

int main()
{
    // 打开SQLite数据库
    sqlite3* db;
    sqlite3_open("test.db", &db);

    // 执行SQL语句
    string sql = "SELECT * FROM test";
    sqlite3_stmt* stmt;
    sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
    int ret = sqlite3_step(stmt);

    // 输出结果
    while (ret == SQLITE_ROW)
    {
        int num = sqlite3_column_int(stmt, 0);
        const unsigned char* str = sqlite3_column_text(stmt, 1);

        cout << num << "\t" << str << endl;

        ret = sqlite3_step(stmt);
    }

    // 释放资源
    sqlite3_finalize(stmt);
    sqlite3_close(db);

    return 0;
}
总结

本文介绍了使用C/C++连接数据库的几种方式,包括ODBC、MySQL Connector/C++、PostgreSQL、SQLite四种库。开发者可以根据不同的实际需求选择相应的库来连接数据库,并根据库提供的API进行操作。无论采用哪种方式,连接数据库的基本步骤都是相似的,开发者掌握了这些步骤之后,就可以轻松实现C/C++程序与数据库的交互。