暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM8达梦数据库C/C++常见问题

原创 达梦 2021-01-31
2590

DCI 接口关于 LOB 字段示例

LOB 方法:

  • OCILobGetLength
*用途:*返回大字段的长度,按字节计算。
*格式:*
sword OCILobG etLength ( OCISvcCtx *svchp,
OCIError*errhp,
OCILobLocator *locp,
ub4*lenp );
  • OCILobRead
*用途:*读取某个大字段中指定长度的内容。
*格式:*
sword OCILobRe ad ( OCISvcCtx *svchp,
OCIError*errhp,
OCILobLocator *locp,
ub4*amtp,
ub4 offset,
dvoid *bufp,
ub4 bufl,
dvoid*ctxp,
OCICallbackLobRead (cbfp)
( dvoid *ctxp,
CONST dvoid*bufp,
ub4 len,
ub1 piece
)
ub2 csid,
ub1 csfrm );

未发现数据源名称并且未指定默认驱动程序

【问题描述】

[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified.未发现数据源名称并且未指定默认驱动程序。[ISQL] ERROR: Could not SQLConnect。

【解决方法】

  • 第一种原因:odbc.ini 配置文件本身有问题,比如名称有空格。(odbc.ini 和 odbcinst.ini 中每行开头禁止留有空格)
  • 第二种原因:配置文件路径不对https://www.cndba.cn/dave/article/3846
  • /etc 下的 odbc.ini 文件,要是 linux 格式的文档。
  • linux 上部署 ODBC 需要有 DM 数据库的驱动,要装一个 DM 数据库。
  • 参考技术链接:https://mp.weixin.qq.com/s/cjKlLarr4arYV4WHWdd-jw

DSN 中,驱动程序和应用程序之间的体系结构不匹配

【问题描述】

“[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配”)/ODBC 数据源管理程序里没找到 DM 驱动。

【解决方法】

  • Win64 位系统有两个 ODBC 数据源管理器,分别为 64 位和 32 位。
    • 64 位 ODBC 数据源管理器路径是 C:\WINDOWS\system32\odbcad32.exe。
    • 32 位 ODBC 数据源管理器路径是 C:\WINDOWS\SysWOW64\odbcad32.exe。
  • Win64 位系统控制面板默认打开的 ODBC 数据源管理器是 64 位,在 Win64 系统安装 DM 版本后通过控制面板打开的 ODBC 数据源管理器发现找不到 ODBC 驱动,一般是由于安装的 DM 版本为 32 位,所以 64 位 ODBC 数据源管理器看不到,需要启动 32 位数据源管理器才可看到 ODBC 驱动。
    • 64 位应用程序只能调用 64 位 ODBC 驱动;
    • 32 位应用程序只能调用 32 位 ODBC 驱动;
  • 64 位应用程序调用 32 位 ODBC 驱动或 32 位应用程序调用 64 位 ODBC 驱动,都会提示以下错误:

Error: [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配。

ODBC 连接 DM 数据库,提示加密模块加载失败

【问题原因】

ODBC 接口调用依赖 libcrypt.so,程序执行时找不到 libcrypt.so。

【解决方法】

检查 bin 目录下存在 libcrypt.so,以及设置环境变量 LD_LIBRARY_PATH 指向 dmdbms/bin 目录。

communication error

【问题描述】

DM 数据库,MAX_SESSION=65000,在程序中没有设置 timeout 超时限制,C# 在插入数据库时会提示这个错误 communication error,循环插入前三万条可以,三万后就提示这个错误。

【解决方法】

检查 MAX_SESSION_STATEMENT 参数,检查每次插入是否新开了一个句柄,通过 select MAX(N_USED_STMT) from v$sessions;进行查看。

通过指定字符集的字符串获取字符集的 ID

【问题描述】

在进行对 DM 数据库编程时,使用 DM 的 DCI 用于兼容 Oracle 数据库的代码,在之前使用 Oracle 的 OCI 的编程的时候,可以通过 OCINlsCharSetNameToId 方法获取指定字符集的 id,現在在 DM 的 DCI 中未找到这个方法,在 DM 程序员手册也没有找到相关的 API 的说明。

【解决方法】

因为 DM 没有 NlsCharSetName 这个方法。DM 可以使用 SQL 语句 select UNICODE ();来获取指定字符集的 id。如果有兼容性需求,可通过对应销售或技术提需求。

ODBC 连接 DM 数据库报错

【问题描述】

ODBC 连接 DM 报错:can’t open lib’/opt/dmdbms/bin/libdodbc.so’:file not found 或者找不到.so 文件 error:could not SQLConnect。

【解决方法】

  • ldd /opt/dmdbms/bin/libdodbc.so 检查 libdodbc.so 依赖的文件是否有问题。
  • 依赖的 so 文件明明存在,但 ldd 仍提示找不到,一般是环境变量 LD_LIBRARY_PATH 设置问题。

解决方式:修改 /etc/profile.d 添加 LD_LIBRARY_PATH =$LD_LIBRARY_PATH: /opt/dmdbms/bin 设置,然后重新登录用户生效;或者 export 命令手动修改当前环境变量。

DmBulkCopy 提示[The faseloading dll not loading]

【问题描述】

DmBulkCopy 提示[The faseloading dll not loading],然后在 readme.txt 里面得知要引用 dmfldr_dll.dll 但是找到这个 dll。

【解决方法】

  • Linux 中把 DM 数据库的路径加到环境变量里面去。
  • Windows 的环境就把环境变量 path 加上 DM 数据库的路径。

linux 下 c++ 用 occi 访问

DM 数据库支持,头文件和库 DM 数据库都有,可以在安装目录下查询:

  • /opt/dmdbms/include/occi.h。
  • /opt/dmdbms/bin/libdmocci.so。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论