oracle windows server 2008,Node.js 在 Windows Server 2008 X64 连接Oracle 数据库

不需要安装Oralce客户端,不影响其它使用Oracle客户端的程序运行

安装Node.JS

node-v12.13.0-x64.msi

安装VC++ 2013运行时

vcredist_x64.exe

运行的版本要与Oracle 客户端匹配,

下载Oracle 客户端

instantclient-basiclite-windows.x64-18.5.0.0.0dbru.zip

解压并放到一个目录下:

C:\instantclient_18_5

写个Run.bat

REM mynode.bat

SET PATH=C:\instantclient_18_5;%PATH%

node dist/index.js

附源码

import oracledb from 'oracledb'

import http from 'http'

import urllib from 'url'

import _ from 'lodash'

let md5 = require('md5-node')

const oraConfig = {

connectString :'192.168.*.*:1521/orcl',

user: '****', // 登录oracle的用户名

password: '***' // 请换为实际密码

}

function doRelease (connection:oracledb.Connection) {

connection.close(

function (err) {

if (err) {

console.error(err.message)

}

})

}

var server:http.Server = http.createServer();

server.on('request', async (request, response)=>{

console.log('收到客户端的请求了,请求路径是:' + request.url);

let urlObj = urllib.parse(request.url, true);

if (urlObj.pathname === '/SyncDeviceConfig')

{

response.writeHead(200, { 'Content-Type': 'application/json;charset:utf-8' });

let jsoObj = await GetDeviceConfig(urlObj.query.version_code as string).catch((err)=>{

response.writeHead(406, err.message);

response.end(err);

return;

});

response.end(JSON.stringify(jsoObj));

}

else{

response.writeHead(404, { 'Content-Type': 'text/html' });

response.end('404 Not Found.')

}

});

server.listen(3000, ()=>{

console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')

})

async function GetDeviceConfig(OldVersionCode :string){

let connection:any;

connection = await oracledb.getConnection(oraConfig)

.catch(err=>{

console.error(err)

throw(err)

});

try

{

let SQL = "select ****";

const V3006 = (await connection.execute(SQL)).rows[0][0];

SQL = "select ****"

const V3007 = (await connection.execute(SQL)).rows[0][0];

SQL = "select *****"

const V3011 = (await connection.execute(SQL)).rows[0][0];

SQL = "select ****"

const V1040 = await connection.execute(SQL);

const mOrgCode = md5(`{"3006":${V3006}, "3007":${V3007}, "1040":[${_.join(V1040.rows.map((m:any)=>`{"NODEID":"${m[0]}","VERSION":${m[1]}}`))}]}`);

if (OldVersionCode === mOrgCode){

throw('already is new vesion!')

}

let jsonObj = {

version_code: mOrgCode,

publishTime : Date.now().toString(),

lines:Array()

};

SQL = `*****`;

let dtLine = await connection.execute(SQL)

jsonObj.lines = dtLine.rows.map( (drLine:any) =>({

lineID:drLine[0], lineName:drLine[2]

}))

for(let lineNode of jsonObj.lines){

lineNode.stations = await FillLineStations(connection, lineNode.lineID)

}

return jsonObj;

}catch(err){

console.error(err);

throw (err)

}finally {

if (connection) {

try {

await connection.close();

} catch (err) {

console.error(err);

}

}

}

}

let FillLineStations = async (connection:oracledb.Connection, LineID:string) =>{

const SQL = `******`;

let dbStations = await connection.execute(SQL)

let r = dbStations.rows?.map((drStation:any)=>({

Node:drStation[0], StationName:drStation[1], IP:drStation[2], Port:drStation[3],

devices:Array.of()

}));

if(r)

{

for(let StationNode of r){

StationNode.devices = await FillStationDevices(connection, StationNode.Node)

}

}

return r;

}

let FillStationDevices = async (connection:any, StationNodeID:string)=>{

const SQL1040 = `*******`;

const V1040 = (await connection.execute(SQL1040, [StationNodeID], { maxRows: 1 } ));

if (V1040 == null || V1040.rows === null || V1040.rows?.length === 0 )

return []

let iv1040 = V1040.rows[0][0];

const SQL_DEVICE = `******`;

let devices = (await connection.execute(SQL_DEVICE))

if (devices.rows)

return devices.rows.map((drDevcie:any)=>({

DeviceCode:drDevcie[4], Node:drDevcie[0], DeviceType:_.trim(drDevcie[1]),IP:drDevcie[2], OS:'', Port:_.toNumber(drDevcie[3])

}))

else

return []

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中end 1 意思_python中“end=”是什么意思?_后端开发

c语言fopen函数的用法_后端开发在c语言中可以使用“fopen()”函数打开一个文件,该函数用于打开一个文件,其语法是“open(“file a”,”r”);”,其参数r表示只读属性。python中“end”是“print()”函数中的一个参数,会使该函数关闭…

oracle如何收缩表空间,ORACLE收缩表空间

最近导一个空库到数据库后,发现占用的表空间非常大,执行表收缩(SHRINK SPACE CASCADE)后,发现实际占用的空间不到1%。 但是收缩表空间大小提示错误 ALTER DATABASE DATAFILE D:\ora_tablespace\GCOMM2.dbf RESIZE 5000M; 提示&#x…

python 类 对象 知乎_python基础知识:类,对象,模块三者的区别

长话短说,我线代作业还没有写呢。有点编程语言知识的朋友应该知道,编程语言有“面向对象”和“面向过程”两种。解释一下:面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计。面向对象程序设计技术…

linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置

随着生活水平的提高,人们对USB设备的使用也越来越多,鉴于Linux在硬件配置上尚不能全部即插即用,因此关于Linux如何配置和使用,成为困扰我们的一大问题。本文引用地址:http://www.eepw.com.cn/article/70029.htmlinux操…

python的数据库中间件_数据库中间件设计方案

数据库中间件的主要作用是向应用程序开发人员屏蔽读写分离和分库分表面临的挑战,并隐藏底层实现细节,使得开发人员可以像操作单库单表那样去操作数据。在介绍分库分表的主流设计方案前,我们首先回顾一下在单个库的情况下,应用的架…

linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?本文主要阐述 Linux 的目标文件(有可重定位目标文件、可执行目标文件和共享目标文件三种形式),并把重点放在其格式和案例分析上。注:一般情…

python源码脚本实例_python编写一个会算账的脚本的示例代码

python算账脚本1.假如小明卡里有10000元去商场买东西发现钱不够又向父母借了5000账单如下2.以下脚本就能实现上面的运算from time import strftimeimport pickleimport ostry:def save():data strftime(\033[35m%Y-%m-%d\033[0m)money int(input(How much do you have to sav…

linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区

平常总说cpu的位数,其实说的是cpu一次能运算的最长整数的宽度,既ALU(算术逻辑单元)的宽度。cpu的位数也是数据总线的条数数据总线:数据线的总和,数据线就是cpu与内存进行数据传递的通道,一条数据线,一次可以…

2019 d serv 激活_化疗过程中肌肉减少症的发生机制及维生素D、ω-3脂肪酸的作用...

文章来源:蔡丽雅,赵文芝,杨振鹏,贺源,邓丽,张艳,石汉平.肿瘤化疗过程中肌肉减少症的发生机制及维生素D、ω-3脂肪酸的作用[J].中国医学前沿杂志(电子版),2020,12(1):13-19.正 文1998年,Baumgartner等【1】首次提出“肌肉减少症”的概念,用以描…

电脑鸿蒙运行Linux程序,Linux下的Hi3861一站式鸿蒙开发烧录(附工具)-鸿蒙开发烧录工具软件电脑版-东坡下载...

HarmonyOS 智能设备一站式集成开发环境,支持 HarmonyOS 组件按需定制、一键编译和烧录、可视化调试、分布式能力集成等,帮助开发者高效开发和创新新硬件。介绍2021春节前夕,华为发布了 HUAWEI DevEco Device Tool 2.0 Beta1,整体提…

终端软件_DMSTerminal现场管控终端软件正式发布

目前军工企业的信息化建设及管理大多停留在企业内部的管理层,各种任务信息、作业流程等无法直接下达到真正的一线现场层,导致工作在一线的大量技术人员仍然使用传统的纸质工单、纸质记录、口头交流等工作模式进行现场工作。很多工作模式普遍都是以人力来…

深度残差网络_注意力机制+软阈值化=深度残差收缩网络

顾名思义,深度残差收缩网络是由“残差网络”和“收缩”两部分所组成的,是在“残差网络”基础上的一种改进算法。其中,残差网络在2016年斩获了ImageNet图像识别竞赛的冠军,目前已经成为了深度学习领域的基础网络;收缩就…

linux 网络io命令详解,Linux下五种网络IO模型详解

本文我们主要来了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, asynchronous IO的基本原理,更好的理解在高级语言中的异步编程,一起来看看吧,希望对大家学习linux有所帮助。…

在python语言中语句的续行符是_Python程序设计课后习题答案-第二单元(2页)-原创力文档...

习题 2一、选择题1.流程图中表示判断框的是( )。BA.矩形框 B .菱形框 C .平行四边形框 D .椭圆形框2 .下面不属于程序的基本控制结构的是( )。DA.顺序结构 B .选择结构 C &#xff0…

linux 终端显示白底,mac终端使用Item2无法显示颜色的解决方法

item2是mac,linux下非常好用的一款终端机,可自行配置主题并支持tab等多种功能。还在用单调的item吗?不妨试试item2吧!安装完后发现item2终端是没有颜色的(白底黑字),究其原因是Mac终端机预设是没有颜色区分的&#xff…

pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10

本文目的:记录一下整个折腾过程,整理一下实现这一过程中看的资料,最重要的是我怕过段时间我给忘了。。。 虽然参照了不少过来人写的教程,但是还是遇到不少坑,反反复复折腾了一个月的时间(平时上班,只有晚上和周末能整一会)。 unraid我也折腾过了,确实不错,但是我没搞通…

linux kears 切换后端,如何更改Keras后端(哪里是json文件)?

我安装了Keras,并希望将后端切换到Theano . 我检查了this post,但仍然不知道在哪里放置创建的json文件 . 另外,下面是我在Python Shell中运行 import keras 时遇到的错误:使用TensorFlow后端 . 回溯(最近一次调用最后一次)&#x…

openstack资源使用汇总_关于OpenStack的学习路线及相关资源汇总

首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更深层次的理解&#xff0c…

安卓与Linux共存,Android和Linux重新合并成一个操作系统

Linux又回到了Android中,Android又回到了Linux中。Android一直都是Linux,但多年来Android项目走了自己的路,它的代码没有被合并回主Linux树中。现在,比Linux的创始人和主要开发人员Linux的预期要快得多,Android已经正式…

edit控件自动换行 mfc_VS2010/MFC编程入门:如何创建对话框模板和修改对话框属性?...

创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。在本节…