A sql query returns rows. Each row has columns. The order of the columns depends on the select query. The column data type is dependent on the data type of the column in the select.
when you call a stored proc, it can return a single integer return value available after all the result sets for that query have been processed. The name of this parameter is defined by the caller (your code), the parameter direction property defines the return value parameter. Only a parameter of type return value is updated by the query. The rest are read only and are unmodified by calling the query.
ExecuteNonQuery() is used when your code does not need any of the row data returned. It will read any rows and toss the results. After calling ExecuteNonQuery() you can access the return value.
you current code runs an undefined query (command text is not set) and reads the first 3 column which must exist and be ints. Then it runs the query again and accesses the return value, and the parameter values set previously in the code.
generally return values are only used to return a stored proc completion status and are only available if the query is a stored proc call.
if the customer query is a returning one data row, it very likely they are not returning a stored proc return value also.
while the name of the column is not important, you need the column number and datatype of each column to read. If they just give you the column names and datatype you will need to use the columns collection to map the column name to column number.