当前位置: 首页 > news >正文

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

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-ga3d067bCMake 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 -Acluster unique id: 6a6b176c-37c0-5712-bad4-fb1018069115-1927fdff52b-09010204Connect 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 的顺序不同,头文件目录和链接库目录,都会放生变化,实际使用时,需要引用对应的头文件和库文件,才能正确的处理数据库的数据。


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

相关文章:

  • error mounting 报错解决办法
  • 【Android】dialogX对话框框架
  • 数值分析、数值代数之追赶法
  • 高功率无人机动力方案首选:CKESC ROCK 220A-H CAN 电调工程性能实测
  • AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok的客户端开源应用程序,集成了 Monaco 编辑器。
  • Web安全:威胁解析与综合防护体系构建
  • vscode vue 的插件点击组件不能跳转到文件问题解决
  • 人工智能——XGBoost 算法
  • 如何启动jar包隐藏cmd窗口
  • k8s生成StarRocks集群模版
  • π0.5:带开放世界泛化的视觉-语言-动作模型
  • 鸿蒙OSS文件(视频/图片)压缩上传组件-能够增删改查
  • Harbor2.0仓库镜像清理策略
  • 考研系列-计算机组成原理第六章、总线
  • Servlet (简单的servlet的hello world程序)
  • HK1RBOX K8 RK3528 Via浏览器_插件_央视频的组合验证(失败)
  • AVFormatContext 再分析
  • python+adafruit_pca9685 测试舵机存储当前角度
  • 中国区域250米归一化植被指数数据集(2000-2023)
  • 数据库3,
  • 民航局:中方航空公司一季度运输国际旅客同比大增34%
  • 最高法知产庭年度报告:民事案件二审发回重审率持续下降
  • 欢迎回家!日本和歌山县4只大熊猫将于6月底送返中国
  • 美联储报告披露关税战冲击波:消费信心下降,经济担忧加深
  • 国铁集团:一季度全国海铁运输商品车同比增长33.62%
  • 政治局会议:创设新的结构性货币政策工具,设立新型政策性金融工具,支持科技创新、扩大消费、稳定外贸等