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中,会指定头文件目录,链接库目录
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)
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-devel
和 obclient
的顺序不同,头文件目录和链接库目录,都会放生变化,实际使用时,需要引用对应的头文件和库文件,才能正确的处理数据库的数据。
以上就是本次的分享,感谢阅读。