使用 electron 可以进行本地数据库连接
1. 下载
首先进行插件下载
npm i oracledb
如果是 32 程序需要下载对应编译二进制版本
npm install https://github.com/oracle/node-oracledb/releases/download/v5.3.0/oracledb-src-5.3.0.tgz
或者
"oracledb": "github:oracle/node-oracledb#v5.3.0"
2. 使用前置条件
安装后是不能直接使用的, 一般需要进行 oracle 客户端安装, 也可以直接从 Oracle 官网下载免费的 64 位 Instant Client Basic ZIP 文件。如果您的 Node.js 架构是 32 位的,那么请改用 32 位 Instant Client。
将 ZIP 文件解压缩到应用程序可访问的目录中。例如解压 instantclient-basic-windows.x64-19.11.0.0.0dbru.zip到 C:\oracle\instantclient_19_11.
有几种方法可以告诉 node-oracledb 您的 Oracle 客户端库在哪里,请参阅Initializing Node-oracledb:
-
- 在应用程序中使用
oracledb.initOracleClient():
- 在应用程序中使用
const oracledb = require('oracledb');
try {
oracledb.initOracleClient({libDir: 'C:\oracle\instantclient_19_11'});
} catch (err) {
console.error('Whoops!');
console.error(err);
process.exit(1);
}
-
- Oracle Instant Client 库复制到 二进制
node_modules/oracledb/build/Release文件所在的目录,打包后会将该文件放入resources/app.asar.unpacked文件夹下
- Oracle Instant Client 库复制到 二进制
-
- 将 Oracle Instant Client 目录添加到
PATH环境变量中。该目录必须出现在PATH任何其他 Oracle 目录之前
- 将 Oracle Instant Client 目录添加到
当然选用第二种将 oracled 程序打包至应用程序中会比较方便, 但是同时会增加应用程序的体积, 这个就需要进行一个取舍
3. 使用前封装
class DbOracle {
constructor(dbConfig) {
this.dbConfig = dbConfig
}
async getConnection() {
return await oracle.getConnection(this.dbConfig)
}
async query(sql) {
const connection = await this.getConnection()
// 执行sql
const result = await connection.execute(sql)
// 释放连接
connection.release()
return result
}
// 事务执行
async beginTransaction(sqlArr) {
const connection = await this.getConnection()
try {
const promiseArr = this.getSqlPromise(sqlArr, async(sql, res, req) => {
try {
const data = await connection.execute(sql)
res(data)
} catch (e) {
req(e)
}
})
const data = await Promise.all(promiseArr)
await connection.commit()
await connection.release()
return data
} catch (e) {
await connection.rollback()
await connection.release()
return e
}
}
}
4. 使用
详细使用可以参考官方API
4.1 初始化
const db = new DbOracle({
user: 'hr',
password: '123456',
connectString: 'localhost/orclpdb1',
externalAuth: false
})
4.2 获取连接池
const connection = db.getConnection()
4.3 执行 SQL
db.query('SELECT * FROM no_example').then(data => {
console.log(data)
})
4.4 多 SQL 事务执行
db.beginTransaction(['SELECT * FROM no_example']).then(data => {
console.log(data)
})