Получить результат запроса из 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());
                }

работает отлично!!
и та же проблема с типом dateTime!!
Что я должен сделать, чтобы получить непосредственно тип поля?

1 ответ

Решение

Почему вы не используете ExecuteScalar для вашего запроса?

замещать

 NpgsqlDataReader reader = cmd.ExecuteReader();

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

с

nbCertByExercice  = (Int32) cmd.ExecuteScalar();

Вы должны использовать Reader, когда у вас есть строки для управления, executeScalar, чтобы получить первое значение первого столбца запроса, Executenonquery для таких операций, как Вставка, удаление

ОБНОВИТЬ

Глядя на документацию, вы можете увидеть, что тип возвращаемого значения COUNT является int и не INt32, Когда вы выполняете

reader.GetInt32(0);

вы получаете InvalidCastException, потому что он не выполняет явное преобразование типа ( см. здесь).

Исключение, которое выдается за недопустимое приведение или явное преобразование.

в противном случае, когда вы выполняете Int32.Parse он всегда пытается конвертировать, и если это не удается, выдает исключение.

В вашем случае значение всегда может быть преобразовано в int32, но reader.GetInt32 не может знать из-за разных типов; на другой стороне Int32.Parse делает попытку, и это успешно.

Другие вопросы по тегам