You need to match the names of your columns with the names you access they with from the DataReader:
select EmpId,Name,Gender,MobileNumber,Dateofjoining,[Address] from tblEmployee
Does not match the column names with the code:
emp.Id = Convert.ToInt32(dr["Id"]);
emp.name = dr["Name"].ToString();
emp.gender = dr["Gender"].ToString();
emp.mobile = dr["Mobile"].ToString();
emp.doj = Convert.ToDateTime(dr["doj"]);
So try:
emp.Id = Convert.ToInt32(dr["EmpId"]);
emp.name = dr["Name"].ToString();
emp.gender = dr["Gender"].ToString();
emp.mobile = dr["MobileNumber"].ToString();
emp.doj = Convert.ToDateTime(dr["DateofJoining"]);
And by preference, don't use Convert or ToString: cast it instead:
emp.Id = (int) dr["EmpId"];
emp.name = (string) dr["Name"];
emp.gender = (string) dr["Gender"];
emp.mobile = (string) dr["MobileNumber"];
emp.doj = (DateTime) dr["DateofJoining"];
Using Convert and ToString implies that you have stored the values in your DB as strings instead of the "proper" datatypes - which would give you enormous problems later on.