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

使用Npgsql执行PostgreSQL查询失败,EF Core可正常生成模型

解决Npgsql通过DbDataSource交互时的异常与0行结果问题
  • 关于System.NotSupportedException:
    这个异常是调试时查看command.Connection属性触发的,属于Npgsql的设计限制——从NpgsqlDataSource创建的命令,不允许直接访问Connection/Transaction这类属性。只要你的代码逻辑里不主动调用这些属性,就不会在运行时抛出异常,这个提示只是调试查看时的反馈,不是真正的运行错误。

  • 关于reader显示0行:
    执行ExecuteReader()后,数据指针默认停在结果集的第一行之前,必须调用reader.Read()才能开始读取数据。另外先确认table_test表确实存在且有数据,也可以先用SELECT 1这种简单查询验证是否能拿到结果。

修正后的代码示例

方式一:使用DataSource创建命令的正确写法

private static void NPGSqlTest()
{
    var connectionString = @"host=localhost;database=dev;username=postgres;password=*******";
    string query = "SELECT * FROM table_test";

    using var dataSource = NpgsqlDataSource.Create(connectionString);
    using var command = dataSource.CreateCommand(query);
    using var reader = command.ExecuteReader();

    // 调用Read()遍历结果集
    while (reader.Read())
    {
        // 根据实际列类型读取数据,示例为读取字符串类型的第一列
        Console.WriteLine(reader.GetString(0));
    }

    Console.Read();
}

方式二:手动打开连接的写法

private static void NPGSqlTest()
{
    var connectionString = @"host=localhost;database=dev;username=postgres;password=*******";
    string query = "SELECT * FROM table_test";

    using var dataSource = NpgsqlDataSource.Create(connectionString);
    using var connection = dataSource.OpenConnection();
    using var command = new NpgsqlCommand(query, connection);
    using var reader = command.ExecuteReader();

    while (reader.Read())
    {
        Console.WriteLine(reader.GetString(0));
    }

    Console.Read();
}

既然EF Core能正常生成模型,说明PostgreSQL的配置、连接字符串、用户权限都没有问题,不用怀疑这方面。你之前的核心问题是没有主动读取reader的数据,以及调试时误解了属性访问的异常提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:04