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

