从 NpgsqlDataReader 获取查询结果

Get query result from NpgsqlDataReader

这是我的功能:

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());
}

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

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

替换

 NpgsqlDataReader reader = cmd.ExecuteReader();

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

nbCertByExercice  = (Int32) cmd.ExecuteScalar();

当你有行要控制时,你应该使用reader,executeScalar to take the first value of the first column of the query, executenonquery用于插入、删除等操作

更新

查看 documentation,您可以看到 COUNT 的 return 类型是 int 而不是 INt32。当你表演

reader.GetInt32(0);

你得到 InvalidCastException 因为它没有进行类型的显式转换 (refer here)。

The exception that is thrown for invalid casting or explicit conversion.

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

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