Я ненавижу иметь дело со слоем доступа к данным, который не гарантирует мне стандартный набор результатов: любой данный запрос SQL или хранимая процедура должны всегда возвращать одну и ту же схему набора результатов. Работать с пустыми наборами (или DataTables) легко. Работа с произвольными пропущенными ссылками на объекты ... не так много.
Правильный ответ - исправить код доступа к данным, чтобы он возвращал согласованную схему.
В противном случае, если мне приходится иметь дело с таким кодом, я делаю что-то вроде этого:
DataSet ds = ExecuteStoredProcedure();
DataTable dt = ( ds != null && ds.Tables != null ? ds.Tables[0] : null ) ;
DataRow dr = ( dt != null && dt.Rows != null ? dt.Rows[0] : null ) ;
object o = ( dr != null ? dr["someColumn"]) : null ) ;
string someColumn = (string) colName ;
Легко отлаживать либо в отладчике, либо через логирование. Дайте набор из 5 значений, вы можете легко увидеть, что присутствовало, а что отсутствовало. Это позволяет легко увидеть, какое предположение (ограничение?) Было нарушено.