Вы показываете div детали при наведении на изображение, но p внутри все еще скрыто. Переместить отображение: нет с p на .box .details.
Старайтесь избегать использования таких читателей, как это:
SqlConnection connection = new SqlConnection("connection string");
SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection);
SqlDataReader reader = cmd.ExecuteReader();
connection.Open();
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
reader.Close(); // <- too easy to forget
reader.Dispose(); // <- too easy to forget
connection.Close(); // <- too easy to forget
Вместо этого заключите их в операторы using:
using(SqlConnection connection = new SqlConnection("connection string"))
{
connection.Open();
using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
} // reader closed and disposed up here
} // command disposed here
} //connection closed and disposed here
Использование оператор обеспечит правильную утилизацию объекта и освобождение ресурсов.
Если вы забудете, то оставляете уборку на сборщике мусора, что может занять некоторое время.
Обратите внимание, что удаление SqlDataReader, созданного с помощью SqlCommand.ExecuteReader (), не не закроет / удалит базовое соединение.
Существует два общих узоры. В первом случае считыватель открывается и закрывается в пределах объема соединения:
using(SqlConnection connection = ...)
{
connection.Open();
...
using(SqlCommand command = ...)
{
using(SqlDataReader reader = command.ExecuteReader())
{
... do your stuff ...
} // reader is closed/disposed here
} // command is closed/disposed here
} // connection is closed/disposed here
Иногда удобно, чтобы метод доступа к данным открывал соединение и возвращал считыватель. В этом случае важно, чтобы возвращаемый читатель был открыт с помощью CommandBehavior. CloseConnection, так что закрытие / удаление считывателя закроет основное соединение. Шаблон выглядит примерно так:
public SqlDataReader ExecuteReader(string commandText)
{
SqlConnection connection = new SqlConnection(...);
try
{
connection.Open();
using(SqlCommand command = new SqlCommand(commandText, connection))
{
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
catch
{
// Close connection before rethrowing
connection.Close();
throw;
}
}
и вызывающему коду просто нужно расположить читателя таким образом:
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
} // reader and connection are closed here.
Чтобы быть в безопасности, оберните каждый объект SqlDataReader в используя оператор .
Просто оберните ваш SQLDataReader оператором using. Это должно решить большинство ваших проблем.