🐛 fix(query-editor): 修复 SQL Server 多查询冗余影响行数结果

- 将 SQL Server 成对返回的数据结果与 affectedRows 归属同一语句
- 保留 DML 影响行数与存储过程真实多结果集
- 补充后端正反用例及 V2 结果标签回归测试
This commit is contained in:
Syngnat
2026-07-12 09:37:29 +08:00
parent ef5e344c4f
commit 0b33b3a683
3 changed files with 137 additions and 0 deletions

View File

@@ -1085,6 +1085,53 @@ describe('QueryEditor external SQL save', () => {
expect(messageApi.success).toHaveBeenCalledWith('已执行完成,生成 1 个结果集。');
});
it('hides redundant sqlserver affected-row status results for every statement in a batch', async () => {
storeState.appearance.uiVersion = 'v2';
storeState.connections[0].config.type = 'sqlserver';
storeState.connections[0].config.database = 'master';
backendApp.DBQueryMulti.mockResolvedValueOnce({
success: true,
data: [
{ statementIndex: 1, columns: ['value'], rows: [{ value: 1 }] },
{ statementIndex: 1, columns: ['affectedRows'], rows: [{ affectedRows: 1 }] },
{ statementIndex: 2, columns: ['value'], rows: [{ value: 2 }] },
{ statementIndex: 2, columns: ['affectedRows'], rows: [{ affectedRows: 1 }] },
],
});
let renderer!: ReactTestRenderer;
await act(async () => {
renderer = create(<QueryEditor tab={createTab({ dbName: 'master', query: 'SELECT 1;\nSELECT 2;' })} />);
});
await act(async () => {
await findButton(renderer!, '运行').props.onClick();
});
await act(async () => {
await Promise.resolve();
await Promise.resolve();
});
const rendered = textContent(renderer!.toJSON());
expect(rendered).toContain('结果 1');
expect(rendered).toContain('结果 2');
expect(rendered).not.toContain('结果 3');
expect(rendered).not.toContain('结果 4');
expect(rendered).not.toContain('影响行数1');
expect(messageApi.success).toHaveBeenCalledWith('已执行完成,生成 2 个结果集。');
const resultTabButtons = renderer!.root.findAll((node) =>
node.type === 'button' && String(node.props['data-tab-key'] || '').startsWith('result-'));
expect(resultTabButtons).toHaveLength(2);
await act(async () => {
resultTabButtons[1].props.onClick();
});
expect(dataGridState.latestProps?.columnNames).toEqual(['value']);
expect(dataGridState.latestProps?.data?.[0]).toMatchObject({ value: 2 });
});
it('prefers the first displayable sqlserver procedure result when empty result sets are returned', async () => {
storeState.connections[0].config.type = 'sqlserver';
storeState.connections[0].config.database = 'hydee';