概述
本文通过搭建unixODBC编译环境,及通过编写C语言测试脚本用例。描述如何通过unixODBC连接并操作MogDB数据库方法,提供类似测试案例。
相关软件版本
| 软件名称 | 版本 | 说明 |
|---|---|---|
| PTK | v1.5.3 | MogDB安装配置工具 |
| MogDB | 5.0.8 | MogDB数据库 |
| unixODBC | 2.3.9 | 官网提供的unixODBC源码版本 |
| mogdb plsqlodbc | 5.0.0.2 | 官网提供的mogdb plsqlodbc驱动 |
| gcc | 4.8.5-39 | GCC编译版本 |
测试步骤
1、安装MogDB数据库
## 配置ptk
# ptk --version
PTK Version: v1.5.3 release
Go Version: go1.19.10
Build Date: 2024-06-21T10:26:49
Git Hash: d90a48ea
OS/Arch: linux/amd64
## 编写ptk config.yaml文件
# cat config.yaml
global:
cluster_name: "mogdb508"
user: "omm"
group: "dbgrp"
db_password: "pTk6YjE1MTZkMDg8PTxBPTxAP2ZwNGNuU29nbHdackpiWVdrejVUTU5VWGg0b0t6XzEwRUE0QVBBc0w0dzA="
db_port: 26000
base_dir: "/data/mogdb508"
app_dir: "/data/mogdb508/app"
data_dir: "/data/mogdb508/data"
log_dir: "/data/mogdb508/log"
tmp_dir: "/data/mogdb508/tmp"
tool_dir: "/data/mogdb508/tool"
core_file_dir: "/data/mogdb508/core"
db_servers:
- host: "192.168.118.140"
db_port: 26000
ha_port: 26001
role: "primary"
## 建立用户及用户组
# groupadd dbgrp -g 2000
# useradd omm -g 2000 -u 2000
# echo "MogDB@2024" | passwd --stdin omm
更改用户 omm 的密码 。
passwd:所有的身份验证令牌已经成功更新。
## 创建数据库安装目录并赋权
# mkdir /data
# chown omm: /data
## PTK预检查
# ptk checkos -f /opt/software/config.yaml
# Check Results
Item | Level
------------------------------------+----------
A1.Check_OS_Version | OK
A2.Check_Kernel_Version | OK
A3.Check_Unicode | OK
A4.Check_TimeZone | OK
A5.Check_Swap_Memory_Configure | Warning
A6.Check_SysCtl_Parameter | Warning
A7.Check_FileSystem_Configure | OK
A8.Check_Disk_Configure | OK
A9.Check_BlockDev_Configure | Warning
A9.Check_Logical_Block | OK
A10.Check_Asynchronous_IO_Request | OK
A10.Check_IO_Configure | OK
A10.Check_NR_Request | Warning
A11.Check_Network_Configure | OK
A12.Check_Time_Consistency | OK
A13.Check_Firewall_Status | OK
A14.Check_THP_Status | OK
A15.Check_Dependent_Package | OK
A16.Check_CPU_Instruction_Set | OK
A17.Check_Port | OK
A18.Check_Selinux | OK
A19.Check_User_Ulimit | OK
A20.Check_Directory | OK
Total count 23, abnormal count 0, warning count 4
## PTK安装MogDB
# ptk install -y -f /opt/software/config.yaml -p /opt/software/mogdb508/MogDB-5.0.8-CentOS-x86_64-all.tar.gz --skip-create-user --skip-check-os
# ptk cluster -n mogdb508 status --detail
[ Cluster State ]
cluster_name : mogdb508
cluster_state : Normal
database_version : MogDB 5.0.8 (build 41aa0432)
[ Datanode State ]
cluster_name | id | ip | port | user | nodename | db_role | state | uptime | upstream
---------------+------+-----------------+-------+------+----------+---------+--------+----------+-----------
mogdb508 | 6001 | 192.168.118.140 | 26000 | omm | dn_6001 | primary | Normal | 00:00:35 | -
[ DataNode Detail ]
--------------- 192.168.118.140:26000(dn_6001) ---------------
role : primary
data_dir : /data/mogdb508/data
az_name : AZ1
## 创建测试数据库及用户
# su - omm
$ gsql -r
gsql ((MogDB 5.0.8 build 41aa0432) compiled at 2024-07-26 12:43:48 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=# create database testdb;
CREATE DATABASE
MogDB=# create user moguser with sysadmin password 'Mogdb@1234';
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=#
2、检查gcc编译环境
# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
3、安装unixODBC软件
## 源码安装unixodbc
# tar -xvf unixODBC-2.3.9.tar.gz
# cd unixODBC-2.3.9/
# ./configure --prefix=/opt/unixodbc --enable-gui=no --enable-drivers=no
# make && make install
## 检查unixodbc安装状态
# /opt/unixodbc/bin/odbcinst -j
unixODBC 2.3.9
DRIVERS............: /opt/unixodbc/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/unixodbc/etc/odbc.ini
FILE DATA SOURCES..: /opt/unixodbc/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
##安装odbc相关c库文件
# yum install unixODBC-devel -y
# yum install sqlite-devel -y
## 配置环境变量
# export PATH=/opt/unixodbc/bin/:$PATH
# export LD_LIBRARY_PATH=/opt/unixodbc/lib/:$LD_LIBRARY_PATH
# odbcinst -j
unixODBC 2.3.9
DRIVERS............: /opt/unixodbc/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/unixodbc/etc/odbc.ini
FILE DATA SOURCES..: /opt/unixodbc/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
4、安装mogdb plsqlodbc驱动
## 解压mogdbodbc驱动
# tar -xvf MogDB-ODBC-5.0.0.2-CentOS-x86_64.tar.gz -C /opt/mogdbodbc
## 配置环境变量
# export PATH=/opt/unixodbc/bin/:$PATH
# export LD_LIBRARY_PATH=/opt/unixodbc/lib/:/opt/mogdbodbc/lib/:$LD_LIBRARY_PATH
## 配置unixodbc驱动,并执行mogdbodbc
# cat /opt/unixodbc/etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=/tmp/unixodbc.log
[MogDB]
Description = ODBC for PostgreSQL
Driver = /opt/mogdbodbc/odbc/lib/psqlodbcw.so
Setup = /opt/mogdbodbc/odbc/lib/psqlodbcw.so
Driver64 = /opt/mogdbodbc/odbc/lib/psqlodbcw.so
Setup64 = /opt/mogdbodbc/odbc/lib/psqlodbcw.so
FileUsage = 1
## 配置数据库连接
# cat /opt/unixodbc/etc/odbc.ini
[MogDB_LINK]
Description = PostgresSQLODBC
Driver = MogDB
Database = testdb
Servername = 192.168.118.140
UserName = moguser
Password = Mogdb@1234
Port = 26000
ForExtensionConnector = 1 ##关闭自动savepoint
UseBatchProtocol = 1 ##开启批量绑定
ConnSettings=set client_encoding=UTF8 ##客户端字符集,于server_encoding一致即可
ReadOnly = 0
5、使用unixODBC的isql工具链接并操作数据库
# isql -v MogDB_LINK
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select 1;
+------------+
| ?column? |
+------------+
| 1 |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>
6、编写简单的C语言用例
# vi /tmp/test.c
//C语言头文件
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//异常中断错误信息
void checkRC(SQLRETURN rc, SQLHANDLE handle, SQLSMALLINT type, const char *msg) {
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
SQLCHAR sqlState[6], message[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER nativeError;
SQLSMALLINT textLength;
SQLGetDiagRec(type, handle, 1, sqlState, &nativeError, message, sizeof(message), &textLength);
printf("%s (RC: %d, SQLSTATE: %s, ERROR: %s)\n", msg, rc, sqlState, message);
}
}
//主函数
int main() {
SQLHENV henv; // Handle ODBC environment
SQLHDBC hdbc; // Handle connection
SQLHSTMT stmt; // Handle statement
SQLRETURN rc;
//申请环境句柄
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
checkRC(rc, SQL_NULL_HANDLE, SQL_HANDLE_ENV, "SQLAllocHandle(ENV) failed");
//设置环境属性
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
checkRC(rc, henv, SQL_HANDLE_ENV, "SQLSetEnvAttr failed");
//申请连接句柄
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
checkRC(rc, henv, SQL_HANDLE_ENV, "SQLAllocHandle(DBC) failed");
//配置连接数据源,需要修改databasename,username,password
rc = SQLConnect(hdbc, (SQLCHAR*) "mogdb_link", SQL_NTS, (SQLCHAR*)"moguser", SQL_NTS, (SQLCHAR*)"Mogdb@1234", SQL_NTS);
checkRC(rc, hdbc, SQL_HANDLE_DBC, "SQLConnect failed");
//设置连接属性,1:自动提交,2:链接超时,单位为s
rc = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0);
checkRC(rc, hdbc, SQL_HANDLE_DBC, "SQLSetConnectAttr autocommit_off failed");
rc = SQLSetConnectAttr(hdbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)5,0);
checkRC(rc, hdbc, SQL_HANDLE_DBC, "SQLSetConnectAttr login_timeout failed");
printf("DB Connected !\n");
//申请语句句柄
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt);
checkRC(rc, hdbc, SQL_HANDLE_DBC, "SQLAllocHandle(STMT) failed");
//执行ddl
rc = SQLExecDirect(stmt, (SQLCHAR*)"drop table if exists t1", SQL_NTS);
checkRC(rc, stmt, SQL_HANDLE_STMT, "SQLExecDirect(drop table t1) failed");
rc = SQLExecDirect(stmt, (SQLCHAR*)"create table t1(id int primary key, c1 varchar(1000))", SQL_NTS);
checkRC(rc, stmt, SQL_HANDLE_STMT, "SQLExecDirect(create table t1) failed");
printf("create success \n");
//直接执行SQL语句
rc = SQLExecDirect(stmt, (SQLCHAR*)"insert into t1 select 1,'odbc_test'", SQL_NTS);
checkRC(rc, stmt, SQL_HANDLE_STMT, "SQLExecDirect(insert into t1) failed");
printf("insert success \n");
//通过SQLGetData获取SQL结果集
rc = SQLExecDirect(stmt, (SQLCHAR*)"select * from t1", SQL_NTS);
checkRC(rc, stmt, SQL_HANDLE_STMT, "SQLExecDirect(select t1) failed");
printf("begin table select output\n");
char typename[100];
SQLColAttribute(stmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL);
printf("SQLColAtrribute %s\n",typename);
while(SQL_SUCCEEDED(SQLFetch(stmt)))
{
//定义int数字类型变量
SQLINTEGER id;
//定义char字符类型变量
SQLCHAR remark1[20];
//GET第一列数据结果集,int类型数据
SQLGetData(stmt, 1, SQL_C_SLONG, &id, 0, NULL);
//GET第二列数据结果集,varchar类型数据
SQLGetData(stmt, 2, SQL_C_CHAR, remark1, sizeof(remark1), NULL);
//打印数据
printf("Fetched t1 id: %d, t1 remark: %s\n",id,remark1);
};
printf("end table select output\n");
//释放stmt句柄
SQLFreeStmt(stmt, SQL_CLOSE);
//关闭事务
rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
checkRC(rc, hdbc, SQL_HANDLE_DBC, "SQLEndTran(COMMIT) failed");
//释放链接
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
printf("All done.\n");
return 0;
}
7、执行脚本,并查询返回结构
##编译脚本
# gcc /tmp/test.c -o /tmp/test -lodbc
##执行脚本
/tmp/test

最后修改时间:2024-10-22 10:22:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




