Ошибка DataReader при использовании во второй раз - PullRequest
0 голосов
/ 06 февраля 2019
var filterConditions = new[] {
       CreateSqlFilter("CIVILIDD", ID_No, selectCommand, false),


};

        string filterCondition = filterConditions.Any(a => a != null) ? filterConditions.Where(a => a != null).Aggregate((filter1, filter2) => String.Format("{0} AND {1}", filter1, filter2)) : (string)null;

        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["my"].ConnectionString))
        {
            selectCommand.Connection = connection;
            selectCommand.CommandText = filterCondition == null ? "SELECT * FROM _4" : "SELECT * FROM _4 WHERE " + filterCondition;
            connection.Open();
            SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
            DataTable dataSource = new DataTable();
            adapter.Fill(dataSource);
            dataGridView2.DataSource = dataSource;

            using (SqlCommand command2 = new SqlCommand("SELECT * FROM [_4] WHERE CIVILIDD = @id", mycon))
            {

                command2.Parameters.AddWithValue("@id", ID_No.Text);

                SqlDataReader dr = command2.ExecuteReader();





                while (dr.Read())
                {

                    txtname1.Text = (dr["name1"].ToString());
                    txtname2.Text = (dr["name2"].ToString());
                    Governorate.Text = (dr["Governorate"].ToString());
                    City.Text = (dr["City"].ToString());
                    Block.Text = (dr["Block"].ToString());
                    Street.Text = (dr["Street"].ToString());
                    Avenue.Text = (dr["Avenue"].ToString());
                    House.Text = (dr["House"].ToString());
                    Floor.Text = (dr["Floor"].ToString());
                    flat.Text = (dr["flat"].ToString());
                }
            }

        }

я использую этот код для фильтрации своей базы данных, и я получаю эту ошибку, когда я запускаю ее в первый раз, когда она работает хорошо, во второй раз я получаю эту ошибку

System.InvalidOperationException: 'Уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым.'

в этой строке SqlDataReader dr = command2.ExecuteReader ();

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вам нужно будет закрыть область данных после ее использования.

Вот так должен выглядеть ваш код, когда вы не используете Using()

Просмотрите комментарий, чтобы понять

var filterConditions = new[] {
       CreateSqlFilter("CIVILIDD", ID_No, selectCommand, false),


};

        string filterCondition = filterConditions.Any(a => a != null) ? filterConditions.Where(a => a != null).Aggregate((filter1, filter2) => String.Format("{0} AND {1}", filter1, filter2)) : (string)null;

        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["my"].ConnectionString))
        {
            selectCommand.Connection = connection;
            selectCommand.CommandText = filterCondition == null ? "SELECT * FROM _4" : "SELECT * FROM _4 WHERE " + filterCondition;
            connection.Open();
            SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
            DataTable dataSource = new DataTable();
            adapter.Fill(dataSource);
            dataGridView2.DataSource = dataSource;

            using (SqlCommand command2 = new SqlCommand("SELECT * FROM [_4] WHERE CIVILIDD = @id", mycon))
            {

                command2.Parameters.AddWithValue("@id", ID_No.Text);

                SqlDataReader dr = command2.ExecuteReader();





                while (dr.Read())
                {

                    txtname1.Text = (dr["name1"].ToString());
                    txtname2.Text = (dr["name2"].ToString());
                    Governorate.Text = (dr["Governorate"].ToString());
                    City.Text = (dr["City"].ToString());
                    Block.Text = (dr["Block"].ToString());
                    Street.Text = (dr["Street"].ToString());
                    Avenue.Text = (dr["Avenue"].ToString());
                    House.Text = (dr["House"].ToString());
                    Floor.Text = (dr["Floor"].ToString());
                    flat.Text = (dr["flat"].ToString());
                }
                 // Close and Dispose the datareader
                 dr.Close();
                 dr.Dispose();
            }

        }
0 голосов
/ 06 февраля 2019

Вы должны утилизировать первый накопитель данных, созданный адаптером.Оператор using позаботится об удалении ресурсов из коробки.

Вы можете использовать связывание считывателя данных только с одной командой (так же, как и в случае ошибки).Создайте 2 с помощью операторов и подготовьте 2 читателя данных.Это может быть то же самое, используя (соединение), поскольку соединение может использоваться для нескольких команд, но для каждой команды необходимо иметь отдельные устройства чтения данных.

using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c))
{
}

using( ..command2.. )
{
 SqlDataReader dr = command2.ExecuteReader();
}

Подробнее об этом ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...