BlackJack99 Ответов: 5

получить целочисленное значение с помощью sqldatareader?


Привет, я пытаюсь прочитать целочисленное значение из базы данных, вот мой код:

string query = "SELECT SUM(amount) FROM rec_stats WHERE material=0";
            SqlCommand cmd = new SqlCommand(query, con);
            SqlDataReader reader = null;
            try
            {
                reader = cmd.ExecuteReader();
                reader.Read();
            }
            catch (Exception e)
            {
                MessageBox.Show("! " + e.ToString());
            }
            txtbx.Text = reader[0].ToString();
            try
            {
                Q = reader.GetInt32(0);
            }
            catch (Exception x)
            {
                MessageBox.Show("### " + x.ToString());
            }
            reader.Close();



строка подключения определена ранее, и Q-это целое число, оно продолжает выбрасывать исключение в Q = reader.GetInt32(0);

что я сделал не так?

Ankit Rajput

Не могли бы вы сообщить подробности исключения?

BlackJack99

Система.Которого вызывается invalidcastexception: заданное приведение является недопустимым.
в System.Data.SqlClient.SqlBuffer.get_Int32()
в системе.Данных.Sqlclient как.Класс sqldatareader.GetInt32(Int32 i)
в RecyclingStats.Главное окно.ShowAll()

5 Ответов

Рейтинг:
37

Mahendra.p25

попробуйте найти это таким образом

objReader = objCommand.ExecuteReader();
            while (objReader.Read())
            {
                objProduct = new ProductMasterClass();
                objProduct.pid = int.Parse(objReader["product_id"].ToString());
                objProduct.icatid = int.Parse(objReader["cat_id"].ToString());
             }


BlackJack99

спасибо, это работает

Рейтинг:
2

Tarun.K.S

Используйте его вот так :

try
            {
                reader = cmd.ExecuteReader();
                while(reader.Read())   // This is how record is read. Loop through the each record
                {
                    Q = int.Parse(reader["YourColumnName"]);
                    txtbx.Text = reader["YourColumnName"].ToString(); 
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("! " + e.ToString());
            }
            finally
            {
               reader.Close();

}


Tarun.K.S

Ой, кажется, другие уже ответили на него.

BlackJack99

в любом случае спасибо за намерение, :)

Tarun.K.S

Ohkay нет проблем! Рад, что вы смогли ее решить.

Рейтинг:
2

Ankit Rajput

Привет,

В этом случае, пожалуйста, проверьте тип данных поля сумма.
Это может быть что-то вроде поплавка.

Вполне возможно, что sum(сумма) возвращает некоторое плавающее значение.

Пожалуйста, проверьте это.

С уважением
Анкит


BlackJack99

я убедился, что это целое число, оно работает с помощью функции синтаксического анализа ниже, в любом случае спасибо, :)

Рейтинг:
1

Wayne Gaylard

Попробовать это :

string query = "SELECT SUM(amount) FROM rec_stats WHERE material=0";
            SqlCommand cmd = new SqlCommand(query, con);
            SqlDataReader reader = null;
            int myInt = 0;
            try
            {
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                   myInt = reader.GetInt32(0);
                }
                reader.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show("! " + e.ToString());
            }
            txtbx.Text = myInt.ToString();


Вы можете считывать значения считывателя только во время его циклического просмотра, в цикле while.

Надеюсь, это поможет


Ankit Rajput

Привет Уэйн,

Вы уверены, что мы не можем использовать ридер без езды на велосипеде?

С уважением
Анкит

Wayne Gaylard

А как же иначе?

BlackJack99

я думаю, что мы можем, так как я запрос должен возвращать только 1 строку, :)

в любом случае спасибо за помощь,

Рейтинг:
1

Member 14117526

String sql = "Select Id From TblCategories Where CategoryName Like '%" + P.Title + "%'";
            DataTable table = new DataTable();
            SqlConnection con = new SqlConnection(mycon);
            SqlCommand cmd = new SqlCommand(sql,con);
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            table.Load(reader);
            int catid = Convert.ToInt32(table.Rows[0]["Id"]);
            return catid;


CHill60

Причины моего понижения голоса:
1. ОП пытался прочитать целочисленное значение из sql-запроса. Нет абсолютно никакой необходимости загрузить модуль чтения данных в DataTable для того, чтобы добиться этого.
2. Вы ввели риск атак путем внедрения кода SQL. Никогда не создавайте SQL-строки путем объединения строк. Видеть SQL-инъекция - OWASP[^]
3. Вы даже не потрудились использовать тот же SQL-запрос, который опубликовал ОП
4. Вы используете Convert.ToInt32 в то время как OP подтвердил 8 лет назад, что гораздо более надежный int.Parse действительно работает.