鸿蒙开发仓颉语言:数据封装传递——odbc4cj

📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)

📃 鸿蒙(HarmonyOS)北向开发知识点记录~

📃 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~

📃 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

📃 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

📃 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

📃 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

📃 记录一场鸿蒙开发岗位面试经历~

📃 持续更新中……


介绍

基于 odbc 实现 database 包。

特性

  • 🚀 特性1

    数据库驱动接口

  • 🚀 特性2

    数据源接口

  • 💪 特性3

    数据库连接接口

  • 🛠️ 特性4

    sql语句预执行接口

  • 🌍 特性5

    执行Insert、Update、Delete语句产生的结果接口

  • 💡 特性6

    执行Select/Query语句返回结果的列信息

  • 💡 特性7

    执行 Select 语句产生的结果接口

  • 💡 特性8

    数据库事务的核心行为

软件架构

源码目录

.
├─ doc
├─ README.md
├─ README.OpenSource
├─ src
└─ test
   ├─ HLT
   └─ LLT

  • doc 文档目录,用于存放设计、API接口等文档
  • src 源码目录
  • test 测试目录

接口说明

主要类和函数接口说明详见 API

使用说明

编译构建

1、安装

linux安装 unixODBC

https://learn.microsoft.com/zh-cn/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16&tabs=alpine18-install%2Calpine17-install%2Cdebian8-install%2Credhat7-13-install%2Crhel7-offline

window安装

https://learn.microsoft.com/zh-cn/sql/connect/odbc/windows/microsoft-odbc-driver-for-sql-server-on-windows?view=sql-server-ver16

2、克隆项目

git clone https://gitcode.com/Cangjie-TPC/odbc4cj.git

3、切换目录

cd odbc4cj

4、在当前目录新建 lib 文件夹

5、迁移lib

linux 环境下 将 libodbc.so复制到lib中。libodbc.so通常在 /usr/lib/x86_64-linux-gnu/ 目录下

window 环境下 将 libmyodbc8a.dll、libcrypto-1_1-x64.dll、libsasl.dll、libssl-1_1-x64.dll复制到lib中。将 cjpm.toml文件中的 odbc = {path = “./lib/”} 改成 myodbc8a = {path = “./lib/”}。libmyodbc8a.dll 下载mysql版本的odbc插件目录中,libcrypto-1_1-x64.dll、libsasl.dll、libssl-1_1-x64.dll在window系统目录中

6、编译项目

cjpm build

7、编译示例文件

示例文件在 /test/DOC/test_example1.cj
${path}修改成用户自己项目本地路径

linux 编译指令

cp ${path}/libs/libodbc.so ${path}/odbc4cj/target/release/odbc4cj   ---> 复制so到指定路径

cd target/release/odbc4cj   ---> 切换目录

cjc  --import-path ${path}/odbc4cj/target/release -L ${path}/odbc4cj/target/release/odbc4cj -l odbc -l odbc4cj ${path}/odbc4cj/test/DOC/test_example1.cj -O0 -Woff alll  ---> 编译 test/LLT 用例

windows 编译指令

cp ${path}/libs/libmyodbc8a.dll ${path}/odbc4cj/target/release/odbc4cj   ---> 复制dll到指定路径
cp ${path}/libs/libcrypto-1_1-x64.dll ${path}/odbc4cj/target/release/odbc4cj   ---> 复制dll到指定路径
cp ${path}/libs/libsasl.dll ${path}/odbc4cj/target/release/odbc4cj   ---> 复制dll到指定路径
cp ${path}/libs/libssl-1_1-x64.dll ${path}/odbc4cj/target/release/odbc4cj   ---> 复制dll到指定路径

cd target/release/odbc4cj   ---> 切换目录

cjc  --import-path ${path}/odbc4cj/target/release -L ${path}/odbc4cj/target/release/odbc4cj -l crypto-1_1-x64 -l myodbc8a -l sasl -l ssl-1_1-x64 -l odbc4cj ${path}/odbc4cj/test/DOC/test_example1.cj -O0 -Woff alll  ---> 编译 test/LLT 用例

8、运行执行文件

linux 运行

./main

windows 运行

./main.exe

功能示例

import std.database.sql.* 
import std.io.*
import std.time.*
import std.regex.*
import odbc4cj.*

main() {
    var driver = OdbcDriver()
    var database = driver.open("DATABASE=mysql;UID=root;PWD=123")
    var conn = database.connect()
    var prepareStatement = conn.prepareStatement("drop table if exists test")
    var rowCount = prepareStatement.update()
    prepareStatement = conn.prepareStatement("create table test(data int NOT NULL, datanull int)")
    rowCount = prepareStatement.update()
    prepareStatement = conn.prepareStatement("insert into test values(?,?)")
    rowCount = prepareStatement.update([SqlInteger(12345), SqlNullableInteger(None)])
    prepareStatement = conn.prepareStatement("select * from test")
    var queryResult = prepareStatement.query()
    var arr: Array<SqlDbType> = [SqlInteger(1), SqlNullableInteger(1)]
    queryResult.next(arr)
    match (arr[0]) {
        case v: SqlInteger => println(v.value)
        case _ => ()
    }
    match (arr[1]) {
        case v: SqlNullableInteger => println(v.value)
        case _ => ()
    }
}

执行结果如下:

12345
None

约束与限制

  1. 不支持数据类型(SqlTimeTz、SqlTimestamp、SqlInterval),新增支持数据类型请参考 sqlTypeExtend.cj
  2. interface Driver 不支持 name、version、preferredPooling
  3. Datasource 不支持 setOption(key: String, value: String),请使用 setOption(key: Int32, value: Int64)
  4. interface Connection 不支持 getMetaData(),请使用 getInfo(infoType: UInt16, len: Int16)
  5. interface Statement 不支持 setOption(key: String, value: String),请使用 setOption(key: Int32, value: Int64)
  6. interface UpdateResult 不支持 lastInsertId
  7. interface Transaction 不支持 accessMode、deferrableMode、save(savePointName: String)、rollback(savepointName: String)、release(savePointName: String)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值