从NpgsqlDataReader获取查询结果

时间:2015-01-03 15:21:45

标签: c# dbdatareader

这是我的功能:

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类型相同的问题!!
我该怎么做才能直接获得该字段的类型?

1 个答案:

答案 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进行尝试并且成功。