这是我的功能:
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类型相同的问题!!
我该怎么做才能直接获得该字段的类型?
答案 0 :(得分:1)
为什么不在查询中使用ExecuteScalar?
替换
NpgsqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
nbCertByExercice = reader.GetInt32(0);
}
与
nbCertByExercice = (Int32) cmd.ExecuteScalar();
当你要控制行时,你应该使用阅读器,executeScalar获取查询第一列的第一个值,executenonquery进行插入,删除等操作
<强>更新强>
查看documentation,您可以看到COUNT
的返回类型为int
而非INt32
。当你执行
reader.GetInt32(0);
你得到InvalidCastException,因为它没有显式转换类型(refer here)。
无效转换或显式引发的异常 转换。
否则,当您执行Int32.Parse
时,它总是尝试转换,如果失败则会产生异常。
在您的情况下,该值始终有资格转换为int32,但由于不同类型,reader.GetInt32
无法知道;在另一边Int32.Parse
进行尝试并且成功。