调用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
相关产品推荐
相关产品推荐

