达梦数据库ODBC连接异常问题

2023-10-27

一、ODBC介绍

ODBC,即开放数据库连接Open Database Connectivity,是为解决 异构数据库间的数据共享而产生的一种数据库访问接口标准。ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。

二、unixODBC安装以及配置

unixODBC安装
tar -xzvf unixODBC-2.3.0.tar.gz
cd unixODBC-2.3.0
./configure --enable-gui=no
make && make install

直接编译安装,正常安装完毕后,查看ODBC版本以及配置信息如下:

查看ODBC版本:odbc_config --version 

查看ODBC配置信息: odbcinst -j

正常安装完成后,/usr/local/etc/odbcinst.ini 和 /usr/local/etc/odbc.ini 两个文件都是空的,需要我们手动写配置,具体配置如下:

odbcinst.ini中,DRIVER行配置为ODBC的动态链接库文件具体路径,这里注意千万不要配置错误

DERVER:动态链接库路径(如不确定,可以find搜索看下该文件具体路径,然后指定)

odbc.ini,即为当前需要登录的DM数据库具体地址以及账号密码端口号。

[dm8]:这里是执行isql命令后跟的参数名,可以任意指定,类似登录时的别名,注意命名冲突
SERVER:ip地址 
UID:用户名
PWD:用户密码
TCP_PORT:数据库实例对应的端口号

三、发现问题:连接报错

本身在安装完ODBC后,当前连接数据库是正常的,但是这本身属于测试环境,重启虚拟机再登录执行命令连接数据库,发现报错[ISQL]ERROR: Could not SQLConnect

首先确认我们数据库是可以正常登录的,即发起ODBC连接异常,首先加-v参数查看具体报错原因

报错提示动态链接库文件不存在:[01000][unixODBC][Driver Manager]Can't open lib '/dm8/bin/libdodbc.so' : file not found

根据该报错,我们先确认文件是否存在,发现实际上是有该文件的

文件存在的话,系统无法识别到,我们可以ldd命令看下这个文件的依赖是否出现问题:

ldd /dm8/bin/libdodbc.so 


 

[root@localhost ~]# ldd /dm8/bin/libdodbc.so 
	linux-vdso.so.1 =>  (0x00007ffda23df000)
	libdmdpi.so => not found
	libdmfldr.so => not found
	libdmelog.so => not found
	libdmutl.so => not found
	libdmclientlex.so => not found
	libdmos.so => not found
	libdmcvt.so => not found
	libdmstrt.so => not found
	librt.so.1 => /lib64/librt.so.1 (0x00007f77dcd39000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f77dcb1d000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f77dc918000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f77dc60f000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f77dc30d000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f77dbf4b000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f77dbd35000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f77dd184000)
[root@localhost ~]#

 从上面报错可以看出,这个动态链接库的依赖,libdm*总计8个其他动态链接库not found,而这些动态链接库,从命名上就可以看出是DM*达梦数据库的动态链接库文件,然后我们再确认这些文件是否存在:

结果发现报错的文件,在达梦安装目录下的bin目录下均存在;

文件存在而无法识别到,这里就想到了安装数据库时,一般都需要指定数据目录安装目录等,而系统在启动某个应用时,都会把这些指定的目录在某些配置文件里设置成变量,这里又属于重启虚拟机后才无法连接,因此基本上就可以判断出,大概属于设置的变量失效导致该问题 :

切换成数据库用户dmdba,vim $HOME/.bashrc 没有任何环境变量设置,即重启虚拟机,安装数据库时设置的那些变量就不生效了:

重新写入.bashrc永久设置环境变量

export PATH
export DISPLAY=:0 (这个是dmdba调用窗口安装数据库的配置,和上述问题无关)
export DM_HOME=/dm8
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm8/bin"
export PATH=$PATH:/$HOME/bin:$/HOME/.local/bin:$DM_HOME/bin 

执行source .bashrc重新加载配置,然后重新发起连接,至此问题解决。

了解更多达梦相关技术,也可访问学习达梦官网文档

DM 数据库快速上手指南 | 达梦技术文档

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

达梦数据库ODBC连接异常问题 的相关文章

  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • SQL:如何在按部分分组的查询中使用子查询?

    如何在按部分分组的查询中使用子查询 我使用 SQL Server 2008 R2 和 Delphi 2010 我收到此错误 Cannot perform an aggregate function on an expression cont
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 可以使用表通配符创建 sql 查询吗?

    这可能是一个简单的问题 但我无法在网上找到解决方案 任何帮助将不胜感激 我正在尝试在 PHP 中创建一个 SQL 查询 并希望以某种方式将通配符应用于 TABLE 过滤器 可能是这样的 select from table 但是 到目前为止我
  • 数据库表设计

    我在选择数据库表的变量类型时遇到问题 有人可以给我一些关于如何选择类型的一般准则吗 以下是我的一些问题 用户 ID 应该是什么 INT 看起来很小 因为设计时应该考虑到大量用户 那么如果不是 INT 还有什么呢 大整数 VARCHAR 难道
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹

随机推荐