1

这是我的功能:

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

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

4

1 回答 1

2

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

代替

 NpgsqlDataReader reader = cmd.ExecuteReader();

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

nbCertByExercice  = (Int32) cmd.ExecuteScalar();

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

更新

查看文档,您可以看到COUNTisint和 not的返回类型INt32。当你表演

reader.GetInt32(0);

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

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

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

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

于 2015-01-03T15:44:16.810 回答