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

Ado.Net DataReader获取PostgreSQL列值报错求助(Asp.Net 6)

问题分析与解决

你的核心错误是误用了NpgsqlDataReader.GetDecimal()的参数:GetDecimal(int)方法需要传入的是结果集中列的索引位置(int类型),而你却把sum_amount列的实际数值当成索引传入,这完全不符合方法的使用逻辑,才引发了后续错误。

错误原因拆解

  1. 第一次错误:Convert.ToInt32(reader["sum_amount"])把列值(如10000)转成int当索引,当数值超过结果集的列数量(你的查询只有2列,索引为0和1),或者数值本身超出Int32范围时,就会抛出OverflowException。
  2. 第二次错误:改成转Int64后,GetDecimal()只接受int类型参数,因此出现类型不匹配的编译错误。

正确写法

以下是三种可行的正确方式,任选其一即可:

方式1:通过列名获取索引后调用GetDecimal

while (reader.Read())
{
    // 获取sum_amount列的索引位置
    int sumAmountIndex = reader.GetOrdinal("sum_amount");
    var amount = reader.GetDecimal(sumAmountIndex);
    result.Add(amount.ToString());
}

方式2:直接强转列值为decimal

这是最简洁的写法,只要数据库列类型和decimal兼容即可:

while (reader.Read())
{
    var amount = (decimal)reader["sum_amount"];
    result.Add(amount.ToString());
}

方式3:使用Convert.ToDecimal转换

while (reader.Read())
{
    var amount = Convert.ToDecimal(reader["sum_amount"]);
    result.Add(amount.ToString());
}

完整修正后的代码

var query = "select transmission_time, actual_transaction_amount as sum_amount FROM table_name";

using (NpgsqlConnection conn = new NpgsqlConnection("connectionString"))
{
    conn.Open();
    NpgsqlCommand command = new NpgsqlCommand(query, conn);

    using (NpgsqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var amount = (decimal)reader["sum_amount"];
            result.Add(amount.ToString());
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:15:42