Look at your code:
string a = oReader["EmplyeeName"].ToString();
string b = oReader["DOB"].ToString();
string c = oReader["Email"].ToString();
string d = oReader["Mobile"].ToString();
The reader will continue to return rows until there are no more left, so the loop will process all the rows. But ... inside the loop, you overwrite the previous row's content each time with the current rows - and then you discard even that because
are all "local" to the loop and go out of scope at the end and can no longer be accessed.
So even if you did move the definitions of those four variables outside the loop so they could be accessed later, they would only ever contain the final row's values!
Either use a collection and add your into it inside the loop, use a DataTable and a DataAdapter instead of a DataReader, or modify your SELECT statement to return on the row you are interested in.