May be my sugestion is not the perfect but I think it will help resolve your issue in this scenario.
When you expect a single value to be returned from the database, the best method to use is
ExecuteScalar(). I believe, for a single value to be retrived fro the databasem it internally works same as datareader.
Replace all those relevant code blocks with
ExecuteScalar() and should be handle the concurrent reads as the connection gets closed automatically. Just leave the INSERT part as it is.
Reference:
Quote:
Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations that you need to generate the single value using the data returned by a SqlDataReader.
SqlCommand.ExecuteScalar Method (System.Data.SqlClient)[
^]
If you still find problem, please let me know the issue. :)