从 NpgsqlDataReader 获取查询结果

本文关键字:结果 查询 获取 NpgsqlDataReader | 更新日期: 2023-09-27 18:35:58

这是我的函数:

public int gtCountCertificatByExercice()
{
    DataTable resDataTable = new DataTable();
    DBConnection dbConnection = new DBConnection();
    string query = "SELECT COUNT(id) AS nb_cert " +
                   "FROM crs_certificat " +
                   "WHERE id_exercice = " + IdExercice + " ";
    NpgsqlConnection conn = dbConnection.Conn;
            
    NpgsqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = query;
    Int32 nbCertByExercice = 0;
    try
    {
        conn.Open();
        NpgsqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            nbCertByExercice = reader.GetInt32(0);
        }
        MessageBox.Show("" + nbCertByExercice);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.StackTrace);
        MessageBox.Show(ex.Message);
    }
    conn.Close();
    return nbCertByExercice;
}

我总是收到此错误:"指定的演员表无效"!
但是当我使用它时:

while (reader.Read())
{
    nbCertByExercice = Int32.Parse(reader["nb_cert"].ToString());
}

它工作正常!
我对日期时间类型也有同样的问题!!
我应该怎么做直接获取字段的类型?

从 NpgsqlDataReader 获取查询结果

为什么不使用 ExecuteScalar 进行查询?

取代

 NpgsqlDataReader reader = cmd.ExecuteReader();
 while (reader.Read())
 {
     nbCertByExercice = reader.GetInt32(0);
 }

nbCertByExercice  = (Int32) cmd.ExecuteScalar();

当你有行要控制时,你应该使用 reader,executeScalar 来获取查询第一列的第一个值,执行非查询来执行插入、删除等操作

更新

查看文档,您可以看到COUNT的返回类型是int而不是INt32。当您执行时

reader.GetInt32(0);

你得到 InvalidCastException,因为它不做类型的显式转换(参考这里)。

为无效强制转换或显式转换引发的异常 转换。

否则,当您执行Int32.Parse时,它总是尝试转换,如果失败则会出现异常。

在您的情况下,该值始终有资格转换为 int32,但由于不同的类型reader.GetInt32无法知道;另一方面,Int32.Parse尝试并成功。