从 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
尝试并成功。
这是我的功能:
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
尝试并成功。