Node实现连接达梦数据库

1、创建DataBaseUtilsDM.js文件用于封装达梦数据库连接

使用的是Node中的egg框架,DataBaseUtilsDM.js文件,主要为了达梦数据连接以及封装的快速查询和删除操作还有clob数据的快速的转换

'use strict'
// 达梦数据库连接封装
const CLASS = function() {
  this.db = require('dmdb')
  this.pool = ''
  this.conn = ''
}

CLASS.prototype = {
  // 封装查询数据以及数据处理返回
  async select(sql) {
    this.pool = await this.createPool()
    this.conn = await this.getConnection()
    const list = await this.conn.execute(sql)
    const arr1 = []
    for (let i = 0; i < list.rows.length; i++) {
      const RowDataPacket = {}
      list.metaData.forEach((val, index) => {
        RowDataPacket[val.name] = list.rows[i][index]
      })
      arr1.push(RowDataPacket)
    }
    return arr1
  },
  async delete(sql) {
    this.pool = await this.createPool()
    this.conn = await this.getConnection()
    const res = await this.conn.execute(sql)
    this.conn.commit(function(err) { // 提交事务
      console.log(err)
    })
    return res
  },
  // async convertClob(val, argName) {
  //   const value = await this.readLob(val[argName])
  //   await val[argName].close()
  //   return value.toString('utf-8')
  // },
  // 封装clob数据转换赋值
  async convertClob(value, argName) {
    for (const name of argName) {
      const data = await this.readLob(value[name])
      await value[name].close()
      value[name] = data.toString('utf-8')
    }
  },
  // 处理达梦数据库的clob数据类型
  async readLob(lob) {
    return new Promise(function(resolve, reject) {
      let blobData = Buffer.alloc(0)
      let totalLength = 0
      lob.on('data', function(chunk) {
        totalLength += chunk.length
        blobData = Buffer.concat([blobData, chunk], totalLength)
      })
      lob.on('error', function(err) {
        reject(err)
      })
      lob.on('end', function() {
        resolve(blobData)
      })
    })
  },
  // 创建连接池
  async createPool() {
    try {
      return this.db.createPool({
        connectString: 'dm://MXK:warsim888\@192.168.31.314:5236?autoCommit=false',
        poolMax: 10,
        poolMin: 1
      })
    } catch (err) {
      throw new Error('createDMPool error: ' + err.message)
    }
  },
  // 获取数据库连接
  async getConnection() {
    try {
      return this.pool.getConnection()
    } catch (err) {
      throw new Error('getDMConnection error: ' + err.message)
    }
  }
}
module.exports = CLASS

2、在项目接口中如何使用达梦数据库增删改查

// 1、首先需要在页面的最上方声明引入达梦数据库封装的来源
const DataBaseUtils = require('../utils/DataBaseUtilsDM')


// 2、其次就可以通过使用封装的方法来快速使用
const dm = new DataBaseUtils()
const sqlRes = await dm.select('SELECT * FROM scen_recording')

// 3、注意查询出的数据有时个别类型为clob类型,此类型不处理直接传给前端会报500错误,原因为clob类型数据其实是个函数,函数无法通过http传给前端
//    封装有快速转换的方法
for (const val of sqlRes) {
  // 处理达梦 clob 数据 ,数组中是要处理的具体参数
  await dm.convertClob(val, ['ScenID', 'ScenName'])
}

// 4、增删改和查询不同,在达梦数据库中,设计数据库变动的都需要执行完sql语句后提交事务才会更改数据库
//   所以增删改使用封装的delete方法来使用
const result = await dm.delete(`INSERT INTO scen_armyicon (scenId, guid, icon, direction)
    VALUES ('${scenId}','${guid}','${icon}','${direction}')`)
// 5、注意在达梦中返回的接口和mysql的判定成功不同,需对rowsAffected此参数进行判断是否成功影响
const insertSuccess = result.rowsAffected === 1

– 更为具体的要求配置访问 https://eco.dameng.com/document/dm/zh-cn/pm/nodejs-rogramming-guide.html 达梦官方文档

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐