На второй странице вы проверяете переменную строки запроса перед добавлением строки в dtBooks:
if (Request.QueryString["bookID" + id] != null)
Однако вы не передаете никаких строк запроса при перенаправлении:
Response.Redirect("SecondPage.aspx");
Я бы подумал, что вы изначально пытались использовать строку запроса для передачи идентификаторов, прежде чем перейти к сеансу, и вы не обновили весь свой код.
Я немного обеспокоен кодом вашей первой страницы. Вы понимаете, что будете перенаправлять на вторую страницу всякий раз, когда появляется сообщение? Это означает, что независимо от того, какие кнопки / элементы управления у вас есть на первой странице, если они отправляют обратно по какой-либо причине, вы будете перенаправлены на вторую страницу.
РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИЙ
Если вы не используете строку запроса, не используйте строку запроса:
foreach (int id in list)
{
DataRow row;
row = dtBooks.NewRow();
row["ID"] = id;
dtBooks.Rows.Add(row);
}