EZDML 数据建模

超轻量级的免费数据建模工具

0%

EZDML连接数据库——ORACLE和达梦

ORACLE

本文主要讲ORACLE(顺便讲下达梦),毕竟是数据库老大,比较复杂,我用ORACLE的时间也较长,会稍啰嗦几句。

连接ORACLE时,数据源格式为:数据库服务IP:端口/SID,如:127.0.0.1:1521/ORCL。点配置按钮可以弹出配置界面:

ORACLE连接配置

如果在配置文件里配置了本地服务名(network\admin\tnsnames.ora),也可以直接用本地服务名:

本地服务名

OCI驱动

JAVA程序员都知道JAVA连接数据库一般是使用JDBC驱动,但EZDML不是JAVA程序,它是原生程序,不需要JAVA虚拟机,所以它连接数据库是需要原生驱动的。通过ODBC连接也算是原生驱动,EZDML后来还添加了JDBC的支持,但JDBC和ODBC能获取的元数据信息相对受限,我们还是推荐用纯原生驱动为主。

EZDML所有版本都没有提供ORACLE的驱动,需要用户自行下载安装驱动。不是不想提供,而是ORACLE的驱动实在太庞杂了,动不动上百MB的,各个版本还不兼容,惹不起。

ORACLE原生的驱动名为OCI(Oracle Call Interface),我们主要目的就是获得可用的OCI(oci.dll、libociei.so、libociei.dylib)。

ORACLE的原生安装程序,从大到小可分为数据库、客户端和精简即时客户端(InstantClient)三种,它们都带了足够的OCI驱动功能,你机上只需要有一种就行了。如果你机上啥也没有,那下载最小的即时客户端(InstantClient,大概几十到上百MB不等)就行了。

从平台版本来说,ORACLE提供了Win32、Win64、MacOS 32/64、Linux 32/64等各种平台的版本。不同平台版本的EZDML需要不同的ORACLE驱动。

Win64 / Win32 区别

任务管理器

OCI有区分32位和64位的,EZDML windows版也保留了32位的。有些人可能分不清Win64和Win32的区别。十几年前的电脑一般只有几百甚至几十MB的内存,相应的操作系统win98、win XP、win2000之类的一般也都是32位的,Win32程序能用的最大内存是2的32次方(4,294,967,296),即4G(实际上windows限制你只能用到2G),那时候ORACLE也是32位的,当时是完全足够用了(嗯,那时CPU多是32位的,给你64位的也跑不了)。

在相当长的一段时间里,我们在Windows下用的PL/SQL Developer和各种数据库设计管理工具都是32位的,直到现在Win32程序仍然大行其道。

随着CPU内存的提升,现在大家装的windows一般都是64位的了,内存上限是…管它呢,谁在乎,反正咱这辈子估计都摸不到顶。不过64位的windows仍然兼容32位的程序,因此可以同时运行win32和win64程序,比如我在我机上就能同时运行EZDML for win64和EZDML for win32,任务管理器里能看出来一个程序是win32还是win64的:

32位和64位

长远来说,EZDML也会淘汰win32版。但有不少用户包括我自己都还在用win32的数据库驱动,因此暂时仍然提供win32版,不过仍建议win32用户尽量还是转到win64,跟上时代的潮流。

EZDML未提供linux和Mac OS的32位版(来晚了,没赶上),因此linux/Mac用户就不会有这个困扰了,全部选高大上的64位。

OCI设置

前面说了,ORACLE原生的驱动名为OCI,我们主要目的就是获得可用的OCI(oci.dll、libociei.so、libociei.dylib)。

如果你机上有PL/SQL Developer或Navicat,且已经能连上ORACLE,则应该已经有OCI驱动了,理论上EZDML也能共用这些驱动。你可以尝试直接连一下。注意PL/SQL Developer和Navicat也区分32位和64位,windows下要根据情况选择EZDML for win32/win64。

如果直接连提示无法加载oci,你可以找到oci的位置,并在EZDML的工具设置里指定(中文数据库需要同时指定语言):

OCI设置

还是加载不了的话,就需要另行获取OCI驱动了。

数据库自带驱动

上面说了ORACLE的驱动安装分数据库、客户端和超精简即时客户端(InstantClient)三种,如果你本机上已经安装了ORACLE数据库,那你就已经有64位的OCI驱动了(理论上也有一点点点点可能是32位的,但现在的数据库基本都是64位,应该没有人会装32位的了)。

这种情况适合服务器上安装或维护ORACLE数据库的情形,已经有数据库的情况下直接用64位的EZDML就行了。

下面以win64为例(Mac一般不当服务器用就不说了,Linux服务器我没试过,毕竟linux服务一般只用命令行不开桌面远程),你会在ORACLE数据库的BIN目录下找到64位的oci.dll(这服务器不是我装的,不知为何ORACLE默认会装在/app目录,我一般会改成用/oracle目录):

数据库自带OCI

正常来说,数据库安装程序会把BIN目录加到PATH环境变量里:

数据库环境变量

因此打开EZDML(win64版),直接就可以连接了:

直接连接

如果你机上环境变量设置有问题,EZDML找不到BIN\oci.dll,也可以在工具设置里指定一下(这种情况往往需要同时指定语言):

OCI设置

ORACLE客户端

ORACLE提供一些客户端管理工具,DBA不想每次都远程到数据库服务器去维护,就会在自己机上安装这些管理工具。

不建议你专门安装ORACLE客户端,但如果你是DBA或ORACLE的资深专家,你机上多半已经安装了ORACLE的客户端管理工具,那你也可以直接从BIN目录中获得OCI(写完这段突然感觉自己很蠢,人家DBA或资深还用你教啊)。

简单点说,如果你机上有这个Net Manager,但没有数据库,那你就是已经装了ORACLE客户端了,可以直接用它的OCI了:

Oracle Net Manager

示例这台机的ORACLE客户端OCI在这个位置:

OCI位置

注意ORACLE客户端区分32位和64位的,这两者可以同时存在,有时候我们可能同时安装了32和64位的ORACLE客户端,比如我正在操作截图的这台机上恰好就同时有32位的ORACLE客户端:

32位OCI位置

原因是因为我们要跑的程序有32位也有64位的。

安装ORACLE客户端远比安装EZDML麻烦,如果你机上已经有可用的windows ORACLE客户端了,建议就根据情况选用EZDML for win64或win32版。如果没有,请接着往下看。

即时客户端 Instant Client

如果你机上啥也没有,就去ORACLE官网下载个Instant Client。

如果你机上有能连接数据库PL/SQL Developer或Navicat,那理论上你已经有OCI驱动了。不过如果你找不着它们,或着它们放在EZDML上不好使,那再为EZDML下载多一个InstantClient也是可以的,互不影响。

没什么特殊的话你应该要下载64位的Instant Client。以下内容以win64为例,还用Win32版的应该都是熟手,我就不具体说明了。

网上搜索一下InstantClient,很容易能找到ORACLE的官网下载地址。下载需要登录ORACLE帐号,没有的可用邮箱注册一个。这地址会变化,以前文档里写的链接都失效了,所以我这次我不写死了。如果中文站下载不了,可试试转到英文站:

下载Instant Client

IntantClient会有基本版Light版,建议用基本版,不要用Light版,Light版连中文数据库容易懵。

注意数据库版本号一定要选对,最好跟你的数据库一模一样,至少前面几位要一样,不然可能会有各种奇怪问题:

下载Instant Client

下载后解压,比如我ORACLE常用11.2G,我机上解压到这里了:

InstantClient解压

然后要设置一下OCI的路径(设置完要重启EZDML),我的EZDML for win64的设置如下:

Instant Client OCI设置

理论上来说,到这一步,你就可以连上ORACLE了:

InstantClient连接ORACLE

如果还是连不上,可尝试用JDBC,参考后面JDBC的说明。

Linux版连接

以CentOS6为例(为什么是CentOS6?因为手头刚好有个CentOS6虚拟机),下载相应的InstantClient(不好意思,ORACLE中文站点下载有点问题,我在英文站下的;CentOS6的浏览器有点问题,我在Windows下用chrome下载好再拖进去的):

下载Instant Client

下载后直接解压,我是解压到/root/Downloads下:

Instant Client解压

接下来有一个比较重要的工作,就是把oci的路径添加到环境变量,如果需要可能要安装libaio,反正Oracle的文档怎么说咱就怎么干:

Instant Client设置

Instant Client环境变量

我这里偷懒就直接export LD_LIBRARY_PATH运行了:

1
2
export LD_LIBRARY_PATH=/root/Downloads/instantclient_11_2:$LD_LIBRARY_PATH
./ezdml_x

然后在设置中指定OCI:

Instant Client OCI设置

连接:

Instant Client连接ORACLE

一切顺利地话,就可以愉快地玩耍了:

Instant Client连接成功

才发现界面是英文的,应该是这个CentOS默认语言设置成英文了。图都截完了,不影响结果先不理了吧。把界面调回中文截个图凑数:

中文界面

MacOS版连接

MacOS也演示一下,操作系统是这个版本,显然也是虚拟机了:

MacOS系统信息

下载相应的Instant Client(注意要64位的)并直接解压:

Instant Client下载

不过这里有个尴尬的事,11.2的InstantClient我死活加载不成功:

Instant Client加载失败

尝试各种环境变量路径设置,有次貌似差一点点还是失败了:

Instant Client连接失败

换成12.2的InstantClient就好了(指定OCI就行了,其它啥路径环境变量都不用设置):

Instant Client 12.2

我估计是不是我用的FCL SqlDB连接控件里OCI有些接口11.2没实现的,反正12.2的驱动用来连11.2也很正常(打脸了,刚才谁说版本号一定要一样来着):

Instant Client连接成功

好吧,估计是ORACLE的问题,这锅必须甩。

通过ODBC连接

如果找不到合适驱动连不上数据库,可考虑用ODBC。大部分数据库都提供了ODBC的标准驱动安装程序,在ODBC数据源里配置好连接后就可以直接使用了。

EZDML本身有一个ODBC连接,但它是采用通用方式处理,无法针对ORACLE导入和生成个性内容,通过ODBC获取元数据往往会有缺失或错误。

从V3.58版开始,EZDML的ORACLE连接支持ODBC驱动,在连接配置窗口中增加了DSN或ODBC连接字符串的配置:

选择DSN后,输入登录用户和密码,点确定连接:

当选择ODBC连接时,除了连接驱动换成ODBC,其它跟平时是一样的。

使用ODBC连接有时会遇到中文乱码问题,需要设置字符集编码,参见《EZDML连接数据库——ODBC》。

通过JDBC连ORACLE

如果你的系统环境复杂,实在没办法用OCI,而且你对JAVA运行环境有一定的了解,则可以考虑用JDBC连接。

参见《EZDML连接数据库——JDBC》。

中文乱码

中文ORACLE数据库一般就两种字符集编码:GBK、UTF8。

但具体到EZDML,就涉及数据库、OCI和EZDML三者之间的编码。首先OCI的编码要与数据库一致,这个一般是设置NSL_LANG环境变量来实现;然后EZDML要能识别出数据库的编码。

EZDML本身现在是UTF8编码,它在登录ORACLE数据库后会尝试识别数据库编码,如果发现数据库也是UTF8就什么都不用管,如果发现是GBK则会进行转换,转成UTF8再在界面上显示出来。

如果出现乱码,可能是因为数据库的字符集和ORACLE客户端(OCI)的字符集不匹配导致的,也可能是EZDML未正确识别字符集。可修改一下设置里的NSL_LANG选项,则可以同时让EZDML和OCI都设置成对应的字符集编码:

NLS_LANG语言设置

我总结了几种常用的设置,正常你来回猜测设置重启几下就够了,中文数据库多半就是前两项中选一个。

不过,如果你非要自己去讲究一下也可以,关于字符集问题网上有很多文章说明,以下几个SQL有助于你查询数据库字符集:

数据库:

1
2
3
select *
from nls_database_parameters
where PARAMETER in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET')

客户端:

1
2
3
select *
from nls_instance_parameters
where PARAMETER in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET')

当前事务:

1
2
3
select *
from nls_session_parameters
where PARAMETER in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET')

或:

1
select userenv('language') from dual

修改客户端字符集的办法,是设置环境变量NLS_LANG,其组成规则为:
NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET

如:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

EZDML新版在设置里直接修改NLS_LANG后,程序启动时会自动将其写入临时环境变量。

达梦DAMENG

达梦跟ORACLE较亲近,对ORACLE的兼容性较好,我感觉它基本上就是为了替换ORACLE,因此把它放在ORACLE这一章。

我最早听说达梦是…好多年前,那时提倡核高基,国产数据库没现在火。当时只是觉得ORACLE太贵了不适合小项目,又不愿意转向其它MySQL之类的,想找个便宜点的替身,就了解了一下达梦;后来没多久,发现ORACLE搞了个XE版,一个CPU免费用4GB空间,虽然紧巴点对小项目也勉强够用,就没继续关注了。不过达梦给我留下的印象很好,从底层自研,坚持走到现在不容易。当然某些方面跟ORACLE比还是有些差距,但已经很不错了。

EZDML没有专门的达梦连接方式,当然你可以通过JDBC或ODBC连接。不过达梦在windows下提供了OCI的驱动,32位和64位的都有,因此这里举例说一下。

DM管理工具

装完达梦管理工具后,在drivers下会有个oci目录,里面有dmoci.dll,就是达梦版的oci了:

达梦DMOCI

如果你机上没有drivers/oci目录也不要紧,找达梦的技术支持要一份就行(从互联网下载的安装包好像是没有提供dmoci的)。

要注意32位/64位的区分,我截图这台机上装的这个不巧是32位的,所以我要运行EZDML for win32版,设置OCI路径指定dmoci.dll:

DMOCI设置

然后连接达梦”ORACLE“数据库,注意数据源这里主要是IP和端口,后面那个/ORCL对达梦是没什么用的,只是为了兼容ORACLE需要随意填一个:

DMOCI连接达梦数据库

连接成功,尝试导入:

达梦数据库连接成功

导入结果:

导入结果

64位的我试过了跟32位的没什么区别,就是dmoci.dll换成64位的,EZDML换成win64版:

64位DMOCI

接下来就跟ORACLE一样操作没什么区别了。

另外达梦提供了ODBC和JDBC的驱动,OCI驱动有问题时也可以退而求其次考虑通过ODBC或JDBC连接。

SQL Server

参见《EZDML连接数据库——SQL Server

MySQL

参见《EZDML连接数据库——MySQL

PostgreSQL

参见《EZDML连接数据库——PostgreSQL和人大金仓

SQLite

参见《EZDML连接数据库——SQLite

ODBC

参见《EZDML连接数据库——ODBC

JDBC

参见《EZDML连接数据库——JDBC

HTTP

参见《EZDML连接数据库——HTTP连接扩展