C # Могу ли я сделать (SqlDataReader) в состоянии паузы? - PullRequest
0 голосов
/ 29 октября 2018

Я получаю эту ошибку:

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

Это мой код:

String sql_get_completed_tasks = "select * from tasks where Ending_date is not null order by Ending_date asc";
SqlCommand command_get_completed_tasks_ = new SqlCommand(sql_get_completed_tasks, cn);

SqlDataReader reader = command_get_completed_tasks_.ExecuteReader();

while (reader.Read())
{  
    String sql_insert_completed_tasks_toTheNewTable = "insert into history_of_tasks_achievements values ("+
                reader[1] +" , N'"+ reader[2]+"' , @image , N'"+ reader[4] +"' , N'"+reader[5]+"' , N'"+ reader[6]+"' , "+
                reader[7] +" , N'"+reader[8]+"' , N'"+reader[9] +"' , "+reader[10]+" , @start_date , @end_date , "+reader[13]+
            ")";

    SqlCommand com_insert_completed_tasks_toTheNewTable = new SqlCommand(sql_insert_completed_tasks_toTheNewTable, cn);

    com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@image", reader[3]));
    com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@start_date", reader[11]));
    com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@end_date", reader[12]));

    com_insert_completed_tasks_toTheNewTable.ExecuteNonQuery();
}    // end of while loop

reader.Close();

MessageBox.Show("Done");

Чтобы пропустить эту ошибку, можно ли создать паузу или закрыть для SqlDataReader, а затем заново открыть из значений прерывания? Какое лучшее решение?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

На самом деле это должен быть только 1 оператор, нет необходимости перебирать результаты из select, просто чтобы отправить их обратно в ту же базу данных, используя insert.

const string sqlInsert = 
@"INSERT INTO [history_of_tasks_achievements] (col1, col2, col3, ...) 
SELECT col1, col2, col3, ... FROM [tasks] WHERE [Ending_date] IS NOT NULL ORDER BY [Ending_date] ASC";

using(var con = new SqlConnection("connection string here"))
using(var command = new SqlCommand(sqlInsert, con))
{
  con.Open();
  var inserted = command.ExecuteNonQuery();
}

Обязательно выровняйте столбцы между SELECT и INSERT, чтобы они совпадали.

0 голосов
/ 29 октября 2018

В этом случае вы можете использовать оператор using.

// set up connection, command

using (var reader = command_get_completed_tasks_.ExecuteReader())
{
    // do the reader stuff
    reader.Close();
}

// Done
...