You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用InterSystems Cache类获全局大小返回失败码但结果有效问题排查

问题:调用InterSystems Cache的GetGlobalSize方法返回有效结果但状态码错误

我使用intersys2.pythonbind3库访问InterSystems Cache 2018.1.x版本,连接代码如下:

import intersys2.pythonbind3 as pyb 

self.conn   = pyb.connection()
self.conn.connect_now(f'{url}[{port}]:%SYS', userName, password, None)

# 创建访问Cache/IRIS的对象
self.db     = pyb.database(self.conn)

尝试通过%Library.GlobalEdit.GetGlobalSize获取全局变量大小的代码:

# 清空按引用传递的变量
allocated = 0
used      = 0
chkFlg    = False
nxGlobal  = "STRELPERF"
                
# 设置按引用传递的参数列表
list = [db,nxGlobal,allocated,used,chkFlg]

# 执行类方法获取全局大小
res = self.db.run_class_method("%Library.GlobalEdit", <db>,"GetGlobalSize")

但调用%SYSTEM.Status.IsError检查状态时:

status = self.genClassMethod('%SYSTEM.Status','IsError',[res])

status始终返回1(表示错误),错误文本为(no error description),但allocated和used的数值是正确的。请问为何会出现这种矛盾情况?


问题原因及解决方法

1. 参数传递错误(核心问题)

%Library.GlobalEdit.GetGlobalSize的方法签名为:

classmethod GetGlobalSize(globalName As %String, ByRef allocated As %Integer, ByRef used As %Integer, checkFlag As %Boolean = 0, database As %String = "") As %Status

你的调用存在两个关键错误:

  • 参数顺序完全错误:原代码错误地将db作为第二个参数传递,且占位符<db>不符合调用规范
  • 引用参数未正确包装:allocated和used是按引用传递的参数,直接传数值无法被方法正确修改,也会导致状态异常

2. 修正后的代码实现

步骤1:用pyb.REF()包装引用参数

allocated = pyb.REF(0)  # 用REF包装引用参数
used = pyb.REF(0)
chkFlg = False
nxGlobal = "STRELPERF"
db_name = "你的数据库名称"  # 替换为实际数据库名,如USER

步骤2:正确调用run_class_method

# 按方法签名顺序传递参数:类名、方法名、globalName、allocated(REF)、used(REF)、checkFlag、database
res = self.db.run_class_method("%Library.GlobalEdit", "GetGlobalSize", nxGlobal, allocated, used, chkFlg, db_name)

步骤3:获取引用参数的实际值

调用后需要通过value属性获取结果:

print(f"已分配空间: {allocated.value}")
print(f"已使用空间: {used.value}")

3. 状态检查的验证

修正参数传递后,res会返回正确的%Status值,此时调用IsError就能得到准确的状态结果:

status = self.genClassMethod('%SYSTEM.Status','IsError',[res])
# 如果状态正常,status会返回0

额外注意

如果你的genClassMethod是自定义封装方法,需要确保它正确展开参数传递给run_class_method,比如:

def genClassMethod(self, className, methodName, args):
    return self.db.run_class_method(className, methodName, *args)

内容的提问来源于stack exchange,提问作者Kevin McGinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:40:38