使用TempDB表作为窗体数据源时数据不显示的问题求助
解决TempDB表作为窗体数据源无法显示数据及linkPhysicalTableInstance调用异常问题
核心问题定位
你遇到的报错:
非静态字段、方法或属性'TestSearchTableEnumFormCopy.TestEnumInfoTempDs'需要对象引用。
本质是直接通过类名访问窗体的非静态数据源对象,TestEnumInfoTempDs是窗体的数据源实例,属于非静态成员,不能用类名直接调用,必须获取窗体上的数据源缓冲实例。
具体修正步骤
1. 修正linkPhysicalTableInstance的调用方式
替换原错误代码:
TestEnumInfoTempDs.linkPhysicalTableInstance(tempTable);
改为获取窗体数据源的实例后再调用:
TestEnumInfoTempDs formDataSourceBuffer; // 获取窗体上对应数据源的缓冲实例 formDataSourceBuffer = this.dataSource(tableNum(TestEnumInfoTempDs)).cursor(); // 关联物理实例 formDataSourceBuffer.linkPhysicalTableInstance(tempTable); // 强制刷新数据源,触发窗体数据显示 this.dataSource(tableNum(TestEnumInfoTempDs)).executeQuery();
2. 确保临时表实例的一致性
- 确保
tempTable是窗体级别的成员变量,而非populate方法中的局部变量,否则填充的数据不会被后续的关联操作获取到。 - 在窗体
init方法中,初始化数据源缓冲时要正确绑定临时表实例:
public void init() { TestEnumInfoTempDs dsBuffer; super(); // 初始化窗体数据源的临时表缓冲 dsBuffer = this.dataSource(tableNum(TestEnumInfoTempDs)).cursor(); // 将窗体级tempTable与数据源缓冲关联 dsBuffer.setTmpData(tempTable); }
3. 调整rePopulate方法的逻辑
确保rePopulate方法中填充数据的是同一个窗体级tempTable实例,示例:
public void rePopulate(FormStringControl _inputControl) { EDTType inputValue = _inputControl.valueStr(); ; // 先清空临时表原有数据(可选) tempTable.delete(true); // 插入新数据到窗体级tempTable insert_recordset tempTable (Field1, Field2, Field3) select Field1, Field2, Field3 from SourceTable where SourceTable.FilterField == inputValue; }
4. 按钮clicked方法的完整逻辑
public void clicked() { FormStringControl inputControl = this.design().controlName(formControlStr(TestSearchTableEnumFormCopy, InputControl)); ; super(); // 调用重填充方法 this.rePopulate(inputControl); // 关联临时表实例并刷新显示 this.dataSource(tableNum(TestEnumInfoTempDs)).cursor().linkPhysicalTableInstance(tempTable); this.dataSource(tableNum(TestEnumInfoTempDs)).executeQuery(); }
额外检查项
- 确认临时表的TempDB类型设置正确(属性中
TableType为TempDB)。 - 检查窗体数据源的
Visible属性为Yes,且对应的网格控件已正确绑定数据源字段。 - 验证临时表的权限设置(
ConfigurationKey和SecurityKey),确保当前用户有权限访问该表。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

