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

.NET 6中使用Npgsql执行大查询遇数据长度超限错误求助

解决Npgsql连接Denodo执行大查询时的"Invalid data received"错误

错误原因

你遇到的错误是因为单条查询结果行的大小超过了Npgsql默认的最大允许长度(1048576字节/1MB),而非查询返回的总行数(29K行)问题。你之前添加的Read Buffer Size等参数是套接字层面的缓冲区配置,和这个单行数据长度限制无关,所以无法解决问题。

解决方案

1. 调整Npgsql的最大数据长度限制

在连接字符串中添加Max Data Length参数,设置一个足够容纳单行数据的数值(比如20MB,即20971520字节):

var connectionString = "Host=your-denodo-host;Port=your-port;Database=your-db;Username=user;Password=pass;Max Data Length=20971520";

这个参数会告诉Npgsql允许接收更大的单行数据,覆盖默认的1MB限制。

2. 检查Denodo的结果集配置

Denodo作为虚拟数据平台,可能自身也有结果行大小的限制:

  • 登录Denodo VDP管理员,进入服务器配置 -> 高级选项
  • 查找类似server.resultset.max_row_size的参数,确认其值是否足够大,若不足则调整为合适的数值后重启服务

3. 分批读取数据(可选优化)

如果单行数据确实过大,或者结果集整体内存占用过高,可以避免一次性将所有数据加载到DataSet中,改为逐行读取处理:

await using var dataSource = NpgsqlDataSource.Create(connectionString);
await using (var cmd = dataSource.CreateCommand(query))
await using (var reader = await cmd.ExecuteReaderAsync())
{
    var table = new DataTable();
    // 每次加载1000行进行处理
    table.Load(reader, LoadOption.Upsert, 1000);
    // 处理当前批次的数据
    while (!reader.IsClosed)
    {
        table.Clear();
        table.Load(reader, LoadOption.Upsert, 1000);
        // 继续处理下一批数据
    }
}

或者使用分页查询(如果Denodo支持),通过LIMIT和OFFSET分批次获取数据,降低单次查询的数据量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:55:19