Mam ten kod starszego typu:Błąd „Nie ma już otwartą DataReader skojarzony z tym poleceniem, które muszą być zamknięte pierwszy”, gdy za pomocą 2 różnych poleceń
private void conecta()
{
if (conexao.State == ConnectionState.Closed)
conexao.Open();
}
public List<string[]> get_dados_historico_verificacao_email_WEB(string email)
{
List<string[]> historicos = new List<string[]>();
conecta();
sql =
@"SELECT *
FROM historico_verificacao_email
WHERE nm_email = '" + email + @"'
ORDER BY dt_verificacao_email DESC, hr_verificacao_email DESC";
com = new SqlCommand(sql, conexao);
SqlDataReader dr = com.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
string[] dados_historico = new string[6];
dados_historico[0] = dr["nm_email"].ToString();
dados_historico[1] = dr["dt_verificacao_email"].ToString();
dados_historico[1] = dados_historico[1].Substring(0, 10);
dados_historico[2] = dr["hr_verificacao_email"].ToString();
dados_historico[3] = dr["ds_tipo_verificacao"].ToString();
sql =
@"SELECT COUNT(e.cd_historico_verificacao_email) QT
FROM emails_lidos e
WHERE e.cd_historico_verificacao_email =
'" + dr["cd_historico_verificacao_email"].ToString() + "'";
tipo_sql = "seleção";
conecta();
com2 = new SqlCommand(sql, conexao);
SqlDataReader dr3 = com2.ExecuteReader();
while (dr3.Read())
{
//quantidade de emails lidos naquela verificação
dados_historico[4] = dr3["QT"].ToString();
}
dr3.Close();
conexao.Close();
//login
dados_historico[5] = dr["cd_login_usuario"].ToString();
historicos.Add(dados_historico);
}
dr.Close();
}
else
{
dr.Close();
}
conexao.Close();
return historicos;
}
stworzyłem dwa oddziela polecenia do skorygowania problem, ale nadal trwa: "Istnieje już otwarty obiekt DataReader skojarzony z tym rozkazem, który musi najpierw zostać zamknięty".
Dodatkowe informacje: ten sam kod działa w innej aplikacji.
Masz podatność na atak SQL injection. – SLaks
możliwy duplikat [Istnieje już otwarty obiekt DataReader powiązany z tym poleceniem, który musi zostać najpierw zamknięty] (http://stackoverflow.com/questions/6062192/there-is-already-an-open-datareader-associated-with- this-command-which-must-be-c) –
To nie tylko polecenie, tylko połączenie. Jeśli używasz tego samego połączenia dla obu poleceń, pojawi się błąd. –