C# 命令超时不会引发错误 私有无效NpgSqlGetContracts(IList con) { var conn=(NpgsqlConnection)数据库.GetDbConnection(); 列表合同=新列表(); 使用(var cmd=newnpgsqlcommand(“SELECT*FROM\“Contracts\”;”,conn)) { cmd.CommandTimeout=1; cmd.Prepare(); int conCount=cmd.ExecuteNonQuery(); 使用(var reader=cmd.ExecuteReader(CommandBehavior.SingleResult)) { while(reader.Read()) { 添加(MapDataReaderRowToContract(reader)); } } } }

C# 命令超时不会引发错误 私有无效NpgSqlGetContracts(IList con) { var conn=(NpgsqlConnection)数据库.GetDbConnection(); 列表合同=新列表(); 使用(var cmd=newnpgsqlcommand(“SELECT*FROM\“Contracts\”;”,conn)) { cmd.CommandTimeout=1; cmd.Prepare(); int conCount=cmd.ExecuteNonQuery(); 使用(var reader=cmd.ExecuteReader(CommandBehavior.SingleResult)) { while(reader.Read()) { 添加(MapDataReaderRowToContract(reader)); } } } },c#,npgsql,C#,Npgsql,在这里,我有这段代码来尝试postgres中的命令超时,我尝试在VisualStudio中使用断点在本地调试它。我尝试了ExecuteOnQuery和ExecuteReader两种方法。该查询花费了1秒以上的时间加载所有数据(我这里有300多万行)。但是命令超时设置为1秒。我想知道为什么它在这里没有抛出任何异常,我在这里配置错了什么 谢谢:)正如@hans kesting在上面所写的,命令超时不是对整个命令的累积,而是对每个产生I/O的调用(例如,Read)。从这个意义上讲,它的目的是帮助解决查询

在这里,我有这段代码来尝试postgres中的命令超时,我尝试在VisualStudio中使用断点在本地调试它。我尝试了ExecuteOnQuery和ExecuteReader两种方法。该查询花费了1秒以上的时间加载所有数据(我这里有300多万行)。但是命令超时设置为1秒。我想知道为什么它在这里没有抛出任何异常,我在这里配置错了什么


谢谢:)

正如@hans kesting在上面所写的,命令超时不是对整个命令的累积,而是对每个产生I/O的调用(例如,
Read
)。从这个意义上讲,它的目的是帮助解决查询运行时间过长(没有产生任何结果)或网络问题


您可能还想看看PostgreSQL,它是整个命令的PG端超时。它也有它的问题,Npgsql从不隐式地为您设置它-但您可以自己设置。

“当针对上下文连接执行命令时,CommandTimeout无效(连接字符串中打开的SqlConnection带有“context connection=true)”-这可能是您的情况吗?如果我正确地解释了中的第二个注释,每次调用
.Read()
都会重置超时。因此,在您的情况下,只要每次单独读取都在1秒内完成,您就不会超时。您可能应该处置
conn
对象,我希望您没有缓存它。感谢您的回复:)。我还有一个问题,关于BeginBinaryImport,我们在哪里设置命令超时?在连接字符串中?因为我在SqlServer中看到,在执行SqlBulkCopy时,它有BulkCopyTimeout,因此我们可以设置命令超时。自5.0以来,二进制导出器和导入器类型对此有一个新的超时属性-。
 private void NpgSqlGetContracts(IList<Contract> con)
    {
        var conn = (NpgsqlConnection)Database.GetDbConnection();

        List<Contract> contracts = new List<Contract>();

        using (var cmd = new NpgsqlCommand("SELECT * FROM \"Contracts\";", conn))
        {
            cmd.CommandTimeout = 1;

            cmd.Prepare();

            int conCount= cmd.ExecuteNonQuery();

            using (var reader = cmd.ExecuteReader(CommandBehavior.SingleResult))
            {
                while (reader.Read())
                {
                    contracts.Add(MapDataReaderRowToContract(reader));
                }
            }
        }
    }