数据库版本:1-2-162-2023.03.28-185758-20018-ENT --03134283938-20230328-185758-20018 Pack4
集群架构:两节点DMDSC
操作系统:Kylin Linux Advanced Server release V10 (SP3)
CPU:Hygon C86 7265
预编译命令工具:dpc_new.exe
PROC使用的达梦客户端版本:DM Database 64 V8 03134283938-20221019-172201-20018,如下图所示。
应用程序在运行批业务时,执行pmdps104业务(结息),产生报错信息:无效的字符串或缓冲区长度,错误代码是SQLCODE-1044,如下图所示。。
报错问题已定位是这条sql产生-1044的报错,详细应用程序代码如下所示。
开启dpc日志,看看应用程序运行过程中的详细信息。如下图红色部分所示。
(1)将PROC原来使用的达梦客户端版本(8.1.2.162)换成8.1.3.162和8.1.4.73,还是报相同的错误信息。通过DPC日志信息分析发现,业务反映执行SQL语句报错的地方,在DPC日志中是正常的,字符串或缓冲区长度溢出并不是该SQL语句导致的。
(2)按照开发人员的建议,在所有PROC编译文件都加上了-DDM64宏,重新编译应用程序后。在客户端PROC8.1.4.73和PROC8.1.2.162测试,没有报错。业务人员把一个月的全部批量业务运行了测试,没有出现报错情况。
有些接口定义是slength类型,slength是根据宏控制的,只有这种宏情况可能导致溢出。如果在64位机器上编译,需要加上该选项。由于dpc_new在编译时需要使用DPItypes.h,而在DPItypes.h中定义了slength和 ulength类型。如果64位环境下编译应用时没加DM64宏,会导致DPI接口调用异常。
将所有PROC编译文件都加上了-DDM64宏,重新编译后进行测试。添加-DDM64宏方法如下图所示。
以上处理方法仅限于特定的数据库版本和PROC程序,实际处理方法请参考官方PROC使用手册。
文章
阅读量
获赞