Member 12735615 Ответов: 2

Недопустимая попытка доступа к полю перед вызовом read() почему я получаю эти ошибки


Почему именно я получаю эти ошибки? Я не могу получить информацию из базы данных

И я получаю эту ошибку исключения :

Invalid attempt to access a field before calling Read()


Мой код выглядит так

private void button1_Click(object sender, EventArgs e)
{
    string constring = ConfigurationManager.ConnectionStrings["MySQLDatabaseConnection"].ConnectionString;
    string query = "select * from vms_db.final_appointments where visitor_name = '"+visitor_name.Text+"'";
    using (MySqlConnection con = new MySqlConnection(constring))
    {
        con.Open();
        try
        {
            using (MySqlCommand cmd = new MySqlCommand(query, con))
            {
                using (MySqlDataReader rdr = cmd.ExecuteReader())
                {
                    try
                    {
                        visit_date.Text = (rdr["visit_date"].ToString()); <-----Error on this Line
                        visitor_name.Text = (rdr["visitor_name"].ToString());
                        organization.Text = (rdr["organization"].ToString());
                        city.Text = (rdr["city"].ToString());
                        signin_time.Text = (rdr["signin_time"].ToString());
                        vehicle_number.Text = (rdr["vehicle_number"].ToString());
                        visit_type.Text = (rdr["visit_type"].ToString());
                        reason.Text = (rdr["reason"].ToString());
                        id_type.Text = (rdr["id_type"].ToString());
                        person_visit.Text = (rdr["person_visit"].ToString());
                        byte[] imagebyte = (Byte[])(rdr["passport"]);
                        MemoryStream ms = new MemoryStream(imagebyte);
                        pictureBox1.Image = Image.FromStream(ms);
                        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                        this.pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }

            }
            con.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}


Что я уже пробовал:

Удаление и замена этой линии
visit_date.Text = (rdr["visit_date"].ToString())
; все еще дает ошибку.

2 Ответов

Рейтинг:
13

Karthik_Mahalingam

добавить это

if (rdr.Read()) // read
{
visit_date.Text = (rdr["visit_date"].ToString()); 
.
.
.


относиться Класс sqldatareader.Метод Чтения (System. Data.SqlClient)[^]


CHill60

Мой 5-й-ты меня опередил. Это не похоже на то, что сообщение об ошибке сообщило оператору, что было не так :-)

Karthik_Mahalingam

Спасибо Chill60

Рейтинг:
1

OriginalGriff

SqlDataReader возвращает данные по строке за раз, и он знает только, когда "изменить строку", когда вы явно говорите ему сделать это, вызывая Read:

using (MySqlDataReader rdr = cmd.ExecuteReader())
{
    try
    {
        if (rdr.Read())
        {
            visit_date.Text = (rdr["visit_date"].ToString());
Метод Read извлекает следующую строку и возвращает true, если она доступна.

Но не делай этого так!
Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку с точки зрения SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x'; DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?