Ado.Net DataReader获取PostgreSQL列值报错求助(Asp.Net 6)
问题分析与解决
你的核心错误是误用了NpgsqlDataReader.GetDecimal()的参数:GetDecimal(int)方法需要传入的是结果集中列的索引位置(int类型),而你却把sum_amount列的实际数值当成索引传入,这完全不符合方法的使用逻辑,才引发了后续错误。
错误原因拆解
- 第一次错误:
Convert.ToInt32(reader["sum_amount"])把列值(如10000)转成int当索引,当数值超过结果集的列数量(你的查询只有2列,索引为0和1),或者数值本身超出Int32范围时,就会抛出OverflowException。 - 第二次错误:改成转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
相关产品推荐
相关产品推荐

