OceanBase数据库-学习笔记2-C#/C++程序如何访问

发布于:2025-05-01 ⋅ 阅读:(29) ⋅ 点赞:(0)

MySQL模式下,程序(C#)连接数据库操作demo

SqlSugar

public class MainModel
{
    private static readonly ConnectionConfig connectionConfig = new ConnectionConfig()
    {
        ConnectionString = "server=xxx.xxx.xxx.xxx;port=2881;user id=root;password=123456;database=test;",
        DbType = DbType.OceanBase, // 指定数据库类型,此外使用 MySql 或 MySqlConnector 都可以
        IsAutoCloseConnection = true // 是否自动关闭连接
    };

    public static SqlSugarClient GetSqlSugarClient()
    {
        using SqlSugarClient sugarClient = new(connectionConfig);

        sugarClient.Aop.OnLogExecuting = (s, p) =>
        {
            Console.WriteLine("=========================================================");
            Console.WriteLine($"Sql语句:{s}");
        };

        return sugarClient;
    }
}

[SugarTable("studentinfo")]
public class StudentInfo
{
    public int id { get; set; }
    public string? name { get; set; }
    public int age { get; set; }
}

using var sugarClient = MainModel.GetSqlSugarClient();
var vlist = sugarClient.Queryable<StudentInfo>().ToList();
foreach (var v in vlist)
{
    Console.WriteLine($"{v.id}, {v.name}, {v.age}");
}

输出结果如下

=========================================================
Sql语句:SELECT `id`,`name`,`age` FROM `studentinfo`
1, 小红, 25
2, 小明, 26
3, 小亮, 24
4, 小白, 18
5, 小苏, 20

MySQL模式下,程序(C++)连接数据库操作demo

官网提供了C语言如何链接OceanBase数据库的案例,需要使用MySQL Connector/C(MySQL C API),它提供了一组 C 语言的函数和数据结构,允许开发人员使用 C/C++ 语言来连接、查询和管理MySQL数据库。这个 API 允许开发人员直接在其 C/C++ 应用程序中使用MySQL数据库。

前提条件

在安装使用 MySQL Connector/C 之前请确保设置了基本的数据库开发环境,要求如下:

  • GCC 版本为 3.4.6 及以上,推荐使用 4.8.5 版本。
[root@localhost ~]# gcc --version
gcc (GCC) 8.3.1 20191121 (Anolis 8.3.1-5.0.1)
Copyright © 2018 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
[root@localhost ~]# 
  • CMake 版本为 2.8.12 及以上。
[root@localhost ~]# cmake --version
cmake version 3.29.20240408-ga3d067b

CMake suite maintained and supported by Kitware (kitware.com/cmake).
[root@localhost ~]#
  • 已安装 OceanBase 数据库并且创建了 MySQL 模式租户。
    112服务器已经安装,就使用sys租户下的root用户就可以。

步骤

1. 获取链接字符串

这里可以通过展示指定集群的详细信息获取,以下命令需要在安装OceanBase数据库的服务器上进行。

obd cluster list # 展示当前OBD内注册的所有集群状态

obd cluster display \<cluster_name\> # 展示集群的详细信息,包括链接字符串

[root@localhost ~]# obd cluster list
+--------------------------------------------------+
|                   Cluster List                   |
+------+-------------------------+-----------------+
| Name | Configuration Path      | Status (Cached) |
+------+-------------------------+-----------------+
| demo | /root/.obd/cluster/demo | running         |
+------+-------------------------+-----------------+
Trace ID: e1b471cc-f4ae-11ef-a01c-000c29b89f8c
If you want to view detailed obd logs, please run: obd display-trace e1b471cc-f4ae-11ef-a01c-000c29b89f8c
[root@localhost ~]#obd cluster display demo
Get local repositories and plugins ok
Open ssh connection ok
Cluster status check ok
Connect to observer 127.0.0.1:2881 ok
Wait for observer init ok
+---------------------------------------------+
|                 oceanbase-ce                |
+-----------+---------+------+-------+--------+
| ip        | version | port | zone  | status |
+-----------+---------+------+-------+--------+
| 127.0.0.1 | 4.2.1.9 | 2881 | zone1 | ACTIVE |
+-----------+---------+------+-------+--------+
obclient -h127.0.0.1 -P2881 -uroot -p'xxxxxxxxxxxxxxxxxxxx' -Doceanbase -A

cluster unique id: 6a6b176c-37c0-5712-bad4-fb1018069115-1927fdff52b-09010204

Connect to obproxy ok
+---------------------------------------------+
|                  obproxy-ce                 |
+-----------+------+-----------------+--------+
| ip        | port | prometheus_port | status |
+-----------+------+-----------------+--------+
| 127.0.0.1 | 2883 | 2884            | active |
+-----------+------+-----------------+--------+
obclient -h127.0.0.1 -P2883 -uroot -p'xxxxxxxxxxxxxxxxxxxx' -Doceanbase -A 

Connect to Obagent ok
+--------------------------------------------------------------+
|                           obagent                            |
+-----------+--------------------+--------------------+--------+
| ip        | mgragent_http_port | monagent_http_port | status |
+-----------+--------------------+--------------------+--------+
| 127.0.0.1 | 8089               | 8088               | active |
+-----------+--------------------+--------------------+--------+
[WARN] 127.0.0.1 prometheus is stopped
[WARN] 127.0.0.1 grafana is stopped
Trace ID: 30aeed3e-f4af-11ef-8a1a-000c29b89f8c
If you want to view detailed obd logs, please run: obd display-trace 30aeed3e-f4af-11ef-8a1a-000c29b89f8c
[root@localhost ~]# 
  • OceanBase CE (Community Edition),OceanBase 的核心数据库引擎,负责数据存储、计算和事务处理。
  • OBProxy CE (Community Edition),OceanBase 的代理服务,即连接接管理(将客户端请求路由到正确的节点)和性能优化(负载均衡)。
  • OBAgent,OceanBase 的监控代理,负责收集 OceanBase 集群的监控数据并上报给 Prometheus 或其他监控系统。

2. 安装 MySQL Connector/C 驱动

  • sudo apt-get install libmysqlclient-dev #在 Ubuntu 系统上安装
  • sudo yum install mysql-devel # 在 CentOS 系统上安装
  • mysql_config --version # 确认是否安装成功
[root@localhost ~]# mysql_config --version
10.5.5
[root@localhost ~]# 

3. 数据库表展示

[root@localhost OceanbaseTest]# !873
obclient -hxxx.xxx.xxx.xxx -P2881 -uroot -p'xxxxxxxxxxxxxxxxxxxx' -Doceanbase -A
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 3221558055
Server version: OceanBase_CE 4.2.1.9 (r109000032024092015-f2b0ead618247181e253e3912072c30ff965632d) (Built Sep 20 2024 20:29:42)

Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient(root@(none))[oceanbase]> use test
Database changed
obclient(root@(none))[test]> select * from studentinfo;
+------+--------+------+
| id   | name   | age  |
+------+--------+------+
|    1 | 小红   |   25 |
|    2 | 小明   |   26 |
|    3 | 小亮   |   24 |
|    4 | 小白   |   18 |
|    5 | 小苏   |   20 |
+------+--------+------+
5 rows in set (0.012 sec)

obclient(root@(none))[test]>

4. 程序代码

应用程序通过 MySQL Connector/C 与数据库服务器 OBServer 节点交互的基本方式如下:

方法 功能
mysql_library_init(0, NULL, NULL); 调用 mysql_library_init() 初始化 MySQL 库。
MYSQL *mysql = mysql_init(NULL); 调用 mysql_init() 初始化一个连接句柄。
mysql_real_connect (mysql, host_name, user_name, password, db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS) 调用 mysql_real_connect() 连接到 OBServer 节点。
mysql_query(mysql,“sql_statement”); 调用 mysql_real_query() 或 mysql_query() 向 OBServer 节点发送 SQL 语句。;
result=mysql_store_result(mysql); 调用 mysql_store_result() 或 mysql_use_result() 处理其结果。
mysql_free_result(result); 调用 mysql_free_result() 释放内存。
mysql_close(mysql); 调用 mysql_close() 关闭与 OBServer 节点的连接。
mysql_library_end(); 调用 mysql_library_end() 结束 MariaDB client 的使用。
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>

int main() {
    MYSQL *conn = mysql_init(NULL); // 初始化MySQL连接

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    // 连接到 MySQL 数据库服务器,host,user,passwd, db, port替换为对应数据库链接的信息
    if (mysql_real_connect(conn, "host", "user", "passwd", "db", port, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed\n");
        mysql_close(conn);
        return 1;
    }

    // 查询数据
    if (mysql_query(conn, "SELECT * FROM users") == 0) {
        MYSQL_RES *result = mysql_store_result(conn);
        if (result != NULL) {
            int num_fields = mysql_num_fields(result);
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(result))) {
                for (int i = 0; i < num_fields; i++) {
                    printf("%s ", row[i] ? row[i] : "NULL");
                }
                printf("\n");
            }
            mysql_free_result(result);
        } else {
            fprintf(stderr, "Error in retrieving result: %s\n", mysql_error(conn));
        }
    } else {
        fprintf(stderr, "Error in selecting data: %s\n", mysql_error(conn));
    }

    mysql_close(conn); // 关闭连接
    return 0;
}

编译执行如下:

[root@localhost OceanbaseTest]# gcc -o test test.cpp `mysql_config --cflags --libs`
[root@localhost OceanbaseTest]# ./test 
1 小红 25 
2 小明 26 
3 小亮 24 
4 小白 18 
5 小苏 20 
[root@localhost OceanbaseTest]#

5. 注意

上述的 mysql_config --cflags --libs 是编译传参,即指定mysql.h头文件和使用依赖的库目录

1. mysql_config

mysql_config 是一个 MySQL 提供的命令行工具,用于获取 MySQL 客户端库的编译和链接信息。它通常用于在编译和链接 MySQL 客户端应用程序时,提供必要的头文件路径、库文件路径以及链接选项。

[root@d1df39be86b3 /]# mysql_config
Usage: /usr/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/usr/include/mysql]
        --include        [-I/usr/include/mysql]
        --libs           [-L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -ldl -lssl -lcrypto]
        --libs_r         [-L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -ldl -lssl -lcrypto]
        --plugindir      [/usr/lib64/mysql/plugin]
        --socket         [/var/lib/mysql/mysql.sock]
        --port           [0]
        --version        [5.5.68]
        --libmysqld-libs [-L/usr/lib64/mysql -lmysqld]
        --variable=VAR   VAR is one of:
                pkgincludedir [/usr/include/mysql]
                pkglibdir     [/usr/lib64/mysql]
                plugindir     [/usr/lib64/mysql/plugin]
[root@d1df39be86b3 /]#mysql_config --cflags
-I/usr/include/mysql
[root@d1df39be86b3 /]# mysql_config --include
-I/usr/include/mysql
[root@d1df39be86b3 /]# mysql_config --libs
-L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -ldl -lssl -lcrypto
[root@d1df39be86b3 /]#
2. 安装obclient客户端后,mysql_config的变化

如果安装了obclient客户端(OceanBase客户端),MySql驱动就会优先使用obclient链接方式,mysql_config 执行结果就会发生变化

[root@d1df39be86b3 home]# ls
libobclient-2.2.7-1.el7.x86_64.rpm  obclient-2.2.7-1.el7.x86_64.rpm  oceanbasetest
[root@d1df39be86b3 home]# rpm --version
RPM version 4.11.3
[root@d1df39be86b3 home]# rpm -ivh libobclient-2.2.7-1.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:libobclient-2.2.7-1.el7          ################################# [100%]
[root@d1df39be86b3 home]# rpm -ivh obclient-2.2.7-1.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:obclient-2.2.7-1.el7             ################################# [100%]
[root@d1df39be86b3 home]# mysql_config
Usage: /usr/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/u01/obclient/include -I/u01/obclient/include/mysql]
        --include        [-I/u01/obclient/include -I/u01/obclient/include/mysql]
        --libs           [-L/u01/obclient/lib/ -lobclnt]
        --libs_r         [-L/u01/obclient/lib/ -lobclnt]
        --plugindir      [/u01/obclient/lib/plugin]
        --socket         [/tmp/mysql.sock]
        --port           [3306]
        --version        [10.5.5]
        --libmysqld-libs [-L/u01/obclient/lib  -lmysqld]
        --variable=VAR   VAR is one of:
                pkgincludedir [/u01/obclient/include/mysql]
                pkglibdir     [/u01/obclient/lib]
                plugindir     [/u01/obclient/lib/plugin]
[root@d1df39be86b3 home]#
3. CMake项目注意事项

在CMakeLists.txt中,会指定头文件目录,链接库目录

  1. 不安装obclient的情况
cmake_minimum_required (VERSION 3.1)

PROJECT(oceanbasetest)

set(CMAKE_CXX_COMPILER "c++")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS -Wall)

include_directories(/usr/include/mysql/)

link_directories("/usr/lib64/mysql/")

ADD_EXECUTABLE(oceanbasetest test.cpp)

target_link_libraries(oceanbasetest mysqlclient pthread z m dl ssl crypto)
  1. 安装oblient的情况
cmake_minimum_required (VERSION 3.8)
  
PROJECT(oceanbasetest)

set(CMAKE_CXX_COMPILER "c++")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS -Wall)

include_directories(/u01/obclient/include/)

link_directories("/u01/obclient/lib/")

ADD_EXECUTABLE(oceanbasetest test.cpp)

target_link_libraries(oceanbasetest obclnt)

4. 查询乱码的情况

在使用 mysql 驱动的情况下,查询有时会有乱码的情况

[root@d1df39be86b3 build]# ./oceanbasetest
1 ?? 25
2 ?? 26
3 ?? 24
4 ?? 18
5 ?? 20
[root@d1df39be86b3 build]#
解决方案
1. 使用mysql驱动调用obclient链接方式,可以解决乱码
[root@d1df39be86b3 build]# ./oceanbasetest
1 小红 25
2 小明 26
3 小亮 24
4 小白 18
5 小苏 20
[root@d1df39be86b3 build]#
2. 通过设置字符集解决
  • 查询数据库的字符集

SHOW VARIABLES LIKE ‘character_set%’;

obclient(root@(none))[test]> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8mb4 |
+--------------------------+---------+
7 rows in set (0.004 sec)

obclient(root@(none))[test]>

可以看到数据库的字符集为utf8mb4

  • 在代码中设置字符集
    • mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4") 是使用 MySQL C API 设置客户端字符集的关键语句。它的作用是将客户端与数据库之间的通信字符集设置为 utf8mb4,从而确保数据在传输过程中能够正确处理中文字符。

    • 它可以在 mysql_real_connect 之前或之后调用,用于配置连接的行为。

    • 如果客户端和数据库的字符集不一致,那么中文字符在传输过程中会被错误地解析。mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4") 的作用是显式地告诉 MySQL 客户端,使用 utf8mb4 字符集与数据库通信。这样,客户端发送的 SQL 语句和接收的查询结果都会以 utf8mb4 编码处理,从而避免乱码问题。
      在这里插入图片描述

设置后编译运行,就正常了

[root@d1df39be86b3 build]# ./oceanbasetest
1 小红 25
2 小明 26
3 小亮 24
4 小白 18
5 小苏 20
[root@d1df39be86b3 build]#
5. 对于安装顺序的说明

以上安装 mysql-develobclient 的顺序不同,头文件目录和链接库目录,都会放生变化,实际使用时,需要引用对应的头文件和库文件,才能正确的处理数据库的数据。


以上就是本次的分享,感谢阅读。

上一章:《OceanBase数据库-学习笔记1-概论》
下一章:《OceanBase数据库-学习笔记3-Oceanbase相关命令》


网站公告

今日签到

点亮在社区的每一天
去签到